黑马程序员技术交流社区

标题: 关于IO流 [打印本页]

作者: mengxiang1993    时间: 2015-2-25 17:41
标题: 关于IO流
  1. package day20;

  2. import java.io.*;


  3. public class PrintDemo {

  4.         public static void main(String[] args) throws IOException, InterruptedException {
  5.                 File f = new File("prop.txt");

  6.                 FileInputStream fis = new FileInputStream(f);

  7.                 FileOutputStream fos = new FileOutputStream("p.txt");

  8.                 byte[] b = new byte[10];
  9.                 int length;
  10.                 while ((length = fis.read(b)) != -1) {
  11.             System.out.print(new String(b,0,b.length));
  12.                 //        Thread.sleep(5000);
  13.                         fos.write(b);
  14.                         fos.flush();
  15.                        

  16.                 }

  17.                 fis.close();
  18.                 fos.close();
  19.         }

  20. }
复制代码
prop.txt
  1. #
  2. #Wed Feb 25 16:34:37 CST 2015
  3. 李朝=黑马
  4. 马士兵=北京尚学堂
  5. time=5
  6. 毕向东=黑马程序员
复制代码



控制台输出:
  1. #
  2. #Wed Feb 25 16:34:37 CST 2015
  3. 李朝=?诼?
  4. 马士??北京尚学堂
  5. time=5
  6. 毕向东=?诼沓绦蛟?
  7. 马程序员
复制代码
写入的文件p.txt
  1. #
  2. #Wed Feb 25 16:34:37 CST 2015
  3. 李朝=黑马
  4. 马士兵=北京尚学堂
  5. time=5
  6. 毕向东=黑马程序员
  7. 马程序员
复制代码
为什么控制台会输出乱码?10个字节不够汉字吗?
还有就是p.txt后面怎么多出来这么几个字:马程序员




作者: liaohongjie    时间: 2015-2-25 17:46
这个是编码问题,可能是写入文本的解码与控制台的解码不是相同的,这样就会出现乱码,你重新试试指定编码进行输出看看呢!都用GBK
作者: 关山明月    时间: 2015-2-25 20:54
呃,我试了下,将byte数组长度改成了100,然后p.txt文件就正常了,控制台输出也没有乱码了,应该是长度不够,毕竟一个汉字占两个字节,如果当数组第十个长度为某汉字的第一个字节时,就无法正常输入汉字了。
我将prop.txt中汉字去掉,全部使用字母,然后byte数组长度还是用10个长度,最后控制台和p.txt文件就都没有乱码和多出来的内容了。

但是,上面两个实验都有个问题,就是控制台输出时,每一行下面都多了一个空白行,试了半天没弄明白,等待高手解决!
作者: mengxiang1993    时间: 2015-2-26 12:01
我修改了下原来的代码:
fos.write(b, 0, len);  然后每次只读一个字节,奇怪的是,p.txt竟然汉字正确显示,控制台依然乱码,求解释。
  1. package day20;

  2. import java.io.*;

  3. public class FileStreamDemo {

  4.         public static void main(String[] args) throws IOException,
  5.                         InterruptedException {
  6.                 File f = new File("prop.txt");

  7.                 FileInputStream fis = new FileInputStream(f);

  8.                 // OutputStreamWriter fos = new OutputStreamWriter(new
  9.                 // FileOutputStream("p.txt"),"UTF-8");
  10.                 FileOutputStream fos = new FileOutputStream("p.txt");
  11.         
  12.                 byte[] b = new byte[1];
  13.                 int len;
  14.                 while ((len = fis.read(b)) != -1) {
  15.                         System.out.print(len);
  16.                         String s = new String(b, 0, len);
  17.                         System.out.print(s);
  18.                         // Thread.sleep(5000);
  19.                         fos.write(b, 0, len);
  20.                         fos.flush();

  21.                 }

  22.                 fis.close();
  23.                 fos.close();
  24.         }

  25. }
复制代码
控制台:
  1. 1#1
  2. 1
  3. 1#1W1e1d1 1F1e1b1 12151 11161:13141:13171 1C1S1T1 121011151
  4. 1
  5. 1?1?1?1?1=1?1?1?1?1
  6. 1
  7. 1?1?1?1?1?1?1=1?1?1?1?1?1?1?1?1?1?1
  8. 1
  9. 1t1i1m1e1=151
  10. 1
  11. 1?1?1?1?1?1?1=1?1?1?1?1?1?1?1?1?1?1?1?1?1?1
  12. 1
复制代码
p.txt如下:
  1. #
  2. #Wed Feb 25 16:34:37 CST 2015
  3. 李朝=黑马
  4. 马士兵=北京尚学堂
  5. time=5
  6. 毕向东=黑马程序员导师
复制代码






作者: mengxiang1993    时间: 2015-2-26 12:04
关山明月 发表于 2015-2-25 20:54
呃,我试了下,将byte数组长度改成了100,然后p.txt文件就正常了,控制台输出也没有乱码了,应该是长度不够 ...

你是不是输出的时候用println了
作者: 关山明月    时间: 2015-2-26 15:03
mengxiang1993 发表于 2015-2-26 12:04
你是不是输出的时候用println了

没有,如果是用的println的话,而prop.txt中某一行的字母个数大于byte数组长度10的话,这行在控制台输出第10个长度后那里换行的。

刚才在另一台电脑上重新试了下,又没有了昨晚上那个每行下有空白行的问题了。。。。。奇怪。。




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