A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 马超(Andy) 中级黑马   /  2014-10-18 11:48  /  4785 人查看  /  30 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

一道入学测试题,都看看大家都咋写的?
5.定义一个文件输入流,调用read(byte[]b)方法将exercise.txt文件中的所有内容,打印出来(byte数组的大小限制为5,不考虑中文编码问题)

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

评分

参与人数 1技术分 +1 收起 理由
王震阳老师 + 1 赞一个!

查看全部评分

30 个回复

倒序浏览
先附上我的解法,感觉有欠缺,总觉得题没理解,求正解

  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. }
复制代码
回复 使用道具 举报 1 0
我想意思大概是不考了文件的字符编码,windows默认的编码是GBK,意思是不是不考虑你数据源的编码是其他码表。我的理解
回复 使用道具 举报
我来给楼主提供一种精简的解法
  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.         }
复制代码



评分

参与人数 1技术分 +1 收起 理由
王震阳老师 + 1 赞一个!

查看全部评分

回复 使用道具 举报 2 0
本帖最后由 java_dream 于 2014-10-18 13:28 编辑

就是说不考虑打印结果是否乱码
回复 使用道具 举报
就是字符流吧~~
回复 使用道具 举报
yueyazhishang 发表于 2014-10-18 13:22
我来给楼主提供一种精简的解法

搜噶,明白了,我太执着于“打印了”:'(
回复 使用道具 举报
马超(Andy) 发表于 2014-10-18 14:59
搜噶,明白了,我太执着于“打印了”

你报的是云十三期?
回复 使用道具 举报
yueyazhishang 发表于 2014-10-18 15:41
你报的是云十三期?

嗯 没面试呢...
仁兄呢?
回复 使用道具 举报
SenGoo 中级黑马 2014-10-18 19:44:33
10#
你这是从哪弄的代码啊?
回复 使用道具 举报
SenGoo 发表于 2014-10-18 19:44
你这是从哪弄的代码啊?

代码?自己写的啊。题是我入学测试。。。。
回复 使用道具 举报
SenGoo 中级黑马 2014-10-18 19:50:27
12#
马超(Andy) 发表于 2014-10-18 19:47
代码?自己写的啊。题是我入学测试。。。。

ByteArrayOutputStream这个视频里好像没加讲过!
回复 使用道具 举报
SenGoo 发表于 2014-10-18 19:50
ByteArrayOutputStream这个视频里好像没加讲过!

没讲过吗?忘了:L  
回复 使用道具 举报
SenGoo 中级黑马 2014-10-18 21:43:13
14#

不记得了!
回复 使用道具 举报
潘杰 中级黑马 2014-10-18 22:17:22
15#
意思就是用默认的编码,不用考虑编码的转换问题
回复 使用道具 举报
马超(Andy) 发表于 2014-10-18 18:52
嗯 没面试呢...
仁兄呢?

我的时间安排不开,准备14期。一起努力吧
回复 使用道具 举报
七弟 中级黑马 2014-10-19 13:55:48
17#
14期滴干活!!!!!!!!!!!!!
回复 使用道具 举报
yueyazhishang 发表于 2014-10-18 13:22
我来给楼主提供一种精简的解法

这个代码我喜欢,是很精简,而且比较好懂。是不是BufferedOutputStream比OutputStream更好用点?
回复 使用道具 举报
maralbertlee 发表于 2014-10-24 10:31
这个代码我喜欢,是很精简,而且比较好懂。是不是BufferedOutputStream比OutputStream更好用点? ...

BufferedOutputStream是带缓存的,效率要高一点。对于小文件没有什么差别。
回复 使用道具 举报
yueyazhishang 发表于 2014-10-24 10:48
BufferedOutputStream是带缓存的,效率要高一点。对于小文件没有什么差别。

哦哦~我还没看到这块呢!以前有接触过,就问问,学习下!
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马