天天看点

7.字节流、字符流

字节流

IO流分类和功能:

按照数据流向:输入和输出流(读进来,写出去)

按照数据类型:字节流和字符流

底层原理:一切皆为字节

字节输出流的最高抽象父类:

java.io.OutputStream:是字节输出流的最高抽象父类

其中,常用的方法:

7.字节流、字符流

常用的子类是:java.io.FileOutputStream。

构造方法:

public FileOutputStream(String filename):参数代表文件的路径。

public FileOutputStream(File file):参数代表文件对象。

输入字符串时需要用get.Bytes()方法

追加数据内容:append

7.字节流、字符流

换行

文件换行:\r\n(这两个字符)

Linux换行符:\n(这是一个字符)

7.字节流、字符流

字节输入流的最高抽象父类

java.io.InputStream是字节输入流的最高抽象父类。      
其中定义的常用方法:

public int read():读取单个字节。

public int read(byte[] buf):读取字节数组,返回有效个数。

public void close():关闭流,释放资源。      
常用的子类是:java.io.FileInputStream类。      
构造方法:

public FileInputStream(String filename):参数代表文件路径。

public FileInputStream(File file):参数代表文件对象。      
使用步骤:

1. 创:创建FileInputStream对象,指定文件路径。

2. 读:调用read方法读取字节数据。

3. 关:调用close方法关闭流。      
注意事项:

1. 对于写文件来说,如果不存在则自动创建;对于读文件来说,如果不存在则会发生      
FileNotFoundException。

2. 这个read()每次执行都会尝试读取下一个,如果没有下一个则返回-1值。      
每次循环执行了两次read方法      

read读取字节的方法还有一个重要的重载形式

read(byte[2])

7.字节流、字符流

数组

7.字节流、字符流

复制文件(用字节)

7.字节流、字符流
7.字节流、字符流

改换复制文件方式(用字节数组)

7.字节流、字符流

字符流

  1. Idea工具查看文件与Windows产看的字节大小不一样。

因为编码方式不一样。

  1. 字符流底层
也是字节流,但是还有字节和字符之间的翻译功能。参考的是:ASCII/Unicode。      
  1. 字符读入最高抽象父类reader
java.io.Reader是字符输入流的最高抽象父类。      
  1. 常用方法

    public int read():返回值代表读取的【单个字符】。

    public int read(char[] buf):读取一个字符数组,返回有效个数。

    public void close():关闭流。

7.字节流、字符流
7.字节流、字符流
  1. 常用子类
java.io.FileReader      
  1. 构造方法
public FileReader(String filename):参数代表文件路径名。

public FileReader(File file):参数代表文件对象。      
  1. 注意事项
字符流应该只用来处理纯文本文件,凡是能用Windows默认记事本打开并且正确识别的。      
  1. 字符数组outStream
7.字节流、字符流
  1. 字符读进去最高抽象父类
java.io.Writer是字符输出流的最高抽象父类,其中定义的方法有:

public void write(int ch):写单个字符

public void write(char[] buf):写整个字符数组

public void write(char[] buf, int offset, int length):写字符数组的一部分。

public void write(String str):写整个字符串

public void write(String str, int offset, int length):写字符串的一部分。

public void close():关闭流      
  1. 常用的子类writer

常用的子类是:java.io.FileWriter

构造方法:

public FileWriter(String filename):参数代表文件路径名。

public FileWriter(String filename, boolean append):第二个参数代表是否追加。

public FileWriter(File file):参数代表文件对象。

public FileWriter(File file, boolean append):第二个参数代表是否追加。

7.字节流、字符流

输出流中一个flush方法

  1. 缓冲区在读写数据的过程中有两个方向

从write –>jvm缓冲区 -> OS ->

从文件到到数据:

硬盘->-OS -> jvm缓冲区->write

  1. 使用建议
flush方法:刷新缓冲区。

close方法:内部也包含一个flush动作,并且关闭流。



使用建议:除非有极强的时效性或者数据稳定性要求,否则尽量避免频繁调用flush方法。

FileOutputStream里面没有缓冲区,所以flush方法根本没用。

FileInputStream/FileReader/FileWriter底层都有byte[8192]字节数组作为缓冲区。      
后三者当中:

读数据:一次性读取8192个字节,read方法是从中取出一些字节进行使用。如果缓冲区用完了      
空了,再次读取最多8192个字节。

写数据:每次write方法只是将数据写到8192字节数组当中,如果满了自动刷。      

补充:

  1. a.没有Java7和Java9的新特性,怎么能始终执行close方法?

能嵌套try catch和if判断

7.字节流、字符流
7.字节流、字符流

b.进一步优化,创建一个CloseUtil工具

7.字节流、字符流
7.字节流、字符流
  1. try-with-resource
7.字节流、字符流
7.字节流、字符流
  1. 集合Properties工具类
7.字节流、字符流
7.字节流、字符流

(怎么打开一张图)

  1. Properties中load方法
7.字节流、字符流