1

私は本当にこれに夢中になります。

commons-net-3.1.jar ライブラリを使用して、一連のファイルを別の一連のサーバーに同時にアップロードする小さな Java (SDK 6 である必要があります) ツールを作成しています。主に.jpg画像で使用します。誰かが尋ねる前に、接続を BINARY_FILE_TYPE に設定しました:)

実行しようとすると、すべてがスムーズに進みますが、画像をアップロードした後、ファイルが途中で破損したかのように、画像に「小さな線」が表示されることがあります。

この小さなコードがすべての作業を行います。ファイルのアップロードを正しく維持するために、 os.write が失敗したときに最初のキャッチをどのように管理する必要があるかについての手がかりはありますか?

try {
    InputStream is = new FileInputStream(rutaFichero);
    OutputStream os = ftp.storeFileStream(nombreFichero);
    byte buf[] = new byte[8192];
    bytesRead = is.read(buf);

    while ((bytesRead = is.read(buf)) != -1) {
        try {
            os.write(buf, 0, bytesRead);
        } catch (IOException ioe) {
        } catch (NullPointerException npe) {
        }
    }

    is.close();
    try {
        os.close();
        completado = ftp.completePendingCommand();
        if (completado) {
    } catch (NullPointerException npe) {}
}

興味本位で回線の調子が悪いのではないかと思い、数日転送してからファイルサイズを確認したところ…どれも一致しませんでした!なんと!?

4

2 に答える 2

2

ここの最初の行にバグがあります:

bytesRead = is.read(buf);

while ((bytesRead = is.read(buf)) != -1) {
    try {
        os.write(buf, 0, bytesRead);
    } catch (IOException ioe) {
    } catch (NullPointerException npe) {
    }
}

buf最初の内容を書くことはありません。それらを読み取ってから、whileループ内の後続のチャンクを読み取るだけです。最初のものを削除すると、is.read()問題ありません。

このような面倒なコードを避けて、次のようなユーティリティ メソッドを使用することも、もう 1 つの理由ですIOUtils.copy()

InputStream is = new FileInputStream(rutaFichero);
OutputStream os = ftp.storeFileStream(nombreFichero);
IOUtils.copy(is, os);
is.close();
os.close();
于 2012-11-09T15:46:24.850 に答える
2

この問題は、何人かの仲間が私に電子メールを送ってくれて、ログイン後にモードタイプをバイナリに設定することについてアドバイスをくれたときに解決されました。

于 2012-11-10T08:42:37.117 に答える