增加了文件的合并方法
package com.io;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.RandomAccessFile;
import java.io.SequenceInputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Vector;
import org.omg.CORBA.portable.InputStream;
/*
* 面向对象思想封装分割随机读取
*/
public class SplitFile {
//源头
private File src;
//目的地(文件夹)
private String destDir;
//所有分割后的文件储存路径
private List<String> destPaths;
//每块大小
private int blocksize;
//多少块
private int size;
public SplitFile() {
super();
}
public SplitFile(String srcPath, String destDir) {
this(srcPath,destDir,1024);
}
public SplitFile(String srcPath, String destDir, int blocksize) {
this.src =new File(srcPath);
this.destDir = destDir;
this.blocksize = blocksize;
this.destPaths=new ArrayList<String>();
init();
}
private void init() {
long len=this.src.length();
//多少块
this.size=(int) Math.ceil(len*1.0/blocksize);//四舍五入
//路径
for(int i=0;i<size;i++) {
this.destPaths.add(this.destDir+"/"+i+"-"+this.src.getName());
}
}
//1.计算每一块的起始位置及大小 2.分割
public void split() throws IOException {
long len=src.length();
int beginPos=0;
int actualSize=(int) (blocksize>len?len:blocksize);
for(int i=0;i<size;i++) {
beginPos=i*blocksize;
if(i==size-1) {//最后一块
actualSize=(int)len;
}else {
actualSize=blocksize;//剩余量
}
SplitDetail(i,beginPos,actualSize);
}
}
private void SplitDetail(int i,int beginPos,int actualSize) throws IOException {
RandomAccessFile raf=new RandomAccessFile(this.src,"r");
RandomAccessFile raf2=new RandomAccessFile(this.destPaths.get(i),"rw");
raf.seek(beginPos);
byte[] flush=new byte[1024];
int len=-1;
while((len=raf.read(flush))!=-1) {
if(actualSize>len) {
raf2.write(flush, 0, len);
actualSize-=len;
}else {
raf2.write(flush, 0, actualSize);
break;
}
}
raf2.close();
raf.close();
}
/*
* 文件的合并
*/
public void merge(String destPath) throws IOException {
//输出流 true为append标识
OutputStream os=new BufferedOutputStream(new FileOutputStream(destPath,true));
Vector<InputStream> vi=new Vector<InputStream>();
SequenceInputStream sis=null;
//输入流
for(int i=0;i<destPaths.size();i++) {
vi.add(new BufferedInputStream(new FileInputStream(destPaths.get(i))));
}
sis=new SequenceInputStream(vi.elements());
byte[] flush=new byte[1024];//缓冲容器
int len=-1;
while((len=sis.read(flush))!=-1) {
os.write(flush,0,len);
}
os.flush();
sis.close();
os.close();
}
public static void main(String[] args) throws IOException {
SplitFile sf=new SplitFile("b.jpg", "dest", 1024*10);
sf.split();
sf.merge("a.png");
}
}
add方法报错,原因未知
以下为测试组件Commons的功能
package com.io;
import java.io.File;
import org.apache.commons.io.FileUtils;
public class CIOTest1 {
public static void main(String[] args) {
//文件大小
long len=FileUtils.sizeOf(new File("D:\\java\\IO_Study\\src\\com\\io\\CIOTest1.java"));
System.out.println(len);
//目录大小
len=FileUtils.sizeOf(new File("D:\\java\\IO_Study"));
System.out.println(len);
}
}
package com.io;
import java.io.File;
import java.util.Collection;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.DirectoryFileFilter;
import org.apache.commons.io.filefilter.EmptyFileFilter;
import org.apache.commons.io.filefilter.FileFilterUtils;
import org.apache.commons.io.filefilter.SuffixFileFilter;
/*
* 列出子孙集
*/
public class CIOTest2 {
public static void main(String[] args) {
//1.目录 2.EmptyFileFilter.NOT_EMPTY 过滤器,文件不能为空(为空文件就不显示) 3.目录的过滤器
Collection<File> files=FileUtils.listFiles(new File("D:/java/IO_Study"), EmptyFileFilter.NOT_EMPTY, null);
for(File file:files) {
System.out.println(file.getAbsolutePath());
}
System.out.println("---------------------");
//显示目录的子孙集
files=FileUtils.listFiles(new File("D:/java/IO_Study"), EmptyFileFilter.NOT_EMPTY, DirectoryFileFilter.INSTANCE);
for(File file:files) {
System.out.println(file.getAbsolutePath());
}
System.out.println("---------------------");
//文件后缀为java或class 还有FileFilterUtils.And
files=FileUtils.listFiles(new File("D:/java/IO_Study"), FileFilterUtils.or(new SuffixFileFilter("java"),new SuffixFileFilter("class")), DirectoryFileFilter.INSTANCE);
for(File file:files) {
System.out.println(file.getAbsolutePath());
}
}
}
package com.io;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.LineIterator;
import org.apache.commons.io.filefilter.DirectoryFileFilter;
import org.apache.commons.io.filefilter.EmptyFileFilter;
import org.apache.commons.io.filefilter.FileFilterUtils;
import org.apache.commons.io.filefilter.SuffixFileFilter;
/*
* 写出内容
*/
public class CIOTest4 {
public static void main(String[] args) throws IOException {
//写文件 //true 追加文件
FileUtils.write(new File("b.txt"), "学习是一件伟大的事\r\n","GBK",true);
FileUtils.writeStringToFile(new File("b.txt"), "学习是一件辛苦的事\r\n","GBK",true);
FileUtils.writeByteArrayToFile(new File("b.txt"), "学习是一件幸福的事\r\n".getBytes("GBK"),true);
//写列表
List<String> datas=new ArrayList<String>();
datas.add("一");
datas.add("二");
datas.add("三");
//第三项为List每个项目之间的连接符
FileUtils.writeLines(new File("b.txt"),datas,"。。。。",true);
}
}