0

このコードを書いてスレッドにファイルをアップロードしています

import java.io.*;
public class FileUploadThread extends Thread {

    File f1, f2;
    String fileName;
    InputStream stream;
    byte[] b = new byte[1024];

    public FileUploadThread(File f1, File f2, InputStream stream, String filename) {
        System.out.println("external class file name--->" + filename);
        this.f1 = f1;
        this.f2 = f2;
        this.stream = stream;
        this.fileName = filename;
    }

    public void run() {
        try {
            f2 = new File(f1, fileName);
            OutputStream w = new FileOutputStream(f2);

            int res = stream.read(b);
            System.out.println("res = "+res);
            while (res >= 0) {
                for (int i = 0; i < res; i++) {
                    w.write(b);
                }
              res = stream.read(b);
              System.out.println("res--->" + res);
            }

        } catch (Exception e) {
            System.out.println("In the run method of the thread");
            e.printStackTrace();
        }
    }

}

それは私を示していますArrayIndexOutOfBoundsException

4

2 に答える 2

1

使ってみてw.write(b, 0, res)

基本的に使用しているメソッドは を呼び出していますが、読み取りは最大バイト数w.write(b, 0, b.length)を返すことができますb.length

アップデート

あなたのコピーループはもっと似ているはずです...

OutputStream w = null;
try {
    f2 = new File(f1, fileName);
    w = new FileOutputStream(f2);

    int res = -1;
    while ((res = stream.read(b)) != -1) {
        w.write(b, 0, res);
    }

} catch (Exception e) {
    System.out.println("In the run method of the thread");
    e.printStackTrace();
} finally {
    try {
        w.close();
    } catch (Exception e) {
    }
}

ストリームを開いた場合は、それを閉じる責任があることを忘れないでください...

于 2012-10-04T09:51:26.397 に答える
0

あなたの状況はわかりませんが、私にとってはうまくいきます。そして、このプログラムについて 2 つの提案があります。

1. run 関数で f2 参照を として割り当てたので、コンストラクターでf2 = new File(f1, fileName);別の File パラメーターを渡すのはなぜですか? File f2私が見る限り、コンストラクターの f2 パラメーターは役に立ちません。

2.書くのにforループは必要ありません。を呼び出すとw.write(b)、実際には b のすべてのバイトがフラッシュされてから、f2 に書き込まれます。

于 2012-10-04T11:45:01.657 に答える