一. 合并流 SequenceInputStream
Java可以将 两个文件,或者多个文件 合并到一个文件。 注意,如果是两个文件进行合并,合并后的文件是三个, 如A +B 合并, 那么会合并到 C, 共有 A,B,C 三个文件。
那么,你说如何将 A文件合并到B文件,而不产生C 文件呢。 这个与文件复制差不多, 需要让目的地文件即B 存在,并且有数据, 在实例化FileOutputStream时,用追加, append=true 的方式进行读取就可以了, 就可以将A 文件合并到B 文件里面了。
这儿 SequenceInputStream 讨论的是 产生 最后的结果文件 C 文件。
一.一 方法
一.一.一 构造方法
一.一.一.一 方法
方法 |
作用 |
SequenceInputStream(InputStream s1, InputStream s2) |
传入两个文件源 s1,s2 |
SequenceInputStream(Enumeration<? extends InputStream> e) |
多个文件源,传入集合的方式 |
一.一.一.二 演示
@Test
public void conTest() throws Exception{
//1. 定义两个输入流
File file1=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
+File.separator+"out.txt");
InputStream in1=new FileInputStream(file1);
File file2=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
+File.separator+"err.txt");
InputStream in2=new FileInputStream(file2);
//第一种方式
SequenceInputStream sequenceInputStream=new SequenceInputStream(in1,in2);
//第二种,传入多个合并源
Vector<InputStream> vector=new Vector<>();
vector.add(in1);
vector.add(in2);
//变成集合
Enumeration<InputStream> inputStreamEnum=vector.elements();
//传入集合
SequenceInputStream sequenceInputStream1=new SequenceInputStream(inputStreamEnum);
}
一.一.二 普通读取方法
方法 |
作用 |
int int read() |
只读取一个内容, 并且返回该内容 |
int read(byte[] b) |
一次读取多个内容,并且将内容放置到 b 字节数组里面。返回读取的长度 |
int read(byte[] b, int off, int len) |
一次读取多个内容,读的内容是从 off 到 off+len, 然后将内容放置到b 字节数组里面 |
void close() |
关闭此输入流并释放与流相关联的任何系统资源。 |
一.二 演示合并流 SequenceInputStream
合并源一: out.txt 文件内容
合并源二: err.txt 文件内容
@Test
public void seqTest() throws Exception{
//1. 定义两个输入流
File file1=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
+File.separator+"out.txt");
InputStream in1=new FileInputStream(file1);
File file2=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
+File.separator+"err.txt");
InputStream in2=new FileInputStream(file2);
//合并流
SequenceInputStream sequenceInputStream=new SequenceInputStream(in1,in2);
//结果文件
File file3=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
+File.separator+"hebing.txt");
OutputStream outputStream=new FileOutputStream(file3);
byte[] bytes=new byte[1024];
int len=-1;
while((len=sequenceInputStream.read(bytes))!=-1){
outputStream.write(bytes,0,len);
}
outputStream.close();
sequenceInputStream.close();
in1.close();
in2.close();
}
运行程序, 查看 hebing.txt 文件内容
二. 回退流 PushbackInputStream
以前读取文件 inputStream.read(), 或者 inputStream.read(b) 时,只能往前读,不能往后退,读过去就过去了。 然而,有时候,可能误读之类的,需要回退。 那么就用到 回退流 PushbackInputStream 了。
二.一 方法
二.一.一 构造方法
二.一.一.一 方法
方法 |
作用 |
PushbackInputStream(InputStream in) |
传入源 inputStream对象 |
二.一.一.二 演示
@Test
public void conTest() throws Exception{
//读内存,不读文件了
InputStream inputStream=new ByteArrayInputStream("你好啊".getBytes("UTF-8"));
PushbackInputStream pushbackInputStream=new PushbackInputStream(inputStream);
}
二.一.二 读和回退方法
方法 |
作用 |
int int read() |
只读取一个内容, 并且返回该内容 |
int read(byte[] b) |
一次读取多个内容,并且将内容放置到 b 字节数组里面。返回读取的长度 |
int read(byte[] b, int off, int len) |
一次读取多个内容,读的内容是从 off 到 off+len, 然后将内容放置到b 字节数组里面 |
void close() |
关闭此输入流并释放与流相关联的任何系统资源。 |
void unread(int b) |
回退某个字符,会回退一个 |
void unread(byte[] b) |
往后 回退 b.length个 |
void unread(byte[] b, int off, int len) |
往后 回退 len个 |
二.二 演示回退流 PushbackInputStream
@Test
public void pushTest() throws Exception{
String str="Hello,EveryOne,My Name is,TwoBu,tterfly";
InputStream inputStream=new ByteArrayInputStream(str.getBytes("UTF-8"));
//构建回退流
PushbackInputStream pushbackInputStream=new PushbackInputStream(inputStream,8);
int len=-1;
System.out.println("输出内容:");
while((len=pushbackInputStream.read())!=-1){
//有值
char c=(char)len;
if(c==','){
//为 ,号时 ,先往前读3个,再往后倒两个
byte[] b1=new byte[3];
pushbackInputStream.read(b1);
//往后倒两个
pushbackInputStream.unread(b1,0,2);
}else{
System.out.print(c);
}
}
}
运行程序,控制台打印输出:
回退分析:
Hello,EveryOne,My Name is,TwoBu,tterfly
第一个, 号时, 往前读取三个,读了 Eve, 又往后回退两个, 回退 Ev, 即将 Ev 重新放置到缓冲区去, 而e 没有放置,e丢失了。
第二个, 号时, My空格 读取这三个, My回退到缓冲区,空格丢失。
第三个,号时,Two 读取这三个, Tw回退到缓冲区,o丢失.
第四个,号时 tte读取这三个, tt回退到缓冲区, e失去。
所以最后结果是: HelloEvryOneMyName isTwButtrfly