3、IO流之字节流和字符流

48 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

1、IO流是做什么的?

2、IO的分类:

       按流向分:可以分成读和写
       
      
       按类型分,可分为字符流和字节流

3、IO流的体系结构:

image.png

4、字节流写出数据:FileOutputStream

 //1、创建字节输出流对象
FileOutputStream fileOutputStream=new FileOutputStream("a.txt");

//2、写出数据
fileOutputStream.write(97);
fileOutputStream.write(98);
fileOutputStream.write(99);

fileOutputStream.write("罗兆你要自强".getBytes(StandardCharsets.UTF_8));

//3、关闭流,释放资源。
fileOutputStream.close();

image.png

4.1、FileOutputStream的构造方法

image.png 4.2 FileOutputStream的成员方法

image.png

image.png 4.3 字节流写时候-换行操作

window:系统下 \r\n、\r、\n 3种方式(推荐使用\r\n,因为另外2种换行符可能不适用于Win7、Win8)

mac:\r

linux:\n

5、字节输入流(读取)FileInputStream

5.1 一次读取一个字节

image.png 5.2 构造方法

image.png

5.3 返回-1说明读取到行尾了,所以只要返回的不是-1就可以继续读。

image.png

5.4 字节流循环读取

  FileInputStream fis=new FileInputStream("a.txt");
    int i;
while ((i=fis.read())!=-1){
    System.out.println(i);
}

image.png

5.5 数组拷贝 读取-写出

  FileInputStream fis=new FileInputStream("D:\learing\test.mp4");

  FileOutputStream fos=new FileOutputStream("test2.mp4");

  byte[] bys=new byte[1024];

  int len;

  while ((len=fis.read(bys))!=-1){
    fos.write(bys,0,len);
}

  fis.close();
  fos.close();

5.6 根据数组的长度,决定一次读取多少字节,并把读取到数据存到数组中。

5.6.1

image.png

FileInputStream fis=new FileInputStream("a.txt");
byte[] bys=new byte[3];
int read = fis.read(bys);
System.out.println(read);
System.out.println(Arrays.toString(bys));

5.6.2

image.png

  FileInputStream fis=new FileInputStream("a.txt");
  byte[] bys=new byte[3];
int len;//记录读取数据的位置
while ((len= fis.read(bys))!=-1){
    String str=new String(bys,0,len);
    System.out.println(str);
}

6、字符流

字符流=字节流+编码表

当我们调用read 方法 读取字符的时候 实际上,底层会先读取到(一个字节) 判断这个字节是否为负数(中文字符,字节的第一个,肯定是负数)

你:-74 -73 -72

第一次读取到的是-74,就可以判断,读取的内容是中文了

是中文的话,再结合平台默认编码表,决定继续读取多少字节

UTF-8,读取3个字节--->转换为中文的汉子

如果读取到的字节,是正数,就直接读取一个字节,然后转换。

image.png

6.1 拷贝一个大文本文件

image.png

7、字节流和字符流的区别

7.1、创建的数组类型不一样 7.2 字节流写出的数据,就算没有关闭流,数据也会写出。字符流不会。 7.3 字符流写出数据可以直接写出字符串。 7.4 字符流只有调了close关闭流后,或者flush 才会把缓冲区刷出。 flush把数据从缓冲区刷到文件中后,还可以继续进行刷出。 但是close后,就不能再进行写出了。