在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(); }
两个方法都是采用的随机读写流对文件进行读写的。
这样存在两个问题:
分割文件中,采用单个字节读取方式的优点是,可以将文件分割的大小精确到字节。但对中文进行分割就会出现大小有上下浮动,同时存在将一个中文分割成两个字节存放到两个文件中。
合并文件中,根据上面的方法,不能对被合并的文件进行排序,既合并时,文件顺序是按照文件名称排序的,这种情况下,如果文件名中有数字,就会出现混乱的情况。
测试代码很简单就不贴上了。
上面的两个问题解决方案:
对于有中文的文件分割,推荐使用字符流取代字节流进行读取;
文件合并中,取得文件列表后,使用集合对文件按照文件名称进行排序即可。
如果你有更好的解决方案或者实现方法,欢迎留言指正。
如果你感兴趣,测试代码和解决上面两个问题的代码不妨去实现一下吧。
相关文章推荐
- 用Java简单实现文件分割与合并
- java实现文件的分割与合并
- 用Java简单实现文件分割与合并
- Java 实现文件分割,合并功能
- 用java实现大文件分割与合并
- 用Java实现文件分割/合并操作
- JAVA 实现文件分割与合并
- 文件的分割与合并(Java实现)
- java实现大文件分割与合并的实例代码
- 用Java实现大文件的分割与合并
- 用Java实现文件分割/合并操作
- Java中使用IO流实现大文件的分割与合并
- Java 使用IO流实现大文件的分割与合并实例详解
- Java实现文件分割和文件合并实例
- Java 实现大文件的分割与合并
- 用java实现大文件分割、排序、合并
- java:大数据文件写入,读取,分割,排序,合并
- java 分割合并文件
- 使用java IO实现指定后缀的文件合并为一个文件
- Java的IO操作(四) - SequenceInputStream类,实例:一个文件分割、合并工具