黑马程序员技术交流社区

标题: 【Java基础交流】之【一张贴搞定IO流读写问题】!! [打印本页]

作者: 传奇查    时间: 2015-11-21 16:37
标题: 【Java基础交流】之【一张贴搞定IO流读写问题】!!
本帖最后由 传奇查 于 2015-11-25 19:41 编辑

感觉对你有用就给个鼓励吧~~
用eclipse写滴~
  1. /**
  2. * 流的操作规律
  3. *
  4. * 之所以要弄清楚这个规律,是因为流对象太多,开发时不知道用哪个对象合适.
  5. * 想要知道对象的开发时用到哪些对象,只要通过四个明确即可.
  6. *
  7. * 1.明确源和目的
  8. * 源:        InputStream                Reader
  9. * 目的:        OutputStream        Writer
  10. *
  11. * 2.明确数据是否是纯文本数据
  12. * 源:        是纯文本:Reader
  13. *                 不是纯文本:InputStream
  14. * 目的:        是存文本:Writer
  15. *                 不是纯文本:OutputStream
  16. * 这样就可以明确需求中具体需要使用哪个体系.
  17. *
  18. * 3.明确具体的设备
  19. * 源设备:
  20. *                硬盘:File
  21. *                 键盘:System.in
  22. *                 内存:数组
  23. *                 网络:Socket流
  24. * 目的设备:
  25. *                 硬盘:File
  26. *                 控制台:System.out
  27. *                 内存:数组
  28. *                 网络:Socket流
  29. *
  30. * 4.是否需要额外功能
  31. * 是否需要高效(缓冲区):
  32. *                 需要:加上Buffered
  33. *                 不需要:不加
  34. *
  35. * ==========================================================
  36. *
  37. * 举例:
  38. *
  39. * 需求1:
  40. *                 复制一个文本文件
  41. *
  42. * 1.明确源和目的.
  43. *         源:                InputStream         Read
  44. *         目的:        OutputStream         Writer
  45. *
  46. * 2.是否是纯文本?
  47. * 是!
  48. * 源:        Reader
  49. * 目的:        Writer
  50. *
  51. * 3.明确具体设备.
  52. * 源:
  53. *                 硬盘:File
  54. * 目的:
  55. *                 硬盘:File
  56. * FileReader fr = new FileReader("a.txt");
  57. * FileWriter fw = new FileReader("b.txt");
  58. *
  59. * 4.需要额外功能吗?
  60. * 需要,高效
  61. * BufferedReader br = new BufferedReader(fr);
  62. * BufferedWriter bw = new BufferedWriter(fw);
  63. *
  64. * ============================================================
  65. *
  66. * 需求2:
  67. *                 读取键盘录入信息,并写入到一个文件中.
  68. *
  69. * 1.明确源和目的.
  70. * 源:        InputStream         Reader
  71. * 目的: OutputStream         Writer
  72. *
  73. * 2.是否是纯文本?
  74. * 是!
  75. * 源:        InputStream
  76. * 目的:        Writer
  77. *
  78. * 3.明确具体设备.
  79. * 源:        
  80. *         键盘:System.in
  81. * 目的:
  82. *         硬盘:File
  83. * InputStream is = System.in;
  84. * FileWriter fw = new FileWriter("b.txt");
  85. *
  86. * 4.需要额外的功能吗?
  87. * 需要,转换.将字节流转换成字符流,应为明确源是Reader,这样操作文本数据更便捷.
  88. * InputStreamReader isr = new InputStreamReader(is);
  89. * FileWriter fw = new FileWriter("b.txt");
  90. * 还需要功能吗?需要~高效!
  91. * BufferedReader bf = new BufferedReader(isr);
  92. * BufferedWriter bw = new BufferedWriter(fw);
  93. *
  94. * ==========================================================
  95. *
  96. * 需求3:
  97. *                 将一个文本文件显示在控制台上
  98. *
  99. * 1.明确源和目的
  100. *         源:                InputStream                Reader
  101. *         目的:        OutputStream        Writer
  102. *
  103. * 2.是否是纯文本?
  104. * 是!
  105. * 源:        Reader
  106. * 目的        OutputStream
  107. *
  108. * 3.明确具体设备.
  109. * 源:
  110. *                 硬盘:File
  111. * 目的:
  112. *                 控制台:System.out
  113. * FileReader fr = new FileReader("a.txt");
  114. * OutputStream os = System.out;
  115. *
  116. * 4.需要额外的功能吗?
  117. * 需要~转换~
  118. * FileReader fr = new FileReader("a.txt");
  119. * OutputStreamWriter osw = new OutputStreamWriter(os);
  120. * 需要~高效~
  121. * BufferedReader br = new BufferedReader(fr);
  122. * BufferedWriter bw = new BufferedWriter(osw);
  123. *
  124. * ==========================================================
  125. *
  126. * 需求4:
  127. *                 读取键盘录入数据,显示在控制台上
  128. *
  129. * 1.明确源和目的
  130. * 源:        InputStream                Reader
  131. * 目的:        OutputStream        Writer
  132. *
  133. * 2.是否是纯文本?
  134. * 是!
  135. * 源:        InputStream
  136. * 目的:        OutputStream
  137. *
  138. * 3.明确具体设备
  139. * 源:
  140. *                 键盘:        System.in
  141. * 目的:
  142. *                 控制台:        System.out
  143. * InputStream is = System.in;
  144. * OutputStream os = System.out;
  145. *
  146. * 4.明确额外功能
  147. * 需要~转换~
  148. * InputStreamReader isr = new InputStreamReader(is);
  149. * OutputStreamWriter osw = new OutputStreamWriter(os);
  150. * 需要~缓冲高效~
  151. * BufferedReader br = new BufferedReader(isr);
  152. * BuffeedrWriter bw = new BufferedWriter(osw);
  153. */
复制代码
  1. package cn.fuxi._07io;
  2. /**
  3. * 练习:
  4. *                 将一个中文字符串数据按照指定的编码表写入到一个文本文件中.
  5. * 1.目的:OutputStream,Writer
  6. * 2.是纯文本:Writer
  7. * 3.设备:硬盘File
  8. * FileWriter fw = new FileWriter("哒哒哒.txt");
  9. * fw.write("你好~");
  10. *
  11. * P.S.
  12. * FileWriter是用来写入字符文件的便捷类,此类的构造方法假定默认字符编码
  13. * 和默认字节缓冲区大小都是可接收的.
  14. * =============================================================
  15. * 任何Java识别的字符数据使用的都是Unicode码表,但是FileWriter写入本地
  16. * 文件使用的是本地编码,也就是GBK码表.
  17. * 而OutputStreamWriter可使用指定的编码将要写入流中的字符编码成字节.
  18. *
  19. * P.S.
  20. * UTF-8编码,一个中文三个字节.
  21. * =============================================================
  22. * 需求:打印d.txt文件中的内容至控制台显示.
  23. * 原因分析:由于源文件中是UTF-8编码的"您好",6个字节.
  24. * 使用FileReader类是用GBK编码进行读取,6个字节代表3个字符,并且按照GBK进行编码
  25. * 因此才出现以上结果.
  26. * =============================================================
  27. * 需求:打印之前的文字的内容到控制台显示.
  28. * 原因分析:由于c.txt文件中是GBK编码的"您好",4个字节.
  29. * 使用InputStreamReader类是用UTF-8编码经行读取,由于GBK编码的字节使用UTF-8
  30. * 没有对应字符,因此用"?"进行代替.
  31. * =============================================================
  32. * 需求:按照指定编码写字符到指定文件中.
  33. * 如过需求中已经明确指定了编码表.那就不可以使用FileWriter,应为FileWriter内
  34. * 部使用的默认的本地编码表.只能使用其父类,OutputStreamWriter.
  35. *                 OutputStreamWriter接收一个字节流输出对象,既然是操作文件,那么对象应该是
  36. * FileOutputStream.
  37. *                 OutputStreamWriter osw = new OutputStreamWriter(new
  38. * FileOutputStream("xx.txt"),charsetName);
  39. * 并且需要高效:
  40. *                 BufferedWriter bw = new BufferedWriter(osw);
  41. * =============================================================
  42. * 什么时候使用转换流呢?
  43. * 1.源或者目的对应的设备是字节流,但是操作的却是文本数据,可以使用转换作为桥梁,提高
  44. * 对文本操作的便捷.
  45. * 2.一旦操作文本涉及到具体的指定编码表时,必须使用转换流.
  46. * =====================================================================
  47. * 字符流继承体系简表
  48. *                                         |--BufferedReader
  49. *                |-->Reader        |
  50. *                 |                        |--InputStreamReader        ---        FileReader
  51. * 字符流        |
  52. *                 |                        |--BufferedWriter
  53. *                 |-->Writer        |
  54. *                                         |--OutputStreamWriter        ---        FileWriter
  55. * =====================================================================
  56. * 字节流继承体系简表
  57. *                                                 |--FileInputStream
  58. *                |-->InputStream        |
  59. *                 |                                |--FilterInputStream        ---        BufferedInputStream
  60. * 字节流        |
  61. *                 |                                |--Writer
  62. *                 |-->OutoutStream|
  63. *                                                 |--FilterOutputStream        ---        BufferedOutputStream
  64. * =====================================================================
  65. */
  66. import java.io.*;
  67. public class _08TransformStreamTest {
  68.         public static void main(String[] args) throws IOException {
  69.                 writeText();
  70.                 ReadText();
  71.                 ReadText2();
  72.         }
  73.         public static void writeText() throws IOException{
  74.                 FileWriter fw = new FileWriter("哒哒哒.txt");
  75.                 fw.write("你好");
  76.                 fw.flush();
  77.                 fw.close();
  78.         }
  79.         public static void ReadText() throws IOException{
  80.                 FileReader fr = new FileReader("哒哒哒.txt");
  81.                 char[] buf = new char[10];
  82.                 int len = fr.read(buf);
  83.                 String s = new String(buf,0,len);
  84.                 System.out.println(s);
  85.                 fr.close();
  86.         }
  87.         public static void ReadText2()throws IOException{
  88.                 InputStreamReader isr = new InputStreamReader(new FileInputStream("哒哒哒.txt"),"UTF-8");//或者Unicode
  89.                 char[] buf = new char[10];
  90.                 int len = isr.read(buf);
  91.                 String s = new String(buf,0,len);
  92.                 System.out.println(s);
  93.                 isr.close();
  94.         }       
  95. }
复制代码
输出结果:
你好
??



感觉对你有用就给个鼓励吧~~



作者: 传奇查    时间: 2015-11-25 19:42
花了许多心思写滴~坚决顶起!
作者: wqd123    时间: 2015-11-25 21:35
很用心啊,有用谢谢
作者: xiaobei56    时间: 2015-11-26 00:10
其实吧:IO 流让我别扭的是 :它的流动方向:从程序往文件的些数据是:输出流。 从文件上读数据:是输入流
作者: 传奇查    时间: 2015-11-26 02:23
xiaobei56 发表于 2015-11-26 00:10
其实吧:IO 流让我别扭的是 :它的流动方向:从程序往文件的些数据是:输出流。 从文件上读数据:是输入流 ...

一开始我也会困扰,但是如果角色变换下把自己当做是内存,就很好解决了~
作者: xiaobei56    时间: 2015-11-26 11:21
传奇查 发表于 2015-11-26 02:23
一开始我也会困扰,但是如果角色变换下把自己当做是内存,就很好解决了~

嗯,现在正这样想那 ,谢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2