一、流分类

  1. 根据流的数据单位(类型) 可以分为 字节流 8bit(byte)、字符流 16bit(char)
    1. 字节流输入流 inputStream
    2. 字节流输出流 outPutStream
    3. 字符流输入流 reader
    4. 字符流输出流 writer
  2. 根据流的流向 可以分为 输入流、输出流
  3. 根据流的角色 可以分为节点流、处理流
    1. 直接作用在数据上的流称为节点流
    2. 包裹节点流的流称为处理流

image.png

二、重点掌握流

分类 字节输入流 字节输出流 字符输入流 字符输出流
抽象基类 InputStream OutputStream Reader Writer
访问文件 FileInputStream FileOutputStream FileReader FileWriter
访问数组 ByteArrayInputStream ByteArrayOutputStream CharArrayReader CharArrayWriter
访问管道 PipedInputStream PipedOutputStream PipedReader PipedWriter
访问字符串

|

| StringReader | StringWriter | | 缓冲流 | BufferedInputStream | BufferedOutputStream | BufferedReader | BufferedWriter | | 转换流 |

|

| InputStreamReader | OutputStreamWriter | | 对象流 | ObjectInputStream | ObjectOutputStream |

|

| |

| FilterInputStream | FilterOutputStream | FilterReader | FilterWriter | | 打印流 |

|
PrintStream |

|
PrintWirter | | 推回输入流 |

|

|

|

| | 特殊流 |

|

|

|

|

  1. /**
  2. * @author:LYY 创建时间:2022/5/9
  3. * io流操作
  4. */
  5. public class FileReaderTest {
  6. /**
  7. * 对象流
  8. * 序列化对象和反序列化
  9. * 当person对象序列化到person.dat文件中 并实现反序列化
  10. */
  11. @Test
  12. public void objectInputStreamAndObjectOutputStreamTest() {
  13. // 1. 实例化File文件对象
  14. File file = new File("person.dat");
  15. // 要被序列化的对象
  16. Person person = new Person("张胜男", 15);
  17. // 2. 创建序列化对象(输出对象流:ObjectOutputStream)
  18. ObjectOutputStream oos = null;
  19. // 2. 创建反序列化对象(输入对象流:ObjectInputStream)
  20. ObjectInputStream ois = null;
  21. try {
  22. // 3. 序列化对象(将对象输出到硬盘)
  23. oos = new ObjectOutputStream(new FileOutputStream(file));
  24. oos.writeObject(person);
  25. // 清空缓冲空间
  26. oos.flush();
  27. // 4. 反序列化对象(将硬盘中保存的对象重新获取到内存)
  28. ois = new ObjectInputStream(new FileInputStream(file));
  29. Object object = ois.readObject();
  30. System.out.println(object);
  31. } catch (IOException e) {
  32. e.printStackTrace();
  33. } catch (ClassNotFoundException e) {
  34. e.printStackTrace();
  35. } finally {
  36. // 关闭反序列化对象
  37. if (ois != null) {
  38. try {
  39. ois.close();
  40. } catch (IOException e) {
  41. e.printStackTrace();
  42. }
  43. }
  44. // 关闭序列化对象
  45. if (oos != null) {
  46. try {
  47. oos.close();
  48. } catch (IOException e) {
  49. e.printStackTrace();
  50. }
  51. }
  52. }
  53. }
  54. /**
  55. * 标准输入输出流和打印流
  56. */
  57. @Test
  58. public void systemTest() {
  59. // 标准输入流 从键盘输入
  60. InputStream in = System.in;
  61. // 标准输出流 默认输出到控台
  62. PrintStream out = System.out;
  63. PrintWriter printWriter = null;
  64. try {
  65. // 创建打印流
  66. //printWriter = new PrintWriter(new FileWriter(new File("hello.txt")));
  67. FileOutputStream fileOutputStream = new FileOutputStream("hello.txt");
  68. // 重写标准输出流
  69. // printWriter.print("你好!");
  70. // 重新设置打印流
  71. System.setOut(new PrintStream(fileOutputStream));
  72. System.out.print("boolean");
  73. } catch (IOException e) {
  74. e.printStackTrace();
  75. } finally {
  76. //printWriter.close();
  77. }
  78. }
  79. /**
  80. * 转换流读取文件写出文件
  81. * 1. 读取文件时 读取文件的转换流编码格式必须与文件格式一致
  82. * 2. 写出文件时 写出文件的转换流可以自定义文件编码 不指定则默认系统设置的编码格式
  83. */
  84. @Test
  85. public void inputStreamReaderAndOutputStreamWriterTest() {
  86. // 1. 实例化File对象
  87. File inFile = new File("hello.txt");
  88. File outFile = new File("hello1.txt");
  89. // 2. 创建转换流对象
  90. // 将读入的字节流 转为 字符流
  91. InputStreamReader isr = null;
  92. // 将写出的字符流 转为 字节流
  93. OutputStreamWriter osw = null;
  94. try {
  95. // 3. 实例化转换流对象
  96. // 实例化输入转换流
  97. isr = new InputStreamReader(new FileInputStream(inFile));
  98. // 实例输出转换流
  99. // osw = new OutputStreamWriter(new FileOutputStream(outFile));
  100. // 可以指定写出文件的编码格式
  101. osw = new OutputStreamWriter(new FileOutputStream(outFile),"gbk");
  102. char[] chars = new char[1024];
  103. int len;
  104. // 读取文件
  105. while ((len = isr.read(chars)) != -1) {
  106. // 写出文件
  107. osw.write(chars, 0, len);
  108. }
  109. } catch (FileNotFoundException e) {
  110. e.printStackTrace();
  111. } catch (IOException e) {
  112. e.printStackTrace();
  113. } finally {
  114. // 4. 关闭转换流
  115. if (osw != null) {
  116. try {
  117. osw.close();
  118. } catch (IOException e) {
  119. e.printStackTrace();
  120. }
  121. }
  122. if (isr != null) {
  123. try {
  124. isr.close();
  125. } catch (IOException e) {
  126. e.printStackTrace();
  127. }
  128. }
  129. }
  130. }
  131. /**
  132. * 使用缓冲流(BufferedInputStream)实现文件的复制
  133. */
  134. @Test
  135. public void bufferedInputStreamAndBufferedOutputStreamTest() {
  136. // 1. 实例化file对象
  137. // 实例化要读取的文件
  138. File inputStreamJpg = new File("preview.jpg");
  139. String user = System.getProperty("user.name");
  140. // 实例化要输出的文件
  141. File outputStream = new File("C:\\Users\\" + user + "\\Desktop",inputStreamJpg.getName());
  142. // 2. 实例化输入流(FileInputStream)和输出流(FileOutputStream)
  143. FileInputStream input = null;
  144. FileOutputStream output = null;
  145. // 3. 实例化处理流(缓冲流)
  146. // 实例化输入流
  147. BufferedInputStream bufferedInputStream = null;
  148. // 实例化输出流
  149. BufferedOutputStream bufferedOutputStream = null;
  150. try {
  151. // 赋值输入节点流
  152. input = new FileInputStream(inputStreamJpg);
  153. // 赋值输出节点流
  154. output = new FileOutputStream(outputStream);
  155. // 赋值输入缓冲流
  156. bufferedInputStream = new BufferedInputStream(input);
  157. // 赋值输出流缓冲流
  158. bufferedOutputStream = new BufferedOutputStream(output);
  159. byte[] bytes = new byte[1024];
  160. // 记录每次读取的字节个数
  161. int len;
  162. while ((len = bufferedInputStream.read(bytes)) != -1) {
  163. // 写出文件到硬盘
  164. bufferedOutputStream.write(bytes,0,len);
  165. }
  166. } catch (FileNotFoundException e) {
  167. e.printStackTrace();
  168. } catch (IOException e) {
  169. e.printStackTrace();
  170. } finally {
  171. // 4. 关闭缓冲输出流和缓冲输入流
  172. // 关闭处理流的同时 节点流也会关闭
  173. if (bufferedOutputStream != null) {
  174. try {
  175. bufferedOutputStream.close();
  176. } catch (IOException e) {
  177. e.printStackTrace();
  178. }
  179. }
  180. if (bufferedInputStream != null) {
  181. try {
  182. bufferedInputStream.close();
  183. } catch (IOException e) {
  184. e.printStackTrace();
  185. }
  186. }
  187. }
  188. }
  189. /**
  190. * 使用FileInputStream和FileOutputStream实现文件的复制
  191. */
  192. @Test
  193. public void fileInputStreamAdnFileOutputStreamTest() {
  194. // 1. 实例化file对象
  195. // 实例化要读取的文件
  196. File inputStreamJpg = new File("preview.jpg");
  197. String user = System.getProperty("user.name");
  198. System.out.println(user);
  199. // 实例化要输出的文件
  200. File outputStream = new File("C:\\Users\\" + user + "\\Desktop",inputStreamJpg.getName());
  201. System.out.println(outputStream);
  202. // 2. 实例化输入流(FileInputStream)和输出流(FileOutputStream)
  203. FileInputStream input = null;
  204. FileOutputStream output = null;
  205. try {
  206. // 实例化输入流
  207. input = new FileInputStream(inputStreamJpg);
  208. // 实例化输出流
  209. output = new FileOutputStream(outputStream);
  210. byte[] bytes = new byte[100];
  211. // 记录每次读取的字节个数
  212. int len;
  213. while ((len = input.read(bytes)) != -1) {
  214. // 写出文件到硬盘
  215. output.write(bytes,0,len);
  216. }
  217. } catch (FileNotFoundException e) {
  218. e.printStackTrace();
  219. } catch (IOException e) {
  220. e.printStackTrace();
  221. } finally {
  222. // 4. 关闭输出流和输入流
  223. try {
  224. if (output != null) {
  225. output.close();
  226. }
  227. } catch (IOException e) {
  228. e.printStackTrace();
  229. }
  230. try {
  231. if (input != null) {
  232. input.close();
  233. }
  234. } catch (IOException e) {
  235. e.printStackTrace();
  236. }
  237. }
  238. }
  239. /**
  240. * 将内存中的数据写到硬盘中
  241. */
  242. @Test
  243. public void fileWriterTest() {
  244. // 1. 实例化File对象
  245. File file = new File("hello.txt");
  246. FileWriter writer = null;
  247. try {
  248. // 2. 实例化输出流FileWriter对象
  249. // 默认文件不存在 输出流自动创建 若文件已经存在 则覆盖 可以通过设置关闭是否覆盖已存在的文件
  250. writer = new FileWriter(file);
  251. // 3. 调用输出方法 将数据写入到硬盘中
  252. writer.write("你好,世界!\n");
  253. writer.write("hello world!");
  254. } catch (Exception e) {
  255. e.printStackTrace();
  256. } finally {
  257. // 4. 关闭
  258. try {
  259. writer.close();
  260. } catch (IOException e) {
  261. e.printStackTrace();
  262. }
  263. }
  264. }
  265. /**
  266. * 读取文件到内存中
  267. */
  268. @Test
  269. public void readerTest02() {
  270. // 1. 创建要的读取的file对象
  271. File fileJpg = new File("preview.jpg");
  272. File fileTxt = new File("preview.txt");
  273. // 2. 创建对应流对象
  274. FileInputStream fileInputStream = null;
  275. FileReader fileReader = null;
  276. try {
  277. // 实例化流对象
  278. fileInputStream = new FileInputStream(fileJpg);
  279. fileReader = new FileReader(fileTxt);
  280. char[] chars = new char[5];
  281. int c;
  282. // fileReader.read(chars) 该方法返回读取的字符数 末尾返回-1
  283. while ((c = fileReader.read(chars)) != -1) {
  284. // 正确的
  285. // String str = new String(chars, 0, c);
  286. // System.out.print(str);
  287. // 错误的
  288. // for (char aChar : chars) {
  289. // System.out.print(aChar);
  290. // }
  291. // 正确的
  292. for (int i = 0; i < c; i++) {
  293. System.out.print(chars[i]);
  294. }
  295. }
  296. } catch (FileNotFoundException e) {
  297. e.printStackTrace();
  298. } catch (IOException e) {
  299. e.printStackTrace();
  300. } finally {
  301. // 4. 关闭对应流对象
  302. try {
  303. if (fileInputStream != null) {
  304. fileInputStream.close();
  305. }
  306. if (fileReader != null) {
  307. fileReader.close();
  308. }
  309. } catch (IOException e) {
  310. e.printStackTrace();
  311. }
  312. }
  313. }
  314. /**
  315. * 读取文件到内存中
  316. */
  317. @Test
  318. public void readerTest01() {
  319. // 1. 创建要的读取的file对象
  320. File fileJpg = new File("preview.jpg");
  321. File fileTxt = new File("preview.txt");
  322. // 2. 创建对应流对象
  323. FileInputStream fileInputStream = null;
  324. FileReader fileReader = null;
  325. try {
  326. // 实例化流对象
  327. fileInputStream = new FileInputStream(fileJpg);
  328. fileReader = new FileReader(fileTxt);
  329. int c;
  330. while ((c = fileReader.read()) != -1) {
  331. System.out.print((char)c);
  332. }
  333. } catch (FileNotFoundException e) {
  334. e.printStackTrace();
  335. } catch (IOException e) {
  336. e.printStackTrace();
  337. } finally {
  338. // 4. 关闭对应流对象
  339. try {
  340. if (fileInputStream != null) {
  341. fileInputStream.close();
  342. }
  343. if (fileReader != null) {
  344. fileReader.close();
  345. }
  346. } catch (IOException e) {
  347. e.printStackTrace();
  348. }
  349. }
  350. }
  351. }

```