您的位置:首页 > 编程语言 > Java开发

在Java中实现文件的分割与合并

2015-01-10 12:12 639 查看
对打文件进行分割,分割成固定大小的文件,并存放与指定的目录,可以指定分割的大小。代码如下:

/**
* @description
* @param filePath 文件名称,包括路径
* @param filterFolder 分割文件存放目录
* @param fileSize 分割文件大小
* @throws IOException
*/
public static void cutFile(String filePath, String filterFolder, int fileSize) throws IOException{
File file = new File(filePath);
if(!file.exists())
throw new FileNotFoundException("Source file not found.filePath:"+filePath);
File storeFiles = new File(filterFolder);
if(!storeFiles.exists())
storeFiles.mkdirs();
RandomAccessFile sourceFile = new RandomAccessFile(filePath, "r");
long sourceFileLen = sourceFile.length();
long fileNum = sourceFileLen/fileSize;
long readedLen = 0;
int fileNameNum = 1;

for(; fileNameNum <= fileNum; fileNameNum++) {
RandomAccessFile outFile = new RandomAccessFile(storeFiles.getAbsolutePath()+File.separator+file.getName()+(fileNameNum)+"tmp", "rw");
for(int j = 0; j< fileSize; j ++,readedLen++) {
outFile.write(sourceFile.read());
}
outFile.close();
}
if(readedLen<sourceFileLen) {
RandomAccessFile outFile = new RandomAccessFile(storeFiles.getAbsolutePath()+File.separator+file.getName()+(fileNameNum++)+"tmp", "rw");
for(long j = readedLen; j< sourceFileLen; j ++) {
outFile.write(sourceFile.read());
}
outFile.close();
}
sourceFile.close();
System.out.println("文件长度:"+sourceFileLen+";单个文件长度:"+fileSize+";文件分割个数:"+(--fileNameNum));
}


将指定目录下符合文件名称条件的文件合并成一个文件,可以指定输出文件的存放目录,代码如下:

/**
* @description Unit files
* @param outFileName 合并文件名称
* @param fileFolder 被合并文件所在目录
* @param filterName 被合并文件名过滤条件
* @throws IOException
*/
public static void unitFile(String outFileName, String fileFolder, final String filterName) throws IOException{
File[] inFiles;
File outFile = new File(outFileName);
File inFilesFolder = new File(fileFolder);
if(!inFilesFolder.exists())
throw new FileNotFoundException("Source file folder not found.filePath:"+fileFolder);
//get confirmed condition files
inFiles = inFilesFolder.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
String fileName = new File(name).getName();
return fileName.startsWith(filterName);
}
});
RandomAccessFile out = new RandomAccessFile(outFile, "rw");
for (File file : inFiles) {
System.out.println(file);
RandomAccessFile infile = new RandomAccessFile(file, "r");
int readed;
while((readed = infile.read())!= -1)
out.write(readed);
infile.close();
}
out.close();
}


两个方法都是采用的随机读写流对文件进行读写的。

这样存在两个问题:

分割文件中,采用单个字节读取方式的优点是,可以将文件分割的大小精确到字节。但对中文进行分割就会出现大小有上下浮动,同时存在将一个中文分割成两个字节存放到两个文件中。

合并文件中,根据上面的方法,不能对被合并的文件进行排序,既合并时,文件顺序是按照文件名称排序的,这种情况下,如果文件名中有数字,就会出现混乱的情况。

测试代码很简单就不贴上了。

上面的两个问题解决方案:

对于有中文的文件分割,推荐使用字符流取代字节流进行读取;

文件合并中,取得文件列表后,使用集合对文件按照文件名称进行排序即可。

如果你有更好的解决方案或者实现方法,欢迎留言指正。

如果你感兴趣,测试代码和解决上面两个问题的代码不妨去实现一下吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息