/
    一、流的分类:
    1.操作数据单位:字节流、字符流
    2.数据的流向:输入流、输出流
    3.流的角色:节点流、处理流


    二、流的体系结构
    抽象基类 节点流(或文件流) 缓冲流(处理流的一种)
    InputStream FileInputStream (read(byte[] buffer) ) BufferedFileInputStream
    OutputStream FileOutputStream (write(byte[] buffer,0,len)) BufferedFileOutputStream
    Reader FileReader (read(char[] buff)) BufferedFileReader
    Writer FileWriter (write(char[] buff,0,len)) BufferedFileWriter

    *

    flush()是一个缓冲流的刷新方法

    三、操作步骤:
    //1.实例化File类的对象,指明要操作的文件
    //2.提供具体的流
    //3.数据的读入
    //4.流的关闭操作

    1. package com.atguigu.java1;
    2. import org.junit.Test;
    3. import java.io.File;
    4. import java.io.FileReader;
    5. import java.io.FileWriter;
    6. import java.io.IOException;
    7. /**
    8. * 一、流的分类:
    9. * 1.操作数据单位:字节流、字符流
    10. * 2.数据的流向:输入流、输出流
    11. * 3.流的角色:节点流、处理流
    12. * <p>
    13. * 二、流的体系结构
    14. * 抽象基类 节点流(或文件流) 缓冲流(处理流的一种)
    15. * InputStream FileInputStream BufferedFileInputStream
    16. * OutputStream FileOutputStream BufferedFileOutputStream
    17. * Reader FileReader BufferedFileReader
    18. * Writer FileWriter BufferedFileWriter
    19. *
    20. * @author Dxkstart
    21. * @create 2021-05-29 15:54
    22. */
    23. public class FileReaderWriterTest {
    24. /*
    25. 将day09下的HelloWorld.txt文件的内容读入程序中,并输出到控制台
    26. 说明点:
    27. 1.read()理解:返回读入的一个字符。如果达到文件末尾,返回-1
    28. 2.异常的处理:为了保证流资源一定可以执行关闭操作。需要使用try-catch-finally处理
    29. 3.读入的文件一定要存在,否则就会报FileNotFoundException.
    30. */
    31. @Test
    32. public void test1() {
    33. FileReader fileReader = null;
    34. try {
    35. //1.实例化File类的对象,指明要操作的文件
    36. File file = new File("HelloWorld.txt");
    37. //2.提供具体的流
    38. fileReader = new FileReader(file);
    39. //3.数据的读入
    40. //read():返回读入的一个字符。如果达到文件的末尾,返回-1
    41. //方式一:
    42. // int read = fileReader.read();
    43. // while(read != -1){
    44. // System.out.print((char)read);
    45. // read = fileReader.read();
    46. // }
    47. //方式二:语法上对方式一修改
    48. int data;
    49. while ((data = fileReader.read()) != -1) {
    50. System.out.print((char) data);
    51. }
    52. } catch (IOException e) {
    53. e.printStackTrace();
    54. } finally {
    55. try {
    56. //4.流的关闭操作
    57. if (fileReader != null) {
    58. fileReader.close();
    59. }
    60. } catch (IOException e) {
    61. e.printStackTrace();
    62. }
    63. }
    64. }
    65. //对read()操作升级:使用read的重载方法
    66. @Test
    67. public void test2_FileReader1() {
    68. FileReader fr = null;
    69. try {
    70. //1.File类的实例化
    71. File file = new File("HelloWorld.txt");
    72. //2.流的实例化(如:FileReader流)
    73. fr = new FileReader(file);
    74. //3.读入的操作
    75. //read(char[] cbuf):返回每次读入cbuf数组中的字符的个数。如果达到文件末尾,返回-1
    76. char[] cbuf = new char[5];
    77. int len;
    78. while ((len = fr.read(cbuf)) != -1) {
    79. //错误的写法
    80. // for(int i = 0;i < cbuf.length;i++){
    81. // System.out.print(cbuf[i]);
    82. // }
    83. //正确写法
    84. // for(int i = 0;i < len;i++){
    85. // System.out.print(cbuf[i]);
    86. // }
    87. //错误的写法
    88. // String str = new String(cbuf);
    89. // System.out.print(str);
    90. //正确写法
    91. String str = new String(cbuf, 0, len);
    92. System.out.print(str);
    93. }
    94. } catch (IOException e) {
    95. e.printStackTrace();
    96. } finally {
    97. try {
    98. //4.资源的关闭(流的关闭,close())
    99. if(fr != null) {
    100. fr.close();
    101. }
    102. } catch (IOException e) {
    103. e.printStackTrace();
    104. }
    105. }
    106. }
    107. /*
    108. 从内存中写出数据到硬盘的文件里。
    109. 说明:
    110. 1. 输出操作,对应的File可以不存在的。并不会报错
    111. 2. File对应的硬盘中的文件如果不存在,在输出的过程中,会自动创建此文件。
    112. File对应的硬盘中的文件如果存在:
    113. 如果流使用的构造器是:FileWriter(file,false) / FileWriter(file):对原有文件的覆盖
    114. 如果流使用的构造器是:FileWriter(file,true):不会对原有文件覆盖,而是追加内容
    115. */
    116. @Test
    117. public void test_FileWriter() {
    118. FileWriter fw = null;
    119. try {
    120. //1.提供File类的对象,指明写出到的文件
    121. File file = new File("Hello1.txt");
    122. //2.提供FileWriter的对象,用于数据的写出
    123. fw = new FileWriter(file,true);
    124. //3.写出操作
    125. fw.write("I hava a dream!\n");
    126. fw.write("You need to have a dream!\n");
    127. } catch (IOException e) {
    128. e.printStackTrace();
    129. } finally {
    130. try {
    131. //4.流的关闭
    132. if(fw != null){
    133. fw.close();
    134. }
    135. } catch (IOException e) {
    136. e.printStackTrace();
    137. }
    138. }
    139. }
    140. @Test
    141. public void test_FileReader_FileWriter(){
    142. FileReader fr = null;
    143. FileWriter fw = null;
    144. try {
    145. //1.创建File的对象,指明读入和写出的文件
    146. File readfile = new File("Hello1.txt");
    147. File writfile = new File("hello2.txt");
    148. //2.创建输入流和输出流的对象
    149. fr = new FileReader(readfile);
    150. fw = new FileWriter(writfile);
    151. //3.数据的读入和写出操作
    152. char[] cbuf = new char[5];
    153. int len;//记录每次读入到cbuf数组中的字符的个数
    154. while((len = fr.read(cbuf)) != -1) {
    155. //每次写出len个字符
    156. fw.write(cbuf,0,len);
    157. }
    158. } catch (IOException e) {
    159. e.printStackTrace();
    160. } finally {
    161. //4.关闭流资源
    162. try {
    163. if(fw != null)
    164. fw.close();
    165. } catch (IOException e) {
    166. e.printStackTrace();
    167. }
    168. try {
    169. if(fr != null)
    170. fr.close();
    171. } catch (IOException e) {
    172. e.printStackTrace();
    173. }
    174. }
    175. }
    176. }