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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© just_nnnnx 中级黑马   /  2013-12-27 21:42  /  1216 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 just_nnnnx 于 2013-12-28 08:31 编辑
  1. import java.io.*;
  2. import java.util.*;
  3. class Test
  4. {
  5.         public static void main(String[] args) throws IOException
  6.         {
  7.                 splitFiles();
  8.                 merge();
  9.         }

  10.         public static void splitFiles()throws IOException
  11.         {
  12.                 FileInputStream fis = new FileInputStream("d:\\1.jpg");

  13.                 FileOutputStream fos = null;               
  14.                 byte[] by = new byte[1024*10];
  15.                 int line = 0;
  16.                 int count = 1;

  17.                 while((line = fis.read(by))!=-1)
  18.                 {
  19.                         fos = new FileOutputStream("d:\\splitFiles\\"+(count++)+".part");
  20.                         fos.write(by,0,line);
  21.                         fos.close();
  22.                 }

  23.                 fis.close();
  24.         }

  25.         public static void merge()throws IOException
  26.         {
  27.                 Vector<FileInputStream> vt = new Vector<FileInputStream>();
  28.                 File file = new File("d:\\splitFiles");
  29.                 File[] files = file.listFiles();

  30.                 for(File f : files)
  31.                 {
  32.                         FileInputStream fis = new FileInputStream(f);
  33.                         vt.add(fis);
  34.                 }

  35.                 Enumeration<FileInputStream> en = vt.elements();

  36.                 SequenceInputStream sis = new SequenceInputStream(en);               

  37.                 FileOutputStream fos = new FileOutputStream("d:\\splitFiles\\merge.jpg");

  38.                 byte[] bt = new byte[1024*10];
  39.                 int num = 0;

  40.                 while((num = sis.read(bt))!=-1)
  41.                 {
  42.                         fos.write(bt,0,num);
  43.                         fos.flush();
  44.                 }

  45.                 fos.close();
  46.                 sis.close();

  47.         }
  48. }
复制代码
这是个图片切割合并的代码,分割成part的时候是可以的,然后合并的时候问题出现了,当目标文件名称是数字时,比如1.jpg,重复运行也没有问题,但如果目标文件总称是英文,比如上面的merge.jpg时,第一次运行,结果是可行的,但如果再次运行,刚会一直在往目标文件中读流,停不下来,ctrl+c停下来后,会发现目标文件很大很大,时间运行的越久 ,文件越大,请问这是什么原因?

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

4 个回复

倒序浏览
把merge()方法中的fos输出流改到其他文件夹,不要在你读取的那个文件夹中存放就可以了,
你这样一边度一边写到这个文件夹,能不大就怪了,相当于死循环了,读不完的文件
回复 使用道具 举报
(0.0)’ 发表于 2013-12-27 22:38
把merge()方法中的fos输出流改到其他文件夹,不要在你读取的那个文件夹中存放就可以了,
你这样一边度一边 ...

把36行加一下文件类型判定就行了,
                 for(File f : files)
                {
                        if(f.getName().endsWith(".part"))
                        {
                                FileInputStream fis = new FileInputStream(f);
                                vt.add(fis);
                        }
                }

但是之前如果再执行的话,理论上应该只是文件由4M变8M,执行一次,增加一倍才对,怎么好像出现了乱流,执行一次,流在持续写入,文件在无限增加,这又是什么原因呢?
回复 使用道具 举报
把fos.flush();去掉就可以了
回复 使用道具 举报
just_nnnnx 发表于 2013-12-28 08:30
把36行加一下文件类型判定就行了,
                 for(File f : files)
                {

你一次只读10K的,写也只写10k,怎么会按M来增加呢?
如果还是不明白,你可以断点调试,看看每运行一次是增加多少,
要是没安装eclipse工具,你就使用Thread.sleep();方法让线程等等一段事件,你看增加的字节是多少增加的。
不过注意这个方法有异常,可以catch住
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马