PipedInputStream
对象读取,并由其他线程将其写入到相应的
PipedOutputStream
。不建议对这两个对象尝试使用单个线程,因为这样可能死锁线程;
public static void input() throws IOException {
FileInputStream fis=new FileInputStream("d:\\1.avi");
BufferedInputStream bis=new BufferedInputStream(fis);
FileOutputStream fos=new FileOutputStream("D:\\2.avi");
BufferedOutputStream bos=new BufferedOutputStream(fos);
byte []a=new byte[1024];//方法一
int num;//返回的数组个数
while((num=bis.read(a))!=-1){
bos.write(a);
bos.flush();
}
// byte []a =new byte[fis.available()];//方法二
// bos.write(a);
// int num; //方法三
// while((num=bis.read())!=-1){
// bos.write(num);
// }
bos.close();
bis.close();
InputStream a = System.in;;
StringBuilder str =new StringBuilder();
int num;
while(( num=a.read())!=-1){
if(num=='\r')
continue;
if(num=='\n'){
String temp=str.toString();
System.out.println(temp.toUpperCase());
str.delete(0, str.length());
if("over".equals(temp)){
break;
}
}else{
str.append((char)num);
}
}
a.close();
}
实现一个文件合并器,能够将切割的文件合并成原来的文件。package com.king.splitfile;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Properties;
public class SplitFile {
public static void main(String []args) throws IOException{
File aim=new File("D:\\1.jpg");
int length=1024*1024;
File dest=new File("D:\\splitFile");
if(!dest.exists()){
dest.mkdir();
}
splitFile(aim, length, dest);
}
/**
* 创建方法实现对文件的分割传入参数:源文件,分割大小,目的地目录
* @param file
* @param length
* @param dest
* @throws IOException
*/
public static void splitFile(File file,int length,File dest) throws IOException {
FileInputStream fis=new FileInputStream(file);
//ArrayList<FileOutputStream> arr=new ArrayList<FileOutputStream>();
FileOutputStream fos;
byte[] size=new byte[length];
int num=0;
int count=0;
while((num=fis.read(size))!=-1){
fos=new FileOutputStream(new File(dest,count+".part"));
fos.write(size);
fos.close();
count++;
}
fis.close();
Properties pop=new Properties(); //创建配置信息,用来储存分割前的名字
pop.setProperty("name", file.getName());
pop.setProperty("part", count+"");
pop.store(new FileOutputStream(new File(dest,"split.properties")), "");
}
}
package com.king.splitfile;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.SequenceInputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Properties;
import com.king.splitfile.util.SuffixFilter;
public class MergeFile {
public static void main(String[] args) throws IOException {
File aim=new File("D:\\splitFile");
File dest =new File("D:\\splitFile");
if(!dest.exists()){
dest.mkdir();
}
mergeFile(aim, dest);
}
public static void mergeFile(File aim,File dest) throws IOException {
ArrayList<FileInputStream> arr=new ArrayList<FileInputStream>();//创建容器存放连接切割文件的流
FileInputStream fis = null;//连接配置文件的流
SuffixFilter sf=new SuffixFilter(".part");//文件名筛选器
//运用迭代将目标目录进行分类连接
File []list=aim.listFiles(sf);
for(int i=0;i<list.length;i++){
arr.add(new FileInputStream(list[i]));
}
File[] pro=aim.listFiles(new SuffixFilter(".properties"));
fis=new FileInputStream(pro[0]);
//加载配置文件
Properties pop=new Properties();
pop.load(fis);
int part=Integer.parseInt(pop.getProperty("part"));
//检查分割文件与配置文件中的数量是否相符
if(part!=arr.size()){
System.out.println("分割文件数量不对!!");
}else{
//将连接不同文件的分割流加入到SequenceInputStream流中
Enumeration<FileInputStream> en=Collections.enumeration(arr);
SequenceInputStream sis=new SequenceInputStream(en);
//将流写出到合并文件中去
FileOutputStream fos=new FileOutputStream(new File(dest,pop.getProperty("name")));
byte [] b=new byte[1024];
int num=0;
while((num=sis.read(b))!=-1){
fos.write(b,0,b.length);
fos.flush();
}
sis.close();
fos.close();
}
fis.close();
}
}