java基础-IO流
IO原理及流的分类:
文件流:FileInputStream / FileOutputStream / FileReader / FileWriter (除了这四个是节点流,其他都是处理流)
缓冲流:BufferedInputStream / BufferedOutputStream / BufferedReader / BufferedWriter
转换流:InputStreamReader / OutputStreamWriter
标准输入/输出流:System.in / System.out
打印流:PrintStream / PrintWriter
数据流:DataInputStream / DataOutputStream
对象流:ObjectInputStream / ObjectOutputStream
随机存取文件流:RandomAccessFile
1. File对象不仅可以表示一个文件,也可以表示一个文件目录
文件可以删除,创建,重命名等等表面信息(不可以修改内容,修改由IO来完成),文件目录可以创建目录,获取文件目录下的所有文件。
2. 流分类:如果是尚硅谷课程的示意图
按操作数据单位不同分为:字节流(8 bit)(图片,音频,视频等),字符流(16 bit) (文本文件)
按数据流的流向不同分为:输入流,输出流
按流的角色的不同分为:节点流(直接作用于文件),处理流(包含着节点流或者处理流,间接)


3.FileIputStream,FileOutStream,Reader,Writer
伪代码:
//内容为abc的txt文件,读取并创建对象
File file = new File("D:/hello.txt");
//创建文件输出字节流(字符不可读取)
FileInputStream fis = new FileInputStream(fis);
//read()方法
int b =0 ;
//读取一个字节,并返回给b,返回的b是txt文件字节的ascii码
while((b=fis.read())!=-1){//如果读到结尾,没有字节了,就会返回-1
System.out.print(b);
}
//read(byte[] byte)方法
int len;//每次写入byte缓冲区的字节总数
byte[] by = new byte[20];//读取到这个数组中
while((len=fis.read(by))!=-1){//如果读到结尾,没有字节了,就会返回-1
System.out.print(len);//如果有22个字节,输出202
}
复制文件伪代码:
File filein = new File("in.txt");
File fileout = new File("out.txt");
FileInputStream fis = new FileInputStream(filein);
FileOutputStream fos = new FileOutputStream(fileout);
byte[] b = new byte[20];
int len;
while((b = fis.read(b)) != -1){
fos.write(b,0,len);
//不可以写成:fos.write(b);
}
fos.close();
fis.close();
4. 缓冲流:BufferedInputStream,BufferedOutputStream,BufferedReader,BufferedWriter (加一层缓冲流,让速度更快)
缓冲流实现文件复制伪代码:
public void copy(){
//1.读入写出文件
File filein = new File("in.txt");
File fileout = new File("out.txt");
//2. 创建相应的流
//先创建节点流
FileInputStream fis = new FileInputStream(filein);
FileOutputStream fos = new FileOutputStream(fileout);
//将创建的节点流传给缓冲流
BufferedInputStream bis = new BufferedInputStream(fis);
BufferedOutputStream bos = new BufferedOutputStream(fos);
//3.实现复制
byte[] b = new byte[1024];
int len;
while((len = bis.read(b)) != -1){
bos.write(b , 0 , len);
}
//4.关闭流
bos.close();
bis.close();
}
缓冲流区别:1.字节流每一次读取都是一次IO操作,频繁的IO操作让整个复制过程效率变低;
2.给字节流套上一个缓冲流,相当于每次读取或者写出都将内容放到了一个Buffered缓冲区中,缓冲区满了一次性读取或者写入,完成一次IO操作,效率要高。
5.转换流:InputStreamReader,OutputStreamWriter
注意:InputStreamReader是输入字节流转换成字符流
OutputStreamWriter是输出字符流转换成字节流
public void tranfer(){
//InputStreamReader OutputStreamWriter
File file = new File("a.txt");
FileInputStream fis = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(fis,"GBK");
BufferedReader br = new BufferedReader(isr);
//至此完成了字节流到字符流的转换
File file1 = new File("b.txt");
FileOutputStream fos = new FileOutputStream(file1);
OutputStreamWriter osw = new OutputStreamWriter(fos,"GBK");
BufferedWriter bw = new BufferedWriter(osw);
}
6.标准输入输出流System.in System.out
public void standinout(){
InputStream is = System.in;
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String str;
while(true){
System.out.println("请输入:");
str = br.readLine();
if(str.equalsIgnoreCase("e") || str.equalsIgnoreCase("exit")){
break;
}
//转换成大写
System.out.println(str.toUpperCase());
}
}
7. 打印流
8. 数据流(操作java的基本数据类型)
9. 对象流(操作java的对象)
对象序列化机制:允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上,或通过网络将这种二进制流传输到另一个网络节点。当其它程序获取了这种二进制流,就可以恢复成原来的Java对象。
优点:可将任何实现了Serializable接口的对象转化为字节数据,使其在保存和传输时可被还原。
10. 随机存取文件流 RandomAccessFile(可以读取文件的任意一部分,尾部添加内容,但是却不用占太多内存,对于大文件添加内容来说相当实用)
public void addtxt(){
//创建对象
RandomAccessFile raf=new RandomAccessFile("a.txt", "rw");
//将记录指针移动到文件最后
raf.seek(raf.length());
//追加内容
raf.write("suffix".getBytes());
}

浙公网安备 33010602011771号