00 要求
-
1.为多个文件创建多个输入流,字节流还是字符流无所谓,都可以。最后将多个输入流合并成一个输入流,写入到一个文件中。就是将多个文件的内容通过io流复制到一个文件中。
-
2.一定注意是多个文件,当这多个文件的编码不一样时怎么办?因为最后是写入到一个文件中,一个文件中不可能有多种编码格式吧。所以一定得
统一编码格式
后在写出。 -
2.序列流本身时属于
InputStream
的子类,是属于字节输入流,如果序列中的各个输入流中所关流的文件的编码格式不一样,则需要结合字符流的InputStreamReader
和OutputStreamWriter
这两个转换楼实现,最后统一编码格式后再进行写出到输出文件中。没关系,实现依然很简单,这个代码中都有详细的注释,这里不再赘述。 -
3.最后其实还可以在
InputStreamReader
和OutputStreamWriter
外面再套一个缓冲区字符流,BufferedReader
和BufferedWriter
,点到为止,这里只是抛砖引玉一下。至于玉在哪里,各位自己慢慢品味。
小tips:
.有同学可能会说,就算我在windos下键一万个文件编码格式也是“GBK”啊,编码格式完全一样啊。我第一次在学校上java课的时候也这么想,还觉得当时的老师完全是所此一举。但是这次在回过头来看看java基础的一些书籍才觉得这东西其实很重要。
02 代码
/**
* 案列1:序列流整合两个输入流
*
* 要求:
* 1.将两个文本文件整合成一个输入流,写入另外一个文件中
* 比如将a.txt和b.txt的内容复制到文件c.txt中
* 2.使用序列流整合两个输入流的方式
* 3.使用jdk7表标准流异常处理代码
*
* @author yzm
*
*/
public class DemoSequenceStream {
public static void main(String[] args) throws FileNotFoundException {
//序列整合两个
copyTextFile1("a.txt","b.txt","d.txt");
//序列六整合多个
//并结合字符流的使用,必将是下操作文本文件嘛,还是用字符跟为妥当
//将前三个文件整合到第四个文件中
copyTextFile2("a.txt","b.txt","c.txt","e.txt");
}
/**
*
* 这里利用了序列流(字节通向通向字符的桥梁)结合转换流,实现序列流整合多个
* 说明;
* 1.其实也可以在外层再套一个缓冲字符流来实现,这种设计模式模式叫装饰设计模式
* 代码如下:
* BufferedReader br =
* new BufferedReader(new InputStreamReader(new SequenceInputStream(en), "GBK"));
* BufferedWriter bw =
* new BufferedWriter(new OutputStreamWriter(new FileOutputStream(out),"GBK"));
* 2.外层套上转换流完全是为了防止序列流中整合的三个字节输入流的编码格式不一样,
* 最后写到一个文件中引起乱码。故用转换流同意编码后再写出
*
* @param in_01
* @param in_02
* @param in_03
* @param out
* @throws FileNotFoundException
*/
private static void copyTextFile2(String in_01, String in_02, String in_03, String out)
throws FileNotFoundException {
//定义一个veotor集合
Vector<InputStream> v = new Vector<>();
v.add(new FileInputStream(in_01));
v.add(new FileInputStream(in_02));
v.add(new FileInputStream(in_03));
Enumeration<InputStream> en = v.elements();
try(
//转换流吧
//其实也可以在转换流外层再套上一个缓冲字符流
//外层套上转换流是为了给多个输入流文件同意编码
InputStreamReader isr =
new InputStreamReader(new SequenceInputStream(en), "GBK");
OutputStreamWriter osw =
new OutputStreamWriter(new FileOutputStream(out), "GBK");
){
int len;
char[] b = new char[8*1024];
while ((len = isr.read(b)) != -1) {
osw.write(b, 0, len);
}
}catch(IOException e) {
e.printStackTrace();
}
//关闭流
//序列流在关闭的时候会将沟站方法中传入的流对象也都关闭
}
/**
* 序列流整合两个
*
*
* @param in_01
* @param in_02
* @param out
* @throws FileNotFoundException
*/
private static void copyTextFile1(String in_01,String in_02, String out) throws FileNotFoundException {
try(
FileInputStream fis1 = new FileInputStream(in_01);
FileInputStream fis2 = new FileInputStream(in_02);
SequenceInputStream sis = new SequenceInputStream(fis1, fis2);
FileOutputStream fos = new FileOutputStream(out);
){
int len;
byte[] b = new byte[8*1024];
while ((len = sis.read(b)) != -1) {
fos.write(b, 0, len);
}
}catch(IOException e) {
e.printStackTrace();
}
//关闭流
//序列流在关闭的时候会将沟站方法中传入的流对象也都关闭
}
}
03 结果
没用转换流统一编码的时候会出现中文乱码,因为楼主本人手动设置了几个文件的编码格式不一样。这里的结果是程序经过调试后的结果,没有将乱码的运行结果贴出。
重要的事情说三遍:
多个文件的输入流合并时最好用转换流InputStreamReader
和OutputStreamWriter
统一编码之后再写出,记不住我就多说几遍吗,老是再这里出现中文乱码现象后费时费力去调试代码
- a.txt
AAAAAAAAAAA
分公司的官方的
好看哈开发和客户
AAAAAAAAAAA
- b.txt
BBBBBBBBBB
22222222222
奥即即即即即即
BBBBBBBB
- c.txt
cccccccccccc
及hi哈哈覅话ioh士大夫
ccccccccccccc
- d.txt
AAAAAAAAAAA
分公司的官方的
好看哈开发和客户
AAAAAAAAAAA
BBBBBBBBBB
22222222222
奥即即即即即即
BBBBBBBB
- e.txt
AAAAAAAAAAA
分公司的官方的
好看哈开发和客户
AAAAAAAAAAA
BBBBBBBBBB
22222222222
奥即即即即即即
BBBBBBBB
cccccccccccc
及hi哈哈覅话ioh士大夫
ccccccccccccc