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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 金肖 中级黑马   /  2012-5-6 15:10  /  1494 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

[code]package cn.itcast.io.spilt.test;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.SequenceInputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Iterator;

/**
* 将3个文件合并成一个 原理:创建3个流对象,关联3个文件,然后将里存储集合 然后将集合作为参数传递给合并流sepuenceInputStream的构造函数
注:1.txt文件中都是字母 a
       2.txt中都是 b
       3.txt中都是 c
步骤:1,创建集合存储流对象 2.将集合传递给合并 3.将文件写入指定的文件中
* @author jinxiao
*/
在下列代码中,使用红色标记的 字符输出流,合并后的文件中为什么结果是====》 mmm
如果使用字节输出流就是 OK的



public class MergeFielDemo {
private static final int BUFFER_SIZE = 1024*1024;
public static void main(String[] args) throws IOException {
   File file = new File("merge.txt");
  // 创建一个集合用于存储流对象
  ArrayList<FileInputStream> al = new ArrayList<FileInputStream>();
  al.add(new FileInputStream("1.txt"));
  al.add(new FileInputStream("2.txt"));
  al.add(new FileInputStream("3.txt"));
  
  mergeDemo(al,file);
}
private static void mergeDemo(ArrayList<FileInputStream> al, File file) throws IOException {
  // 将list集合中的元素转换成枚举方法取出
  final Iterator<FileInputStream> it = al.iterator(); // 局部内部类使用的变量需要final进行修饰
  Enumeration<FileInputStream> en = new Enumeration<FileInputStream>() {
   @Override
   public boolean hasMoreElements() {
    return it.hasNext();
   }
   @Override
   public FileInputStream nextElement() {
    return it.next();
   }
  };
  
  //将流合并
  SequenceInputStream sis = new SequenceInputStream(en);
  
BufferedWriter bufw = new BufferedWriter(new FileWriter(file));
//  FileOutputStream fos = new FileOutputStream(file);
  //自定义一个缓冲区
  byte[] buf = new byte[BUFFER_SIZE];
  int len = 0;
  while((len = sis.read(buf))!=-1)
  {
   bufw.write(len);
//   fos.write(buf,0,len);
   
  }
  
  sis.close();
  bufw.close();
//  fos.close();
}
}




















3 个回复

倒序浏览
楼主,你用BufferedWriter,确是写自己,既然写字节那你就干脆把这段代码改下:
//BufferedWriter bufw = new BufferedWriter(new FileWriter(file));
  FileOutputStream fos = new FileOutputStream(file);
  //自定义一个缓冲区
  byte[] buf = new byte[BUFFER_SIZE];
  int len = 0;
  while((len = sis.read(buf))!=-1)
  {
//   bufw.write(len);
   fos.write(buf,0,len);
   
  }
  
  sis.close();
//  bufw.close();
fos.close();

这样就哦了,
而且你这句代码: bufw.write(len);
是啥意思呢,你知道么?  这是ASCII值为len的字符 ,
而且使用BufferedWrite写字节的话,他只能写一次写一个字节,因为它主要是缓冲流,写的是字符串或是字符数组,所以能,如果你要使用这个类,
那么你就需要把你的buf转化成字符数组或是String 那样也可以,不过别忘了 newLine() 和 flush()
回复 使用道具 举报
求奖励
{:soso_e178:}
回复 使用道具 举报
我得攒分,升级用户组
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马