文件拆分成指定大小(IO流)
Posted IFearless
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文件拆分成指定大小(IO流)相关的知识,希望对你有一定的参考价值。
1 package stream; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileOutputStream; 6 import java.io.IOException; 7 import java.util.Arrays; 8 9 public class TestStream { 10 11 public static void main(String[] args) { 12 int eachSize = 100 * 1024; // 100k 13 File srcFile = new File("d:/eclipse.exe"); 14 splitFile(srcFile, eachSize); 15 } 16 17 /** 18 * 拆分的思路,先把源文件的所有内容读取到内存中,然后从内存中挨个分到子文件里 19 * @param srcFile 要拆分的源文件 20 * @param eachSize 按照这个大小,拆分 21 */ 22 private static void splitFile(File srcFile, int eachSize) { 23 24 if (0 == srcFile.length()) 25 throw new RuntimeException("文件长度为0,不可拆分"); 26 27 byte[] fileContent = new byte[(int) srcFile.length()]; 28 // 先把文件读取到数组中 29 try { 30 FileInputStream fis = new FileInputStream(srcFile); 31 fis.read(fileContent); 32 fis.close(); 33 } catch (IOException e) { 34 // TODO Auto-generated catch block 35 e.printStackTrace(); 36 } 37 // 计算需要被划分成多少份子文件 38 int fileNumber; 39 // 文件是否能被整除得到的子文件个数是不一样的 40 // (假设文件长度是25,每份的大小是5,那么就应该是5个) 41 // (假设文件长度是26,每份的大小是5,那么就应该是6个) 42 if (0 == fileContent.length % eachSize) 43 fileNumber = (int) (fileContent.length / eachSize); 44 else 45 fileNumber = (int) (fileContent.length / eachSize) + 1; 46 47 for (int i = 0; i < fileNumber; i++) { 48 String eachFileName = srcFile.getName() + "-" + i; 49 File eachFile = new File(srcFile.getParent(), eachFileName); 50 byte[] eachContent; 51 52 // 从源文件的内容里,复制部分数据到子文件 53 // 除开最后一个文件,其他文件大小都是100k 54 // 最后一个文件的大小是剩余的 55 if (i != fileNumber - 1) // 不是最后一个 56 eachContent = Arrays.copyOfRange(fileContent, eachSize * i, eachSize * (i + 1)); 57 else // 最后一个 58 eachContent = Arrays.copyOfRange(fileContent, eachSize * i, fileContent.length); 59 60 try { 61 // 写出去 62 FileOutputStream fos = new FileOutputStream(eachFile); 63 fos.write(eachContent); 64 // 记得关闭 65 fos.close(); 66 System.out.printf("输出子文件%s,其大小是 %d字节%n", eachFile.getAbsoluteFile(), eachFile.length()); 67 } catch (IOException e) { 68 // TODO Auto-generated catch block 69 e.printStackTrace(); 70 } 71 } 72 } 73 }
以上是关于文件拆分成指定大小(IO流)的主要内容,如果未能解决你的问题,请参考以下文章
java内存流:java.io.ByteArrayInputStreamjava.io.ByteArrayOutputStreamjava.io.CharArrayReaderjava.io(代码片段
java缓冲字符字节输入输出流:java.io.BufferedReaderjava.io.BufferedWriterjava.io.BufferedInputStreamjava.io.(代码片段