如何使用Java将文件分成几部分?

我有一个奇怪的问题要问。 我需要知道如何使用Java(任何文件类型)将给定文件分成小块。 然后,我可以将这些和平放入CD,pendrives并带走。 我用这种方式试了一下

但正如大多数用户评论的那样,我正在尝试的是以这种方式无法实现的。 因此,我决定提出一个新问题,以获得正确的破解文件的方法。

当我将文件分成几块(猜30件)时,必须有一种方法可以重新组装它们并创建原始文件。 请帮忙。

读取字节到字节数组的部分,并在缓冲区已满或文件结束时将它们存储在新文件中。

例如(代码不完美,但它应该有助于理解过程)

class FileSplit { public static void splitFile(File f) throws IOException { int partCounter = 1;//I like to name parts from 001, 002, 003, ... //you can change it to 0 if you want 000, 001, ... int sizeOfFiles = 1024 * 1024;// 1MB byte[] buffer = new byte[sizeOfFiles]; String fileName = f.getName(); //try-with-resources to ensure closing stream try (FileInputStream fis = new FileInputStream(f); BufferedInputStream bis = new BufferedInputStream(fis)) { int bytesAmount = 0; while ((bytesAmount = bis.read(buffer)) > 0) { //write each chunk of data into separate file with different number in name String filePartName = String.format("%s.%03d", fileName, partCounter++); File newFile = new File(f.getParent(), filePartName); try (FileOutputStream out = new FileOutputStream(newFile)) { out.write(buffer, 0, bytesAmount); } } } } public static void main(String[] args) throws IOException { splitFile(new File("D:\\destination\\myFile.mp4")); } } 

myFile.mp4大小= 12,7 MB

拆分后我有13个文件

  • myFile.mp4.001myFile.mp4.012 ,大小为1 MB
  • myFile.mp4.013 ,大小为806 KB

如果要合并这些文件,可以使用

 public static void mergeFiles(List files, File into) throws IOException { try (FileOutputStream fos = new FileOutputStream(into); BufferedOutputStream mergingStream = new BufferedOutputStream(fos)) { for (File f : files) { Files.copy(f.toPath(), mergingStream); } } } 

您还可以创建一些其他方法,让您的生活更轻松。 例如,该方法将基于这些文件之一的名称(和位置)创建包含分离部分的文件列表。

 public static List listOfFilesToMerge(File oneOfFiles) { String tmpName = oneOfFiles.getName();//{name}.{number} String destFileName = tmpName.substring(0, tmpName.lastIndexOf('.'));//remove .{number} File[] files = oneOfFiles.getParentFile().listFiles( (File dir, String name) -> name.matches(destFileName + "[.]\\d+")); Arrays.sort(files);//ensuring order 001, 002, ..., 010, ... return Arrays.asList(files); } 

使用该方法,我们可以重载mergeFiles方法,只使用其中一个文件File oneOfFiles而不是整个列表List (我们将根据其中一个文件生成该列表)

 public static void mergeFiles(File oneOfFiles, File into) throws IOException { mergeFiles(listOfFilesToMerge(oneOfFiles), into); } 

您还可以重载这些方法以使用String而不是File (我们将在需要时将每个String包装在File中)

 public static List listOfFilesToMerge(String oneOfFiles) { return listOfFilesToMerge(new File(oneOfFiles)); } public static void mergeFiles(String oneOfFiles, String into) throws IOException{ mergeFiles(new File(oneOfFiles), new File(into)); } 

读取和写入流作为原始byte[] 。 避免文本流和读者。

在你的上一个问题中,你显然是根据’line’分解文件。 要复制该行为,只需使用固定大小的byte[]进行读取。 请仔细注意上一个问题的注释中的警告,以检查读取的字节数。 一个byte[2^16]不一定会在一次读取中填充。