2

バイナリ I/O を使用して一部のファイルを分割して作成された .dat ファイルを接続する際に問題が発生しました。

この問題は、.avi ファイル (2GB 以下) など、一部の種類のファイルで発生します。再度接続すると、出力ファイルは分割されたファイルとまったく同じように見えますが、.avi ファイルの場合、「ファイルをレンダリングできません」というエラーが発生します。(バイナリ I/O を使用してファイルのコピーを作成している場合も同じことが起こります)。ただし、たとえば、.mp4 ファイルは正しく接続されます。

私の質問は、なぜそれが起こるのですか?私が教えられたように、どのファイルも 0 と 1 のシーケンスにすぎないためです。そのため、ファイルのバイナリ シーケンスを書き直して同じファイル形式を設定すれば、すべて正常に動作するはずです。

念のため、ファイルを分割して接続するためのコードを次に示します (正常に動作します)。

--- スプリッター ---

public static void main(String[] args) throws IOException {

    String sourceFile = "Movie2.mp4";
    int parts = 5;

    BufferedInputStream in = new BufferedInputStream(new FileInputStream(sourceFile));
    BufferedOutputStream out;

    int partSize = in.available() / parts;
    byte[] b;       

    for (int i = 0; i < parts; i++) {
        if (i == parts - 1) {                
            b = new byte[in.available()];
            in.read(b);
            out = new BufferedOutputStream(new FileOutputStream(sourceFile + "_" + i + ".dat"));
            out.write(b);
            out.close();
        } else {
            b = new byte[partSize];
            in.read(b);
            out = new BufferedOutputStream(new FileOutputStream(sourceFile + "_" + i + ".dat"));
            out.write(b);
            out.close();
        }
    }

    in.close();
}

--- コネクタ ---

public static void main(String[] args) throws IOException {

    String sourceFile;
    BufferedInputStream in;
    byte[] b;
    BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("Movie2RESTORED.mp4", true));

    for (int i = 0; i < 5; i++) {
        sourceFile = "Movie2.mp4_" + i + ".dat";
        in = new BufferedInputStream(new FileInputStream(sourceFile));
        b = new byte[in.available()];
        in.read(b);
        out.write(b);
        in.close();
    }

    out.close();
}

前もって感謝します!

4

1 に答える 1

3

ループが必要ですin.read(b)

availableブロックせずに読み取ることができるバイト数を返すことになっている場合でも、readすべてを取得するには数回呼び出す必要がある場合があります。これは、固定サイズのバッファを使用する方が簡単ですが、 available で指定されたバイト数を読み取ることに固執する場合:

int toBeRead = in.available();
byte[] b = new byte[toBeRead];
int totalRead = 0;
int read;
while ((read = in.read(b, totalRead, toBeRead-totalRead)) != -1) {
    totalRead += read;
}

また、aetheria で述べたようcloseに、さまざまな出力ストリームを閉じるために呼び出す必要があります。そうしないと、JVM および OS バッファに保持されているデータがファイルに取り込まれない可能性がありますが、現在は取り込まれているようです。

于 2012-10-22T14:55:17.420 に答える