一分耕耘一分收获,时间再晚也无法阻挡我学习的热情
文件拆分
这里之前主要不太明白的是怎么把文件流拆分成相等的块,只拆分第一块还是明白的,第二块怎么处理呢,直到我看到了 Arrays.copyOfRange()
,豁然开朗,在此记录
解释:
与使用 System.arraycopy 进行数组复制类似的, Arrays 提供了一个 copyOfRange 方法进行数组复制。
不同的是 System.arraycopy
,需要事先准备好目标数组,并分配长度。 copyOfRange
只需要源数组就就可以了,通过返回值,就能够得到目标数组了。
除此之外,需要注意的是 copyOfRange 的第 3 个参数,表示源数组的结束位置,是取不到的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| package stream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.Arrays; public class TestStream { public static void main(String[] args) { int eachSize = 100 * 1024; File srcFile = new File("d:/eclipse.exe"); splitFile(srcFile, eachSize); }
private static void splitFile(File srcFile, int eachSize) { if (0 == srcFile.length()) throw new RuntimeException("文件长度为0,不可拆分"); byte[] fileContent = new byte[(int) srcFile.length()]; try { FileInputStream fis = new FileInputStream(srcFile); fis.read(fileContent); fis.close(); } catch (IOException e) { e.printStackTrace(); } int fileNumber; if (0 == fileContent.length % eachSize) fileNumber = (int) (fileContent.length / eachSize); else fileNumber = (int) (fileContent.length / eachSize) + 1; for (int i = 0; i < fileNumber; i++) { String eachFileName = srcFile.getName() + "-" + i; File eachFile = new File(srcFile.getParent(), eachFileName); byte[] eachContent; if (i != fileNumber - 1) eachContent = Arrays.copyOfRange(fileContent, eachSize * i, eachSize * (i + 1)); else eachContent = Arrays.copyOfRange(fileContent, eachSize * i, fileContent.length); try { FileOutputStream fos = new FileOutputStream(eachFile); fos.write(eachContent); fos.close(); System.out.printf("输出子文件%s,其大小是 %d字节%n", eachFile.getAbsoluteFile(), eachFile.length()); } catch (IOException e) { e.printStackTrace(); } } } }
|