黑马程序员技术交流社区

标题: 一道测试题求解 [打印本页]

作者: 马超(Andy)    时间: 2014-10-18 11:48
标题: 一道测试题求解
一道入学测试题,都看看大家都咋写的?
5.定义一个文件输入流,调用read(byte[]b)方法将exercise.txt文件中的所有内容,打印出来(byte数组的大小限制为5,不考虑中文编码问题)

就是没明白不考虑中文编码是啥意思.....


作者: 马超(Andy)    时间: 2014-10-18 11:49
先附上我的解法,感觉有欠缺,总觉得题没理解,求正解

  1. package com.itheima;

  2. import java.io.ByteArrayOutputStream;
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.FileNotFoundException;
  6. import java.io.IOException;

  7. /**
  8. * 5.定义一个文件输入流,调用read(byte[]b)方法将exercise.txt文件中的所有内容
  9. * 打印出来(byte数组的大小限制为5,不考虑中文编码问题)
  10. * @author 马超(Andy)
  11. */
  12. /*
  13. * 分析:
  14. * 1.先把exercise.txt文件封装成一个File对象(此处就用相对路径了),待文件输入流使用
  15. *
  16. * 2.此题中源是:文件输入流, 源设备:硬盘文件
  17. * 目的是:字节数组输出流, 最终目的是打印,也就是控制台,但是题中给的缓存数组长度为5 这样如果文件内有汉字,就有可能读取半个汉字,那么就需要
  18. * ByteArrayOutputStream流做 一个缓存,所以此处的目的应该是ByteArrayOutputStream流
  19. *
  20. * 3.定义一个文件输入流,关联File文件
  21. *
  22. * 4.定义一个缓存数组,长度为5.
  23. *
  24. * 5.定义一个ByteArrayOutputStream流对象,因为定义的缓存数组长度是5,在解码时如果有汉字则容易出现乱码。
  25. * 所以要用ByteArrayOutputStream流,把缓存输出到ByteArrayOutputStream流
  26. * 通过ByteArrayOutputStream流方法进行打印输出
  27. *
  28. * 6.调用read(byte[]b)方法,读取exercise.txt文件内数据进byte数组
  29. *
  30. * 7.将byte[]数组的字节写入入ByteArrayOutputStream流中
  31. *
  32. * 8.将ByteArrayOutputStream流内的字节数据按照默认编码表转化为字符串并打印出来
  33. *
  34. * 9.重置ByteArrayOutputStream流内缓存数据
  35. *
  36. * 10.关闭关联资源流
  37. *
  38. */
  39. public class Test5 {
  40.         public static void main(String[] args) {

  41.                 // 把要操作的文件封装成一个File文件
  42.                 File file = new File("exercise.txt");

  43.                 // 创建文件输入流的引用
  44.                 FileInputStream input = null;

  45.                 try {
  46.                         // 创建文件输入流,关联资源文件
  47.                         input = new FileInputStream(file);

  48.                         // 定义一个ByteArrayOutputStream流缓存字节数组
  49.                         ByteArrayOutputStream bytearray = new ByteArrayOutputStream();

  50.                         // 定义一个长度为5缓存数组
  51.                         byte[] bufbytes = new byte[5];

  52.                         // 定义一个结束标记变量
  53.                         int len = 0;

  54.                         // 开始循环读取文件数据,若读到-1说明文件读取结束
  55.                         while ((len = input.read(bufbytes)) != -1) {

  56.                                 // 将读入到byte数组的字节写入字节数组输出流
  57.                                 bytearray.write(bufbytes, 0, len);
  58.                         }

  59.                         // 将字节数组输出流内的缓存按照默认编码表转换为字符串
  60.                         String string = bytearray.toString();

  61.                         // 输出字符串
  62.                         System.out.println(string);

  63.                         // 重置字节数组输出流
  64.                         bytearray.reset();

  65.                 } catch (FileNotFoundException e) {

  66.                         // 文件关联异常
  67.                         System.out.println("没有找到文件!");
  68.                         e.printStackTrace();
  69.                 } catch (IOException e) {

  70.                         // 文件读取失败
  71.                         System.out.println("文件读取异常!");
  72.                         e.printStackTrace();
  73.                 } finally {

  74.                         // 关闭流资源
  75.                         if (input != null) {
  76.                                 try {
  77.                                         input.close();
  78.                                 } catch (IOException e) {

  79.                                         // 流关闭失败
  80.                                         System.out.println("流关闭失败!");
  81.                                         e.printStackTrace();
  82.                                 }
  83.                         }
  84.                 }
  85.         }
  86. }
复制代码

作者: yueyazhishang    时间: 2014-10-18 12:14
我想意思大概是不考了文件的字符编码,windows默认的编码是GBK,意思是不是不考虑你数据源的编码是其他码表。我的理解
作者: yueyazhishang    时间: 2014-10-18 13:22
我来给楼主提供一种精简的解法
  1.         @Test
  2.         public void testReadAndPrint()
  3.         {
  4.                 File f=new File("E:\\exercise.txt");
  5.                
  6.                 FileInputStream fis;
  7.                 BufferedOutputStream bos;
  8.                 try {
  9.                         fis = new FileInputStream(f);
  10.                         //字节大小任意
  11.                         byte by[]=new byte[5];
  12.                         int len=0;
  13.                         bos=new BufferedOutputStream(System.out);//为bos指定输出目标
  14.                         while((len=fis.read(by))!=-1)
  15.                         {
  16.                                 bos.write(by, 0, len);
  17.                         }
  18.                         fis.close();
  19.                         bos.close();
  20.                 } catch (FileNotFoundException e) {
  21.                         System.out.println("文件找不到!");
  22.                 } catch (IOException e) {
  23.                         System.out.println("文件读写异常!");
  24.                 }
  25.         }
复制代码




作者: java_dream    时间: 2014-10-18 13:27
本帖最后由 java_dream 于 2014-10-18 13:28 编辑

就是说不考虑打印结果是否乱码
作者: 泡沫__opt    时间: 2014-10-18 13:42
就是字符流吧~~
作者: 马超(Andy)    时间: 2014-10-18 14:59
yueyazhishang 发表于 2014-10-18 13:22
我来给楼主提供一种精简的解法

搜噶,明白了,我太执着于“打印了”:'(
作者: yueyazhishang    时间: 2014-10-18 15:41
马超(Andy) 发表于 2014-10-18 14:59
搜噶,明白了,我太执着于“打印了”

你报的是云十三期?
作者: 马超(Andy)    时间: 2014-10-18 18:52
yueyazhishang 发表于 2014-10-18 15:41
你报的是云十三期?

嗯 没面试呢...
仁兄呢?
作者: SenGoo    时间: 2014-10-18 19:44
你这是从哪弄的代码啊?
作者: 马超(Andy)    时间: 2014-10-18 19:47
SenGoo 发表于 2014-10-18 19:44
你这是从哪弄的代码啊?

代码?自己写的啊。题是我入学测试。。。。
作者: SenGoo    时间: 2014-10-18 19:50
马超(Andy) 发表于 2014-10-18 19:47
代码?自己写的啊。题是我入学测试。。。。

ByteArrayOutputStream这个视频里好像没加讲过!
作者: 马超(Andy)    时间: 2014-10-18 20:04
SenGoo 发表于 2014-10-18 19:50
ByteArrayOutputStream这个视频里好像没加讲过!

没讲过吗?忘了:L  
作者: SenGoo    时间: 2014-10-18 21:43
马超(Andy) 发表于 2014-10-18 20:04
没讲过吗?忘了

不记得了!
作者: 潘杰    时间: 2014-10-18 22:17
意思就是用默认的编码,不用考虑编码的转换问题
作者: yueyazhishang    时间: 2014-10-19 00:17
马超(Andy) 发表于 2014-10-18 18:52
嗯 没面试呢...
仁兄呢?

我的时间安排不开,准备14期。一起努力吧
作者: 七弟    时间: 2014-10-19 13:55
14期滴干活!!!!!!!!!!!!!
作者: maralbertlee    时间: 2014-10-24 10:31
yueyazhishang 发表于 2014-10-18 13:22
我来给楼主提供一种精简的解法

这个代码我喜欢,是很精简,而且比较好懂。是不是BufferedOutputStream比OutputStream更好用点?
作者: yueyazhishang    时间: 2014-10-24 10:48
maralbertlee 发表于 2014-10-24 10:31
这个代码我喜欢,是很精简,而且比较好懂。是不是BufferedOutputStream比OutputStream更好用点? ...

BufferedOutputStream是带缓存的,效率要高一点。对于小文件没有什么差别。
作者: maralbertlee    时间: 2014-10-24 10:51
yueyazhishang 发表于 2014-10-24 10:48
BufferedOutputStream是带缓存的,效率要高一点。对于小文件没有什么差别。

哦哦~我还没看到这块呢!以前有接触过,就问问,学习下!
作者: yueyazhishang    时间: 2014-10-24 10:52
maralbertlee 发表于 2014-10-24 10:51
哦哦~我还没看到这块呢!以前有接触过,就问问,学习下!

一步一个脚印学就是了
作者: maralbertlee    时间: 2014-10-24 11:01
yueyazhishang 发表于 2014-10-24 10:52
一步一个脚印学就是了

必须的,好好学习,天天向上!
作者: chensc    时间: 2014-10-24 19:21
学习学习!
作者: wst123    时间: 2014-10-24 19:25
多注意总结!
作者: relive    时间: 2014-10-24 19:41
这一题要想拿满分要注意一个点,数组大小限制为5则源文件的格式会被破坏,因此需要对获取的数据进行解析
作者: Johnny_Hu    时间: 2015-4-28 21:39
yueyazhishang 发表于 2014-10-18 13:22
我来给楼主提供一种精简的解法

需要打印什么值出来呢  
这道题 我现在就是在纠结这点
作者: 安日成    时间: 2015-5-3 17:03
这个我只能说我还在学习中
作者: miss_huaxin    时间: 2015-6-1 19:21
赞一个~~~~
作者: heisedelangzi    时间: 2015-6-17 21:48
我今天也做到你这个问题了。不过没有那想的样,我要处理字符编码的问题。
作者: heisedelangzi    时间: 2015-6-17 21:59
就简单的被我解决了。
作者: RockLee    时间: 2015-6-19 20:01
来看看:)




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