黑马程序员技术交流社区

标题: <入学测试剖析>如何用字节流来打印一篇文本文件? [打印本页]

作者: hejinzhong    时间: 2014-8-6 15:39
标题: <入学测试剖析>如何用字节流来打印一篇文本文件?
本帖最后由 hejinzhong 于 2014-8-6 16:05 编辑

用字节流复制一分文本文件没有问题,但要求一句一句打印在屏幕上,就有可能将某个字符搞乱,怎么破?!
说下我的疑惑:
如果字节流利用字节数组来读取打印英文文本或者一切字节流文件,都是没问题的。而且复制文本文件也没有问题。但是如果打印文本,由于可能一次没有把一个中文读完就打印了,就回导致一连串的乱码!!
对于疑惑中不明白的可以问!求解决这个问题

作者: hejinzhong    时间: 2014-8-6 15:47
本帖最后由 hejinzhong 于 2014-8-6 15:57 编辑

举个例子来说:


  1. import java.io.*;
  2. public class Test7 {

  3.         public static void main(String[] args) {
  4.                
  5.                 readFile(new File("exercise.txt"));
  6.         }
  7.         public static void readFile(File fileName){        
  8.                 FileInputStream fis = null;
  9.                 FileOutputStream fos = null;
  10.                 try {
  11.                         fis = new FileInputStream(fileName);
  12.                         fos = new FileOutputStream("hah.txt");
  13.                         byte[] buf = new byte[5];
  14.                         int len = 0;
  15.                         while((len=fis.read(buf))!=-1){
  16.                                 fos.write(buf,0,len);//这句是写入文件
  17.                                 System.out.print(new String(buf,0,len));//这句打印
  18.                         }
  19.                 } catch (Exception e) {
  20.                         throw new RuntimeException("读取失败");
  21.                 }
  22.                 finally{
  23.                         try {
  24.                                 fis.close();
  25.                         } catch (IOException e) {
  26.                                 throw new RuntimeException("读取流关闭失败");
  27.                         }
  28.                         try {
  29.                                 if(fos!=null)
  30.                                         fos.close();
  31.                         } catch (IOException e) {
  32.                                 throw new RuntimeException("写入流关闭失败");
  33.                         }
  34.                 }
  35.         }
  36. }//下面是几个对比
复制代码



作者: jiangweibin2573    时间: 2014-8-6 16:10
一连串的乱码怎么弄?
作者: fantacyleo    时间: 2014-8-6 16:12
我还以为你只是想输出时用字节流,没想到你连读取也是字节流。。。这个貌似做不到。除非有一个字节流能在读入时就能指定字符集,或者一个足够大的byte数组将整个文件内容读入,否则没法保证每一次读入都恰好读取了完整的字符,乱码也就不可避免了。
作者: hejinzhong    时间: 2014-8-6 16:17
fantacyleo 发表于 2014-8-6 16:12
我还以为你只是想输出时用字节流,没想到你连读取也是字节流。。。这个貌似做不到。除非有一个字节流能在读 ...

你说的这些假设成立就没问题,但是我现在难题是:用一个 byte[5] 大小的字节数组,利用read(byte[])方法来打印txt文件。
作者: fantacyleo    时间: 2014-8-6 16:28
hejinzhong 发表于 2014-8-6 16:17
你说的这些假设成立就没问题,但是我现在难题是:用一个 byte[5] 大小的字节数组,利用read(byte[])方 ...

所以我说做不到啊,这个真的难为字节流了,还是用字符流吧。当然,对你给的这个文件来说,如果连标点也是中文,而且是GBK编码,倒是可以投机取巧一下,把buf长度设为2的倍数,利用GBK对中文编码长度固定为2字节的特点规避乱码的出现
作者: hejinzhong    时间: 2014-8-6 16:30
fantacyleo 发表于 2014-8-6 16:28
所以我说做不到啊,这个真的难为字节流了,还是用字符流吧。当然,对你给的这个文件来说,如果连标点也是 ...

嗯,我把长度改为偶数可以顺利解决这个问题,但是坑爹的就是,使用固定大小的数组。

作者: hejinzhong    时间: 2014-8-6 16:32
fantacyleo 发表于 2014-8-6 16:28
所以我说做不到啊,这个真的难为字节流了,还是用字符流吧。当然,对你给的这个文件来说,如果连标点也是 ...


作者: fantacyleo    时间: 2014-8-6 16:41
hejinzhong 发表于 2014-8-6 16:32

额,人家题目没要求一句句输出嘛。既然没有要求,那么用ByteArrayOutputStream就可以了,它内部的字节数组可以自动扩充,你read(buf)后直接往ByteArrayOutputStream里写,最后用ByteArrayOutputStream的toString输出,还可以指定字符集
作者: hejinzhong    时间: 2014-8-6 16:51
fantacyleo 发表于 2014-8-6 16:41
额,人家题目没要求一句句输出嘛。既然没有要求,那么用ByteArrayOutputStream就可以了,它内部的字节数 ...

嗯,是可以这么解决。还有点疑问,就是能不能无限增长这个ByteArrayOutputStream的缓冲数组大小?
作者: fantacyleo    时间: 2014-8-6 16:58
hejinzhong 发表于 2014-8-6 16:51
嗯,是可以这么解决。还有点疑问,就是能不能无限增长这个ByteArrayOutputStream的缓冲数组大小? ...

无限是不可能的,它的size方法返回值类型是int,也就是不可能超过int的最大值




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