14

ちょっと変わった質問があります - Java (任意のファイルタイプ) を使用して特定のファイルを小さな断片に分割するにはどうすればよいですか? 次に、それらの断片をいくつかの CD やペンドライブに入れ、持ち出すことができました。こんな風にしてみまし

しかし、ほとんどのユーザーがコメントしたように、私が試みていることはその方法では達成できません。そこで、ファイルを分割するための正しい方法を得るために、新しい質問をすることにしました。

ファイルを断片 (たとえば 30 断片) に分割する場合、それらを再構成して元のファイルを再作成する方法が必要です。助けてください。

4

2 に答える 2

43

バイトの一部をバイト配列に読み取り、バッファがいっぱいになったとき、またはファイルの終わりになったら、それらを新しいファイルに格納します。

たとえば(コードは完全ではありませんが、プロセスを理解するのに役立つはずです)

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,7MB

分割後、13個のファイルがありました

  • myFile.mp4.001-myFile.mp4.012サイズ1MB
  • myFile.mp4.013サイズ806KB

これらのファイルをマージする場合は、次を使用できます

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);
        }
    }
}

また、あなたの生活を楽にするためにいくつかの追加のメソッドを作成することができます。たとえば、これらのファイルの1つの名前(および場所)に基づいて分離された部分を含むファイルのリストを作成するメソッド。

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ではなく1つのファイルのみを使用できます(ファイルの1つに基づいてそのリストを生成します)File oneOfFilesList<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));
}
于 2012-06-02T17:12:19.107 に答える
3

ストリームを raw として読み書きしますbyte[]。テキスト ストリームとリーダーを避けます。

最後の質問では、「行」に従ってファイルを分割していたようです。その動作を再現するには、固定サイズの を使用byte[]して読み取るだけです。最後の質問に対するコメントの警告に注意して、読み取られたバイト数を確認してください。Abyte[2^16]は、1 回の読み取りで必ずしも満たされるとは限りません。

于 2012-06-02T17:10:33.670 に答える