1 IO分类
-
IO流就是一组流动的数据,可以实现数据从一个地方移动到另一个地方
-
IO 表示的InputStream 和 OutputStream , 称为 输入,输出流。 可以实现文件的读写。
-
IO随着关注的特点不同,有不同的分类
-
按照数据流向分类,分为输入流 和 输出流
输入和输出都是以Java程序为基准
-
按照传递的数据类型分类,分为字节流 和 字符流
字符流可以很好的解决中文数据传递的问题
-
按照流的功能分类,分为 节点流 和 过程流
节点流:可以直接与数据源对接。
过程流:从另一个流中获得数据,并对数据进行一些加工和处理
-
2 文件字节输入输出流
-
所有的字节流都继承自 InputSteram 和 OutputStream 抽象类
-
最常用的节点流就是 FileInputStream 和 FileOutputStream 。可以与文件直接实现读写操作
2.1 FileInputStream的使用
创建流对象
FileInputStream fis = new FileInputStream("c:/z/1.txt");
File target = new File("c:/z/1.txt") ;
FileInputStream fis = new FileInputStream(File target);
-
注意:要确保读取的文件存在,否则会抛出FileNotFoundException异常
使用流对象读取文件内容
int count = fis.available(); //获得流管道中字节的数量
//随着节点流创建,文件中的内容就会自动的进入流管道,该数量最开始就是文件的大小
//随着从管道中读取数据,这个字节数量会逐渐变小,直到变成0
int b = fis.read(); //从管道中读取一个字节
//如果管道中没有内容了,读取到的结果是-1
int length = fis.read(byte[]); //每次从管道中读取一组字节,存入指定的byte数组中
//返回此次读取字节的数量
//如果管道中没有任何内容了,length 等于 -1
new String(byte[],start,length) ; //将字节数组中的内容从指定位置开始,将指定长度的内容组成字符串
fis.close(); //关闭流管道
//管道是否关闭,对于业务没有影响
//关闭流可以释放io资源,也可以释放文件资源
2.2 FileOutputStream的使用
创建流对象
FileOutputStream fos = new FileOutpoutStream("c:/z/1.txt");
FileOutputStream fos = new FileOutpoutStream(File target);
FileOutputStream fos = new FileOutpoutStream("c:/z/1.txt",boolean append);
FileOutputStream fos = new FileOutpoutStream(File target,boolean append);
-
注意1:输出流指定的文件如果不存在,会自动创建。但之创建文件不包含文件夹
-
注意2:默认情况下,创建输出流后,会清空文件中的内容,相当于新内容会覆盖旧内容
使用流对象输出数据
fos.write(byte); //向文件中写入一个字节
fos.write(byte[]) ;//向文件中写入一组字节
fos.write(byte[],start,length) ;//将数组中指定范围的内容写入文件
string.getBytes(); //将字符串的内容转换成对应的字节数组形式
fos.close();
扩展
-
作为节点流,随着将数据写入流管道,就会自动的写入文件。
3 字节字符转换流
-
在使用字节流读取文件内容时,如果存在中文,有可能会出现乱码。 使用字符流可以解决乱码问题
-
一个中文字符有可能使用2~4个字节来表示。
如果一个字节一个字节读取,一定会出现乱码
如果使用数组,一组一组的读取字节,有可能出现乱码
-
编码字符集 。 一个中文对应一个字符也就是2个字节,在unicode编码规则下,有一个对应的数字
不同的编码字符集,对同一个unicode数字表示不同,常用的与中文相关的字符集 GBK,UTF-8
GBK就用2个字节表示一个中文
UTF-8用2~4个字节表示中文
-
-
使用字节字符转换流,将字节流管道中的字节按照对应的 编码规则转换成对应的字符
-
字节字符转换流是一个过程流
-
字节字符转换流,属于字符流,所有的字符流都继承Reader和Writer抽象父类
字符输入流
FileInputStream is = new FileInputStream("c:/z/1.txt");
InputStreamReader isr = new InputStreamReader(InputStream is); //默认处理UTF-8字符集
InputStreamReader isr = new InputStreamReader(InputStream is,"GBK");
int c = isr.read(); //读取一个字符,存入int变量中
int length = isr.read(char[]) ;//读取一组字符内容,存入指定的字符数组中,并返回读取的长度
字符输出流
//是否创建文件,是否追加内容由节点流控制
FileOutputStream fos = new FileOutputStream("c:'/z/1.txt");
OutputStreamWriter writer = new OutputStreamWriter(fos); //只能控制字符集
OutputStreamWriter writer = new OutputStreamWriter(fos,"GBK"); //只能控制字符集
writer.write(char);
writer.write(String) ;
writer.flush();//将当前过程流管道中处理后的数据推入节点流,完成最终的写入操作
-
注意1:一般只有在需要更改编码字符集时,才需要使用字符输出流
如果只是输出中文本身的化,不需要是字符流,直接用字节流就可以了
-
注意2:过程流中的数据不会自动存入文件
需要使用flush或close方法,将过程流中处理后的内容,推入节点流,从而写入文件。
4 文件字符流
-
包括FileReader 和 FileWriter
-
表面上,似乎与FileInputStream类似,直接以字符的形式读写文件
-
本质上,与文件读写操作的就是文件字节流,文件字符流的本质是字符转换流
FileReader r = new FileReader("c:/z/1.txt") ;
FileWriter w = new FileWriter("c:/z/1.txt") ;
5 缓冲流
-
包括 BufferedInputStream , BufferedOutputStream , BufferedReader , BufferedWriter
-
读取数据时,会将文件中的输入读入缓冲区,再冲缓冲区读取数据,理论上性能更好
-
写数据时,先将数据写入缓冲区,再将缓冲区中的数据一次性写如文件,理论上速度更快
FileReader r = new FileReader("c:/z/1.txt") ;
BufferedReader br = new BufferedReader(r);
BufferedReader br = new BufferedReader(r,size); //设置缓冲区大小
FileWriter w = new FileWriter("c:/z/1.txt");
BufferedWriter bw = new BufferedWriter(w);
BufferedWriter bw = new BufferedWriter(w,size);//设置缓冲区大小
-
注意1:字符缓冲输入流,有一个特殊方法,br.readLine() 一次性读取一行字符串内容
底层默认以\r\n为拆分标准
-
注意2:缓冲流底层使用数组来实现数据的缓冲。在创建缓冲流对象时,可以指定数组长度
默认缓冲大小8kb
-
注意3:对于缓冲输出流而言,当缓冲的数据超过缓冲区时,会自动推入节点流
缓冲区满了,会自动推出
写入的数据超出缓冲区的范围,不会缓冲,直接写入节点流
6 打印流
-
本质就是输出流,没有对应的输入流
-
PrintStream , PrintWriter
-
相比于普通的输出流,就是多了一些带换行打印println,带格式化打印printf,针对于不同数据类型的重载方法
FileOutputStream fos = new FileOutputStream("c:/z/1.txt") ;
PrintStream p = new PrintStream( fos );
FileWriter writer = new FileWriter("c:/z/1.txt");
PrintWriter pw = new PrintWriter(writer);
p.print();
p.println();
p.printf();
System.out 也是一个打印流,默认负责向控制台打印
-
我们可以更换这个打印流,使其向文件中打印
System.setOut(PrintStream)
7 数据流
-
是过程流,是字节流,包括 DataInputStream , DataOutputStream
-
主要作用是读写基本类型的数据
-
使用普通的字节流输出97,最终输出的是1个字节
-
使用Data数据流输出97,最终输出的是4个字节
-
-
提供了一组读写不同基本数据类型的方法
FileOutputStream fos = new FileOutputStream("c:/z/1.txt");
DataOutputStream dos =new DataOutputStream(fos);
dos.writeInt(i);
dos.writeDouble(i);
dos.writeFloat(i);
dos.flush();
FileInputStream fis = new FileInputStream("c:/z/1.txt");
DataInputStream dis = new DataInputStream(fis);
dis.readInt();
dis.readDouble();
dis.readFloat();
8 数组流
-
是一个节点流,直接从数组中读写数据。
-
包括 ByteArrayInputStream , ByteArrayOutputStream , CharArrayReader , CharArrayWriter
byte[] dataSource = "buka is good!!!".getBytes();
ByteArrayInputStream bis = new ByteArrayInputStream(dataSource) ;
ByteArrayOutputStream bos = new ByteArrayOutputStream(0x10);
bos.write(97);
bos.write(98);
bos.write(99);
byte[] bytes = bos.toByteArray();
标签:字符,JAVA,字节,fos,文件,IO,数据流,new,txt
From: https://blog.csdn.net/weixin_53755148/article/details/142513510