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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄嵘才 中级黑马   /  2012-12-27 11:34  /  1234 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 esirong 于 2012-12-27 13:51 编辑

我依着教材做一个分割文件的方法。
我发现我切割出的文件总容量大于原文件。
fos.write(buffer,0,len);//
fos.write(buffer); //这个。
这个会让我的文件大小不能完全一致。我想,我的缓冲没有那么多内容,总容量又怎么会大于原先的文件?
但是我这样写运行也没有问题,拷贝后MP3能正常播放,而且大小也和源文件一模一样,我想知道为什么会这样
代码:
  1. public static void cut(File file,int SIZE) throws IOException{
  2.                 /*
  3.                  * 1.创建文件输入流。输出流
  4.                  * 2.根据分割常量,定义一个缓冲大小。
  5.                  * 3.将文件读入缓冲流。读満即输出到输出流。直到文件尾。
  6.                  *
  7.                  */
  8.                 //定义一个目录
  9.                 File parent = new File("part");
  10.                 if(!parent.exists()){
  11.                         parent.mkdirs();
  12.                 }
  13.                 FileInputStream fis = new FileInputStream(file);
  14.                 FileOutputStream fos = null;
  15.                 byte[] buffer = new byte[SIZE];
  16.                 int len = 0;
  17.                 int count = 1;
  18.                 while((len=fis.read(buffer)) != -1){
  19.                         fos = new FileOutputStream(new File(parent,count+".part"));
  20.                         <font color="Red">fos.write(buffer,0,len);</font>//<font color="Red">fos.write(buffer);</font> 看这里。
  21.                         count++;
  22.                 }
  23.                 fos.close();
  24.                 fis.close();
  25.                
  26.         }
  27. }
复制代码

3 个回复

倒序浏览
21个技术分了还问这个问题啊?

假设 你的文件有1234个byte。
你定义的buf是200个byte。
fos.write(buffer,0,len);//len在前6次的时候是200,最后一次len是34
fos.write(buffer);//每次都是200,最后一次多出来的166是上一次的buf里的后166个byte,没有被刷新的。

所以前一种做法是正确的,后一种做法是不靠谱的(除非你原始文件大小恰好被你定义的zise整除)。
回复 使用道具 举报
对于mp3能够正常播放。 你这样想把。 你有一本书, 用分割的方法把书分割了。 假若是fos.write(buffer)这种方法。
第一份书的碎片是包含书的封面的。最后一份书的封面是包含封底的(虽然封底后面可能还有有些正文页面)。你又拿着拼好的书去看,发现有封面,就可以看了,看到封底,就知道看完了。后面的也就不需要再看了。
MP3文件应该也有自己的格式,什么地方是开始,什么地方是结束。
你切割一个视频,然后把第一段放到播放器里去,会发现播放器显示的总长度和原视频是一样的,但拖到后面,因为对应的数据不在这个文件中,也是没发看的。
回复 使用道具 举报
视频文件里包括图像、声音、字母等。 它们分布在这个文件的不同地方,播放器需要去找(具体格式不清楚,定义对应内容在那里的字段应该在文件的最前面)。如果把视频文件分割了,被分割后的文件是很难具有独立的被完整播放的能力的。

举个不恰当的例子,一个人,把它分成5份,是不可能成为5个具备独立完整功能的。因为实现某一功能的器官,被分到不同的部分中去了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马