当前位置: 首页 > 面试题库 >

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

双子民
2023-03-14
问题内容

我有一个奇怪的问题要问。我需要知道如何使用Java(任何文件类型)将给定的文件分成小块。然后,我可以将这些光盘放入CD,笔式驱动器中,然后带走。我用这种方式尝试过

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

当我将文件分解成碎片(猜测是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);
        }
    }
}

您还可以创建一些其他方法来简化生活。例如,html" target="_blank">实例方法将基于这些文件之一的名称(和位置)创建包含分开的零件的文件列表。

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(我们将在需要时将每个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));
}


 类似资料:
  • 我需要将任何大小的视频文件拆分为最大大小为75 MB的各个部分。我找到了此代码,但它不起作用:

  • 问题内容: 我正在使用以下Java代码从Internet下载文件: 我想知道是否可以下载文件的一部分。例如,对于5MB的文件,下载最后2MB。 问题答案: 如果服务器支持(并且HTTP 1.1服务器 应支持 ),则可以使用范围请求: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35 此外,一次读取一个字符的效率非常低-您

  • 问题内容: 谁能告诉我将多部分文件(org.springframework.web.multipart.MultipartFile)转换为File(java.io.File)的最佳方法是什么? 在我的春季MVC Web项目中,我正在以Multipart文件的形式上传文件。我必须将其转换为File(io),因此我可以将此图像存储服务 称为Cloudinary 。它们仅采用(File)类型。 我进行了

  • 谁能告诉我什么是将多部分文件(org.springframework.web.multipart.multipartfile)转换为文件(java.io.file)的最佳方法?

  • 这是为了俄罗斯方块。玻璃(蓝色)位于左侧,控制(红色面板)位于右侧。换句话说,现在我只想有一个框架分成两部分:左边(较宽)部分是蓝色,右边部分是红色。没别的了。但我似乎没能做到这一点。 所以,我的逻辑是:让框架有FlowLayout。然后,我添加了两个面板,这意味着它们将被放在一个行中。

  • 这不会返回字节长度或文件大小的任何值。我想把文件值读到StringBuffer中。有人能提供关于这一点的指针吗?我不确定在将该文件解析为字符串之前是否需要保存该文件。如果是,如何在工作区中保存文件?