java - 如何使用 Java 将文件分成多个部分?

标签 java file io

我有一个奇怪的问题要问 - 如何使用 Java(任何文件类型)将给定文件分成小块?然后我可以将这些片段放入许多 CD 和/或 pendrives 中并将它们带走。我试过了this方式

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

当我将一个文件分成多个部分(比如 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.001 - myFile.mp4.012大小为 1 MB
  • myFile.mp4.013大小为 806 KB

如果你想合并这些文件你可以使用

public static void mergeFiles(List<File> 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<File> 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<File> (我们将根据其中一个文件生成该列表)

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

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

public static List<File> 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));
}

关于java - 如何使用 Java 将文件分成多个部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10864317/

相关文章:

io - 使用 javax.smartcardio 从智能卡读取序列号

java - 谁能帮我解决依赖注入(inject)问题?

java - 正则表达式:在Java中分割复杂列表(两列)

php - file_get_contents 相当于 gzip 文件

syntax - io :format and io:fwrite in Erlang? 有什么区别

c# - 在 WinService 或 WinForms 应用程序中通过 URL 目录获取文件名

java - MIDINOTE_ONNOTE_OFF消息对应

java - 在 Java 中解析文本文件

java - 无法从 jar 文件连接 Access 数据库

c++ - 为什么这个 write() 操作只写一行