Input/Output 读取/写入
1、字节流
- InputSreeam 抽象类,表示字节输入流的超类(父亲)/OuputStream 抽象类,表示字节输出流的超类(父亲)
- FileOutputStream (String name) :创建文件输出流以制定的名称写入文件(三种方法)
- void write(int b)
- void write(byte[] b)
- void write(byte[] b,int off,int len)
!注意三个小问题
- 实现换行:windows: \r\n linux: \n mac:\r
- 实现追加:在创建输出流文件的第二个参数设置为true
- 写入结束的时候:注意关闭资源 close();
- FileInputStream(String name): 通过打开与实际文件的连接来创建一个输入流的对象
字节流读数据:
- public int read() 一次读取一个字节,当没有内容读取的时候,返回-1;
- public int read(byte[]) 一次读取一个字节数组,返回读取的内容数量,同样没有内容读取的时候返回-1;
- 字节缓冲流 优点:创造缓冲对象,不必每次都调用底层系统,节省输入和输出的时间
- BufferedOutputStream(OutputStream out)
- BufferedInputStream(InputStream out)
其中输出和输出的方法和上面的一致,不过构造方法则需要传入相应的对象。
2、字符流
- 为什么会出现字符流? 因为字节流操作中文不是很方便
字符流=字节流+编码表 - 常用的字符集(编码的参照)
GBK:一个中文占两个字节
UTF-8: 一个中文占三个字节 - InputStreamReader :从字节流到字符流的桥梁,读取字节,并采用相应的编码解码为字符(Reader 是其超类的抽象类)
- OutputStreamWriter :从字符流到字节流的桥梁,读取字符,并采用相应的编码将其编码为字节(Writer 是其超类的抽象类)
- 字符流写入数据的物种方法
- void write(int c)
- void write(char[] cbuf)
- void write(char[] cbuf,int off,int len)
- void write(String str)
- void write(String str,int off,int len)
- flush() 刷新
- close() 关闭
- 字符流读取数据的2中方法
- int read() 一次读取一个字符
- int read(char[] cbuf) 一次读取一个字符数组
-
字符输入和输出流的便捷对象
因为之前的名称比较长,我们这里可以采用两种比较短的名称对象:FileReader() 和 FileWriter() ,其中构造函数可以直接用文件的路径 -
字符缓冲流
- BufferedWriter(Writer out) 字符缓冲输出流对象
- BufferedReader(Reader in) 字符缓冲输入流对象
输出和输出的方法与之前的较为一致
!不过有其特有的功能 - 读取的特有功能 String readLine() 一次读取一行内容,但是不会读取换行等终止符
- 写入的特有功能 void newLine() 写一行行分隔符(换行)
- 写入的时候,也要注意 刷新(flush()) 及时更新写入的内容。
- 最后同样注意都要关闭释放资源。
3、总结
最后用两张图来总结:
小结:字节流可以复制任意文件数据,有4种方式,一般采用字节缓冲流一次读写一个字节数组的方法
小结:字符流只能复制文本数据,有5种方式,一般采用字符缓冲流的特有功能(一次读写一行字符)