一、流的概念

  1. File类关心的是磁盘上存储的文件位置和名称等,而流是指程序运行中的数据通信信道,当然流类所关心的是文件的内容。

二、流的分类

1. 根据流向分为:输入流,输出流

2. 根据传输单位:字节流,字符流

3. 根据是否和数据源可以直接交互:节点流,处理流

  • 节点流:可以和数据源直接交互
    FileInputStream,FileOutPutStream,FileWriter,FileReader
  • 处理流:需要连接嵌套其它的流使用,BufferedReader,BufferedWriter

三、流的四个根类

1. InputStream

  • FileInputStream:按照字节读,文件复制
  • ObjectInputStream:反序列化

    2.OutputStream

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. 1. `public static void copy(File src,File dest) throws IOException{`
  2. 2. `//从src读,向dest写`
  3. 3. `InputStream reader=new FileInputStream(src);`
  4. 5. `OutputStream writer=new FileOutputStream(dest);`
  5. 7. `byte bs[]=new byte[1024];//一次读取1024个字节`
  6. 9. `int len=reader.read(bs);//len是每次读到的字节数`
  7. 11. `while(len!=-1){`
  8. 12. `writer.write(bs, 0, len);`
  9. 13. `len=reader.read(bs);`
  10. 14. `}`
  11. 16. `writer.close();`
  12. 17. `reader.close();`
  13. 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() :关闭输出流。

八、嵌套流

  1. 流对象被其他处理流的多次连接,称为流的嵌套
    • 直接与数据源相连接的流是节点流
    • 处理流连接节点流,提供附加性能
    • 处理流可以被其它处理流继续连接,以获取需要的其它性能。
    • 处理流不可以与节点(数据源)直接连接

九、缓冲流

默认带了8192个字符的缓冲区,是为了提高性能,减少频繁和硬盘进行io的次数,

BufferedReader:处理流,提供了readLine方法,很实用

BufferedWriter:处理流,提供了newLine() write(str)方法