1.节点流—文件操作

FileReader类

构造方法摘要
FileReader(File file) 在给定从中读取数据的 File 的情况下创建一个新 FileReader。
FileReader(FileDescriptor fd) 在给定从中读取数据的 FileDescriptor 的情况下创建一个新 FileReader。
FileReader(String fileName) 在给定从中读取数据的文件名的情况下创建一个新 FileReader。

FileWriter类

构造方法摘要
FileWriter(File file) 根据给定的 File 对象构造一个 FileWriter 对象。
FileWriter(File file, boolean append) 根据给定的 File 对象构造一个 FileWriter 对象。
FileWriter(FileDescriptor fd) 构造与某个文件描述符相关联的 FileWriter 对象。
FileWriter(String fileName) 根据给定的文件名构造一个 FileWriter 对象。
FileWriter(String fileName, boolean append) 根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。

使用FileReader和FileWriter类完成文本文件复制:

  1. import java.io.FileReader;
  2. import java.io.FileWriter;
  3. import java.io.IOException;
  4. public class CopyFile {
  5. public static void main(String[] args) throws IOException {
  6. //创建输入流对象
  7. FileReader fr=new FileReader("C:\\Test\\copyfrom.txt");//文件不存在会抛出java.io.FileNotFoundException
  8. //创建输出流对象
  9. FileWriter fw=new FileWriter("C:\\Test\\copyto.txt");
  10. /*创建输出流做的工作:
  11. * 1、调用系统资源创建了一个文件
  12. * 2、创建输出流对象
  13. * 3、把输出流对象指向文件
  14. * */
  15. //文本文件复制,一次读一个字符
  16. method1(fr, fw);
  17. //文本文件复制,一次读一个字符数组
  18. method2(fr, fw);
  19. fr.close();
  20. fw.close();
  21. }
  22. public static void method1(FileReader fr, FileWriter fw) throws IOException {
  23. int ch;
  24. while((ch=fr.read())!=-1) {//读数据
  25. fw.write(ch);//写数据
  26. }
  27. fw.flush();
  28. }
  29. public static void method2(FileReader fr, FileWriter fw) throws IOException {
  30. char chs[]=new char[1024];
  31. int len=0;
  32. while((len=fr.read(chs))!=-1) {//读数据
  33. fw.write(chs,0,len);//写数据
  34. }
  35. fw.flush();
  36. }
  37. }

2.处理流—缓冲操作

BufferedReader

public classBufferedReaderextends Reader

(1)从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
(2)可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。
(3)通常,Reader 所作的每个读取请求都会导致对底层字符或字节流进行相应的读取请求。

因此,建议用 BufferedReader 包装所有其 read() 操作可能开销很高的 Reader(如 FileReader 和 InputStreamReader)。
例如,
BufferedReader in = new BufferedReader(new FileReader(“foo.in”));
(4)将缓冲指定文件的输入。如果没有缓冲,则每次调用 read() 或 readLine() 都会导致从文件中读取字节,并将其转换为字符后返回,而这是极其低效的。

BufferedWriter

public class BufferedWriter extends Writer
(1)将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
(2)可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。
(3)该类提供了 newLine() 方法,它使用平台自己的行分隔符概念,此概念由系统属性 line.separator 定义。并非所有平台都使用新行符 (‘\n’) 来终止各行。因此调用此方法来终止每个输出行要优于直接写入新行符。
(4)通常 Writer 将其输出立即发送到底层字符或字节流。除非要求提示输出,否则建议用 BufferedWriter 包装所有其 write() 操作可能开销很高的 Writer(如 FileWriters 和 OutputStreamWriters)。例如,
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));
(5)缓冲 PrintWriter 对文件的输出。如果没有缓冲,则每次调用 print() 方法会导致将字符转换为字节,
然后立即写入到文件,而这是极其低效的。 使用BufferedReader和BufferedWriter完成文件复制

  1. import java.io.BufferedReader;
  2. import java.io.BufferedWriter;
  3. import java.io.FileReader;
  4. import java.io.FileWriter;
  5. import java.io.IOException;
  6. public class CopyFile2 {
  7. public static void main(String[] args) throws IOException {
  8. //创建输入流对象
  9. BufferedReader br=new BufferedReader(new FileReader("C:\\Test\\copyfrom.txt"));//文件不存在会抛出java.io.FileNotFoundException
  10. //创建输出流对象
  11. BufferedWriter bw=new BufferedWriter(new FileWriter("C:\\Test\\copyto.txt"));
  12. //文本文件复制
  13. char [] chs=new char[1024];
  14. int len=0;
  15. while((len=br.read(chs))!=-1) {
  16. bw.write(chs, 0, len);
  17. }
  18. //释放资源
  19. br.close();
  20. bw.close();
  21. }
  22. }

缓冲区的工作原理:
1、使用了底层流对象从具体设备上获取数据,并将数据存储到缓冲区的数组内。
2、通过缓冲区的read()方法从缓冲区获取具体的字符数据,这样就提高了效率。
3、如果用read方法读取字符数据,并存储到另一个容器中,直到读取到了换行符时,将另一个容器临时存储的数据转成字符串返回,就形成了readLine()功能。


3.节点流—管道操作

PipedOutputStream

4.节点流—数组操作

CharArrayReader  

CharArrayWriter

StringReader

StringWriter