一、流的概念
File类关心的是磁盘上存储的文件位置和名称等,而流是指程序运行中的数据通信信道,当然流类所关心的是文件的内容。
二、流的分类
1. 根据流向分为:输入流,输出流
2. 根据传输单位:字节流,字符流
3. 根据是否和数据源可以直接交互:节点流,处理流
- 节点流:可以和数据源直接交互
FileInputStream,FileOutPutStream,FileWriter,FileReader - 处理流:需要连接嵌套其它的流使用,BufferedReader,BufferedWriter
三、流的四个根类
1. InputStream
FileOutputStream:按照字节写,文件复制
ObjectOutPutStream:序列化
字节流:适合做文件复制
3.Reader
- FileReader:读字符,存在乱码问题
- BufferedReader:按照行读取字符 readLine:返回值为null表示读取结束
InputStreamReader:处理流,需要嵌套节点流使用,读文件的指定字符集编码,解决乱码问题
4.Writer
FileWriter:写字符,存在乱码问题
- BufferedWriter :按照行读写字符,newLinle
- OutPutStreamWriter:处理流,需要嵌套节点流使用,写文件的时候指定字符集编码,解决乱码问题
四、字节流
1. FileInputStream
- 常用api
FileInputStream是InputStream的子类。
FileInputStream是读取文件的字节输入流。
FileInputStream常用的构造方法:
FileInputStream(File file)
FileInputStream(String filename)
FileInputStream覆盖实现了父类如下方法:
int available()
void close()
int read()
int read(byte[ ] b)
int read(byte[] b,int off,int len)
注意:read()和int read(byte[ ] b)方法返回值代表的意义2.FileOutputStream
FileOutputStream是OutputStream的子类
FileOutputStream是写入文件的字节输出流
FileOutputStream常用的构造方法:
FileOutputStream(File file)
FileOutputStream(String filename)
FileOutputStream(File file,boolean append)
FileOutputStream(String filename,boolean append)
FileOutputStream覆盖实现了父类如下方法:
void close()
void flush()
void write(int b)
void write(byte[] b)
void write(byte[] b,int off,int len)3. 文件复制
1. `public static void copy(File src,File dest) throws IOException{`
2. `//从src读,向dest写`
3. `InputStream reader=new FileInputStream(src);`
5. `OutputStream writer=new FileOutputStream(dest);`
7. `byte bs[]=new byte[1024];//一次读取1024个字节`
9. `int len=reader.read(bs);//len是每次读到的字节数`
11. `while(len!=-1){`
12. `writer.write(bs, 0, len);`
13. `len=reader.read(bs);`
14. `}`
16. `writer.close();`
17. `reader.close();`
19. `}`
七、字符流
字符流:适合读写文本字符(按照字符读取,不能直接按照行读取)
1. FileReader
常用API:
int read()
int read(char[] cbuf)
int read(char[] cbuf,int off,int len)
long skip(long n)
void close()2. FileWriter
常用API:
void write(int ch) :写入单个字符到调用的输出流。
void write(String str) :写入str到输出流。
void write(String str, int off, int len),写入字符串的某一部分。
void write(char[] cbuf)
void write(char[] cbuf,int off,int len):写入字符数组的某一部分。
void flush() :清空输出缓冲区。
void close() :关闭输出流。
八、嵌套流
- 流对象被其他处理流的多次连接,称为流的嵌套
- 直接与数据源相连接的流是节点流
- 处理流连接节点流,提供附加性能
- 处理流可以被其它处理流继续连接,以获取需要的其它性能。
- 处理流不可以与节点(数据源)直接连接
九、缓冲流
默认带了8192个字符的缓冲区,是为了提高性能,减少频繁和硬盘进行io的次数,
BufferedReader:处理流,提供了readLine方法,很实用
BufferedWriter:处理流,提供了newLine() write(str)方法