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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 胡勇敏 于 2013-1-11 17:31 编辑

自己写了个BufferedInputStream的包装类,代码如下,但是运行结果复制出来的文件的大小却不一样。不过我试了下 复制出来的mp3文件能正常播放。我的操作系统是WIN7 32位旗舰版,不知道这种现象是不是跟操作系统有关呢?
  1. import java.io.*;
  2. class MyBufferedInputStream
  3. {
  4. private InputStream in;
  5. private byte [] byt = new byte[1024*4];//定义缓冲区为4kb
  6. private int count = 0, pos = 0;
  7. //封装传进来的InputStream
  8. MyBufferedInputStream(InputStream in)
  9. {
  10. this.in = in;
  11. }
  12. //定义自己的读取函数
  13. public int myRead() throws IOException
  14. {
  15. //当缓冲区为空时 读入数据到缓冲区
  16. if(count == 0)//判断缓冲区是否为空的标准是count是否为0
  17. {
  18. //当要读入缓冲区数据时需要将指针复位
  19. pos = 0;
  20. count = in.read(byt);
  21. //当输入流中的数据没有时直接返回-1
  22. if(count < 0)
  23. return -1;
  24. byte b = 0;
  25. b = byt[pos];
  26. pos++;
  27. count--;

  28. return b&255;
  29. }
  30. else if (count > 0)//当缓冲区不为空的时候,直接读取缓冲区中的数据返回。
  31. {
  32. byte b = byt[pos];
  33. pos++;
  34. count--;

  35. return b&255;
  36. }
  37. return -1;
  38. }

  39. public void myClose() throws IOException
  40. {
  41. in.close();
  42. }
复制代码
  1. import java.io.*;
  2. class MyBufferedInputStreamTest
  3. {
  4. public static void main(String[] args)
  5. {
  6. long start = System.currentTimeMillis();
  7. //copyMp3_1();
  8. copyMp3_2();
  9. long end = System.currentTimeMillis();
  10. System.out.println(end - start);
  11. }

  12. //第一种方式拷贝
  13. public static void copyMp3_1()
  14. {
  15. MyBufferedInputStream mbfi = null;
  16. BufferedOutputStream bos = null;

  17. try
  18. {
  19. mbfi = new MyBufferedInputStream(new FileInputStream("G:\\1.mp3"));
  20. bos = new BufferedOutputStream(new FileOutputStream("G:\\3.mp3"));
  21. int b = 0;
  22. while ((b=mbfi.myRead()) != -1)
  23. {
  24. bos.write(b);
  25. }
  26. }
  27. catch (IOException e)
  28. {
  29. System.out.println(e);
  30. }
  31. }
  32. //第二种方式拷贝
  33. public static void copyMp3_2()
  34. {
  35. BufferedInputStream mbfi = null;
  36. BufferedOutputStream bos = null;

  37. try
  38. {
  39. mbfi = new BufferedInputStream(new FileInputStream("G:\\1.mp3"));
  40. bos = new BufferedOutputStream(new FileOutputStream("G:\\3.mp3"));
  41. int b = 0;
  42. while ((b=mbfi.read()) != -1)
  43. {
  44. bos.write(b);
  45. }
  46. }
  47. catch (IOException e)
  48. {
  49. System.out.println(e);
  50. }
  51. }
  52. }
复制代码
我初步怀疑是操作系统的问题,可惜手头只有一台电脑,哪位操作系统跟我不同的帮我验证下。

未命名2.jpg (43.21 KB, 下载次数: 41)

未命名2.jpg

9 个回复

正序浏览
胡勇敏 发表于 2013-1-11 17:49
FileOutputStream本身就是字节流中的OutputSream的子类。拷贝文件不是不能用字符流,一些文本文件用字符 ...


受教了.. 改天有空 我就把SE基础拿起来再复习下.. 因为每天写入的操作多了.. 应该是记错了.. 多谢哥们:loveliness:
回复 使用道具 举报
张云杰 发表于 2013-1-11 17:41
没错吧??? 难道不是用FileOutputSteam来操作? 我记得老师好像是这样说的 , 不过 拷贝文件 好像不能用字 ...

FileOutputStream本身就是字节流中的OutputSream的子类。拷贝文件不是不能用字符流,一些文本文件用字符流可以提高效率。但是字符流只试用于文本文件,它底层其实用的也是字节流的东西。而拷贝一些数据文件比如像mp3、图片、电影等的要使用字节流。如果用字符流去读写这些文件的话,会出现数据无法还原的问题,因为字符流写出的时候会参照编码表,而单纯的数据文件读出的数据如果在编码表中没有对应的内容时,字符流会自动找相近编码的内容,这样读出的数据跟写入的数据就会出现不一致。
回复 使用道具 举报
多谢哥们受教..
回复 使用道具 举报
胡勇敏 发表于 2013-1-11 17:36
我只能说 哥们好好看看 毕老师的视频吧 里面有比较详细的解释 你正好理解反了。具体请参见 毕老师的基础 ...

没错吧??? 难道不是用FileOutputSteam来操作? 我记得老师好像是这样说的 , 不过 拷贝文件 好像不能用字符流... 我错了..
回复 使用道具 举报
张云杰 发表于 2013-1-11 17:33
没差别,因为用字符流可以把文件里的东西完完整整的拷贝过来, 而且, 相对来说, 字节流里有些东西是读不上 ...

我只能说 哥们好好看看 毕老师的视频吧 里面有比较详细的解释 你正好理解反了。具体请参见 毕老师的基础视频19天第11段以下的几段内容。
回复 使用道具 举报
本帖最后由 张云杰 于 2013-1-11 17:42 编辑
胡勇敏 发表于 2013-1-11 17:21
我复制的是MP3文件 你觉得用字符流合适么?


用字符流可以把文件里的东西完完整整的拷贝过来, 而且, 相对来说, 字节流里有些东西是读不上来的,比如说 有乱码文字... 根本就读不上来, 这是我自己的理解..

Text操作..
回复 使用道具 举报
我的神啊 原谅我吧 我木有关闭流,所以有些数据未写出。血的教训啊 各位千万记得关闭资源啊!
回复 使用道具 举报
张云杰 发表于 2013-1-11 17:11
建议换成 字符流去做, 这样代码贴上来 很难找出到底是哪里错了..  因为字节流里有可能出现有些字节读取不上 ...

我复制的是MP3文件 你觉得用字符流合适么?
回复 使用道具 举报
本帖最后由 张云杰 于 2013-1-11 17:39 编辑

好吧, 我承认 这不科学.....
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马