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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李贺晓 中级黑马   /  2013-1-16 15:55  /  1865 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李贺晓 于 2013-1-17 14:18 编辑

这道程序实现的目标是“将一个目录下的所有txt类型的文本文件中的内容合并到若干个新的文本文件中,当第一个新产生的文件中存储的内容大道1M时,剩下的内容存储到第二个新的文件中,依次往下,新产生的文本文件的名字依次是1.txt,2.txt......”
下面是我编写的代码:
import java.io.*;
import java.util.*;
public class StreamTest {

        /**
         * @param args
         */
        public static void main(String[] args)throws Exception {
                // TODO Auto-generated method stub
     getFile("e:\\lihexiao");
        }
        public static void getFile(String str) throws Exception
        {
                //定义一个Vector集合,只能往里添加InputStream类型的对象
                Vector<InputStream> v=new Vector<InputStream>();
                int i=1;
                File f=new File(str);
                //定义一个缓存数组,大小为1024字节
                byte[] by=new byte[1024];
                FileInputStream fis=null;
                FileOutputStream fos=null;
                //获取此文件目录下所有的txt文件
                String[] fileNames=f.list(new FilenameFilter()
                {
                        public boolean accept(File f,String name)
                        {
                                if(name.endsWith(".txt"))
                                        return true;
                                else
                                        return false;
                        }
                        });
                        for(String fileName:fileNames)        
                        {
                                //建立读取流对象
                                fis=new FileInputStream(str+"\\"+fileName);
                                //将所有的读取流对象添加到Vector集合中
                                v.add(fis);
                        }
                Enumeration<InputStream> e=v.elements();
                //定义序列流,将多个流对象合并成一个流
                SequenceInputStream se=new SequenceInputStream(e);
                int len=0;
                while((len=se.read(by))!=-1)
                {
                        //将序列流中的数据读取到多个文件中,每个文件大小为1024字节
                        fos=new FileOutputStream(str+"\\"+(i++)+".txt");
                        fos.write(by,0,len);
                        
                }
                fis.close();
                fos.close();

        }
}

最后生成的几个文件为什么不正确呢,按照我的程序得到的结果是,如果lihexiao目录下的txt文件大于1M的话会自动分隔,如果小于1M的话会自动把这个不到1M的文件内容存入到一个in的文件中,我的程序的错误在哪里?求指点啊

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

9 个回复

倒序浏览
设置一个临时文件就可以了,不知道还有没有其他的方式,感觉临时文件比较麻烦
回复 使用道具 举报
最后文件生成是什么样子的
回复 使用道具 举报
本帖最后由 惠晖 于 2013-1-17 23:40 编辑

头大了
回复 使用道具 举报
兄弟这个题目3人搞了4 5个小时楞是没搞出来啊    高手在那里  
回复 使用道具 举报
李贺晓 发表于 2013-1-17 14:19
设置一个临时文件就可以了,不知道还有没有其他的方式,感觉临时文件比较麻烦 ...

最后捉摸了半天,这个方法是最简单的了 苍天啊 来点高手来解答问题吧
回复 使用道具 举报
舒远 黑马帝 2013-1-18 10:28:04
7#
  1. import java.io.File;
  2. import java.io.FileInputStream;
  3. import java.io.FileOutputStream;
  4. import java.io.FilenameFilter;
  5. import java.io.InputStream;
  6. import java.io.SequenceInputStream;
  7. import java.util.Enumeration;
  8. import java.util.Vector;

  9. public class StreamTest {
  10.         public static void main(String[] args) throws Exception {
  11.                 Vector<InputStream> vector = new Vector<>();
  12.                 File dir = new File("E:\\nihao");
  13.                 File[] files = dir.listFiles(new FilenameFilter() {
  14.                         public boolean accept(File dir, String name) {
  15.                                 return name.endsWith(".txt");
  16.                         }
  17.                 });
  18.                 for (File file : files) {
  19.                         vector.add(new FileInputStream(file));
  20.                 }
  21.                
  22.                 Enumeration<InputStream> enumeration = vector.elements();
  23.                 SequenceInputStream stream = new SequenceInputStream(enumeration);
  24.                 FileOutputStream fos = null;
  25.                 int i = 1;
  26.                 int len = -1;
  27.                 int total = 0;
  28.                 byte[] buf = new byte[20];
  29.                 while ((len = stream.read(buf, total, buf.length - total)) != -1) {
  30.                         total += len;
  31.                         if (total == buf.length) {
  32.                                 fos = new FileOutputStream("E:\\nihao\\" + i++ + ".txt");
  33.                                 fos.write(buf, 0, total);
  34.                                 total = 0;
  35.                         }
  36.                 }
  37.                 // 读完的最后一次可能不足buf.length个字节。需要单独处理
  38.                 fos = new FileOutputStream("E:\\nihao\\" + i + ".txt");
  39.                 fos.write(buf, 0, total);
  40.         }
  41. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
  1. import java.io.*;
  2. import java.util.*;

  3. public class StreamTest {

  4.         /**
  5.          * @param args
  6.          */
  7.         public static void main(String[] args) throws Exception
  8.         {               
  9.                 getFile("W:\\javawork\\bxd\\day25");
  10.         }

  11.         public static void getFile(String str) throws Exception
  12.         {               
  13.                 Vector<InputStream> v = new Vector<InputStream>();               
  14.                 File f = new File(str);               
  15.                 FileInputStream fis = null;
  16.                 FileOutputStream fos = null;

  17.                 // 获取此文件目录下所有的txt文件
  18.                 String[] fileNames = f.list(new FilenameFilter()
  19.                         {
  20.                         public boolean accept(File f, String name)
  21.                         {
  22.                                 return name.endsWith(".java");

  23.                         }
  24.                 });               

  25.                 for (String fileName : fileNames)
  26.                 {                       
  27.                         fis = new FileInputStream(str + "\\" + fileName);                       
  28.                         v.add(fis);                       
  29.                 }
  30.        
  31.                 Enumeration<InputStream> e = v.elements();               
  32.                 SequenceInputStream se = new SequenceInputStream(e);
  33.                 byte[] by = new byte[450];
  34.                 int len = 0;               
  35.        
  36.                 //以上部分都一样,下边的与楼主不同不同。
  37.                 int num = 0;//记录读取的所有文件的总长
  38.                 int num1 = 0;//记录当前操作文件已写入的字符长度。
  39.                 int pos = 0;//当前操作文件需要写入的字符长度。       
  40.                 int i = 1;//文件标题自增计数器
  41.                                
  42.                 fos=new FileOutputStream((str+"\\"+(i++)+".txt"));
  43.                
  44.                 while ((len = se.read(by)) != -1)
  45.                 {
  46.                         System.out.println("len="+len);                       
  47.                         num=num+len;                       
  48.                         while(len>0)
  49.                         {
  50.                                
  51.                                 pos = by.length-num1;
  52.                                 if(len<pos)
  53.                                 {
  54.                                         fos.write(by,0,len);        //写入后,写入计数器增加,len清空                               
  55.                                         num1+=len;
  56.                                         len=0;                                       
  57.                                 }
  58.                                 else//len>=pos的情况。
  59.                                 {
  60.                                         fos.write(by,0,pos);//写入后,写入计数器归零,len减去写入的长度。       
  61.                                         num1 = 0;
  62.                                         len -= pos;
  63.                                         System.out.println("pos="+pos+" num1="+num1+" i="+i);
  64.                                         fos.close();
  65.                                         fos=new FileOutputStream((str+"\\"+(i++)+".txt"));
  66.                                        
  67.                                 }
  68.                         }
  69.                          
  70.                 }
  71.                 fis.close();
  72.                 fos.close();

  73.         }
  74. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
惠晖 中级黑马 2013-1-18 11:56:30
9#
{:soso_e113:}
回复 使用道具 举报
舒远 发表于 2013-1-18 10:28

刚有重新思考了下这个代码:发现了一下问题
1.在往Vector中添加过程中,应该增加个判断过程,应该可能一个文件夹的名字也已“.txt”结尾的,如果有这样的文件夹,下边的操作会出现空指针异常。
2.在while循环中,新建一个FileOutputStream后,没有将之前的资源关闭,整个代码结束时,序列流也应该关闭资源。
3.whil循环外边的新建写入流过程中,前边应该加个if(pos!=0)判断一下,否则如果while结束后,可能会创建一个空文件。

点评

很好。能发现bug也是一种提高!  发表于 2013-1-18 15:41

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马