(Java)文件分割器
来源:互联网 发布:汇商软件科技有限公司 编辑:程序博客网 时间:2024/04/30 02:43
这是一道面试题,题意如图所示:
参考文献地址是http://www.cnblogs.com/yjmyzz/p/how-to-split-a-large-file-into-small-files-fastly.html
以上这篇参考文献对我帮助很大。文件分割部分基本是按照他的方法来改的,不过它是采用的多线程,我没有采用多线程。
既然不能利用文件名,那么就需要把顺序信息存到文件中去,分割后每个文件前五个字节表示顺序,其中第一个文件后面还有五个字节表示总共有多少个文件,再后面还有50个字节表示原文件名。我后来想如果在每个文件里都加上总共有多少个文件也许更好,处理起来会更简单,因为我这里还要单独处理万一少了第一个文件的情况。
分割就是将文件按照前五个字节排序之后,去除后加入的信息,再写入就可以了。我之前有个错误就是将第一个文件的读到的byte[]转换为String处理后加入的信息,再转回回byte[]进行写入,会产生错误,直接用读到的byte[]写就解决了~that's all ~不是很难,就是比较麻烦,而且不熟练。
package lzz;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.util.Map;import java.util.TreeMap;public class FileUtilNew {/** * 当前目录路径 */public static String currentWorkDir = System.getProperty("user.dir") + "\\"; /** * 存放分割后文件目录 */ public static String splitDir = "F:\\files\\"; /** * 拆分文件 * * @param fileName * 待拆分的完整文件名 * @param partNumber * 拆分成多少部分 * @throws IOException */ public void splitByNum(String fileName, int partNumber)throws IOException { File file = new File(fileName); long totalLen = file.length(); int averLen = (int)(totalLen / partNumber); int lastLen = (int)(totalLen - averLen * (partNumber - 1)); System.out.println(averLen + " " + lastLen); String filePre = "00001" + leftFill(String.valueOf(partNumber)) + leftFillFileName(file.getName()); executeSplit(averLen, 0, filePre, file); for (int i = 2; i < partNumber; i++) { filePre = leftFill(String.valueOf(i)); executeSplit(averLen, (i - 1) * averLen, filePre, file); } filePre = leftFill(String.valueOf(partNumber)); executeSplit(lastLen, (partNumber - 1) * averLen, filePre, file); } /** * 合并文件 * * @param dirPath * 拆分文件所在目录名 * @throws FileNotFoundException * @throws IOException */ public void mergePartFiles(String dirPath) throws IOException{ File path = new File(dirPath); File[] files = path.listFiles(); int fileNumber = files.length; Map<Integer,File> map = new TreeMap<Integer,File>(); for(int i = 0; i < fileNumber; i++){ FileInputStream fs = new FileInputStream(files[i]); byte[] b = new byte[5]; fs.read(b); fs.close(); int index = Integer.parseInt(new String(b)); map.put(index, files[i]); } File fileFir = map.get(1); FileInputStream fis = new FileInputStream(fileFir); byte[] b = new byte[(int)fileFir.length()]; fis.read(b); fis.close(); int splitNum = Integer.parseInt(new String(b,5, 5)); if(splitNum != fileNumber){ System.out.println("File Lose!"); return; } String fileName = ""; for(int i = 10; i < 60; i++){ if(b[i] != '.'){ fileName = new String(b,i,60-i); break; } } FileOutputStream fos = new FileOutputStream(dirPath + fileName); fos.write(b, 60, b.length-60); map.remove(1); int len = 0; byte[] con = null; for(Map.Entry<Integer, File> entry : map.entrySet()){ FileInputStream fs = new FileInputStream(entry.getValue()); len = (int)entry.getValue().length(); con = new byte[len]; fs.read(con); fs.close(); fos.write(con, 5, len-5); } fos.close(); } private void executeSplit(int byteSize, int startPos, String partFileIndex,File originFile){ RandomAccessFile rFile; OutputStream os; try { rFile = new RandomAccessFile(originFile, "r"); byte[] b = new byte[byteSize]; rFile.seek(startPos);// 移动指针到每“段”开头 int s = rFile.read(b); os = new FileOutputStream(splitDir + partFileIndex.substring(0,5)); os.write(partFileIndex.getBytes()); os.write(b, 0, s); os.flush(); os.close(); } catch (IOException e) { e.printStackTrace(); } } private String leftFill(String index){ int zeroNum = 5 - index.length(); StringBuilder sb = new StringBuilder(""); for(int i = 0; i < zeroNum; i++){ sb.append("0"); } sb.append(index); return sb.toString(); } private String leftFillFileName(String name) { // TODO Auto-generated method stub int dotNum = 50 - name.length(); StringBuilder sb = new StringBuilder(""); for(int i = 0; i < dotNum; i++){ sb.append("."); } sb.append(name); return sb.toString(); }}
0 0
- (Java)文件分割器
- 基于java的文件分割器
- 文件分割与合并(Java)
- java读取大文件(分割)
- Java分割txt文件
- java文件的分割
- java 实现文件分割
- java 分割合并文件
- java大文件分割
- java文件分割
- java 合并文件-分割文件
- 用Java实现的文件分割器(HIT软件学院Java第三次实验)
- java IO流(java分割、合并任意类型文件)
- Java分割合并大文件
- 文件分割合并类(java)
- JAVA 文件分割工具类
- Java实现大文件分割
- Java文件压缩分割(待)
- windows进程
- 垒骰子-蓝桥杯
- Fragment中ListView的Item的点击事件(包含Item内部控件的点击事件)
- javax.servlet.jsp.JspTagException] with root cause
- imageMagick+im4java给图片打水印
- (Java)文件分割器
- Scala入门之高级类型:结构类型
- MySQL 常用命令
- 深入理解 Java 垃圾回收机制
- 华为OJ——字符串分隔
- NYOJ 1058 部分和问题
- ViewDragHelper
- maven+jquery+ajax+springmvc+mybatis项目实例
- Q_PROPERTY 第二篇