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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© lcjasas 中级黑马   /  2013-4-6 21:43  /  1944 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 lcjasas 于 2013-4-7 21:07 编辑

import java.io.*;
import java.util.*;
class  SequenceDemo
{
public static void main(String[] args) throws IOException
{
  Vector<FileInputStream> v =new Vector<FileInputStream>();
  v.add(new FileInputStream("E:\\1.txt"));
  v.add(new FileInputStream("E:\\2.txt"));
  v.add(new FileInputStream("E:\\3.txt"));
  
  Enumeration<FileInputStream> en = v.elements();
  SequenceInputStream sis = new SequenceInputStream(en);
  FileOutputStream fos = new FileOutputStream("E:\\4.txt");
  byte[] buf = new byte[1024];
  int len = 0;
  while((len=sis.read(buf))!=-1)
  {
   fos.write(buf,0,len);
  }
  fos.close();
  sis.close();
}
}
合并执行后,出现了这种情况:

想要进行判断,换行,让不同文件合并之后,有一个标记,怎么处理呢.

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

5 个回复

倒序浏览
这个问题,其实跟你读取的数据有关系,1.txt读到最后没有回车换行符了,所以在读取2.txt时就直接接上了,以后依此类推
while 中的      if((len=sis.read(buf))=-1)    多余 ,有的话还会报错,内外条件相冲突

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
  1. import java.io.*;
  2. import java.util.*;
  3. class  SequenceDemo{
  4.      public static void main(String[] args) throws IOException{
  5.              
  6.        Vector<FileInputStream> v =new Vector<FileInputStream>();
  7.        FileInputStream  fi1 =  new FileInputStream("E:\\1.txt");
  8.        FileInputStream  fi2 = new FileInputStream("E:\\2.txt");
  9.        FileInputStream  fi3 =  new FileInputStream("E:\\3.txt");
  10.        v.add(fi1);
  11.        v.add(fi2);
  12.        v.add(fi3);
  13.   
  14.        Enumeration<FileInputStream> en = v.elements();
  15.        SequenceInputStream sis = new SequenceInputStream(en);
  16.   
  17.        PrintStream ps = new PrintStream("E:\\4.txt");
  18.        byte[] buf = new byte[1024];
  19.        int len = 0;
  20.        while((len=sis.read(buf))!=-1){
  21.           
  22.    
  23.            /*if(fi1.read()==-1){
  24.                           ps.println();
  25.                   }else if(fi2.read()==-1){
  26.                           ps.println();
  27.                           
  28.                   }else if(fi3.read()==-1){
  29.                           ps.println();
  30.                   }*/
  31.               /* 这里我其实异想天开了,想着上边不用匿名的FileInputStream,这里可以在判断过程中添加你所需要的标志信息什么的,结果出现了
  32.                java.io.IOException: Stream Closed,后来想到可能是合并流出的问题,查了API看了源码,就发现一个小知识点
  33.                 分享一下:
  34.                通过记住参数来初始化新创建的 SequenceInputStream,该参数必须是生成运行时类型为 InputStream 对象的 Enumeration 型参数。将按顺
  35.                序读取由该枚举生成的输入流,以提供从此 SequenceInputStream 读取的字节。在用尽枚举中的每个输入流之后,将通过调用该流的 close 方法将其关闭。
  36.                源码确实把流给关了,这样就没办法在这个过程中添加信息,不过这也符合了合并流的特点,是什么样就是合并成什么样,
  37.                楼主想要标志信息只能在你的1.txt等文件中添加了(你的文件末尾应该是没加换行符就是没按enter键)才合并的那么难看*/
  38.               ps.write(buf, 0, len);
  39.   
  40.   }

  41.   ps.close();
  42.   sis.close();
  43. }


  44. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
刘吉庆 发表于 2013-4-6 22:39
这个问题,其实跟你读取的数据有关系,1.txt读到最后没有回车换行符了,所以在读取2.txt时就直接接上了,以 ...

额...这局是我没有注释掉的,忘记删的,if((len=sis.read(buf))=-1) .

那如果我不想在文件里面有回车换行,在程序中怎么体现...
回复 使用道具 举报
lcjasas 发表于 2013-4-6 23:11
额...这局是我没有注释掉的,忘记删的,if((len=sis.read(buf))=-1) .

那如果我不想在文件里面有回车换行, ...

不想在文件里添加回车换行,那就在v.add(new InputStream("E:\\5.txt"))l;在5.txt文件中写一回车换行,但这样写了程序好像没啥意思
回复 使用道具 举报
若还有问题,请继续追问; 没有的话,将帖子分类改成【已解决】~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马