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

我不知道你的情况如何,但它对我来说很好用。我对这个程序有两个建议:

1.既然你在run函数中将f2引用赋值为f2 = new File(f1, fileName);,为什么还要File f2在构造函数中传递另一个File参数?据我所知,构造函数中的 f2 参数是没用的。

2.你不需要for循环来写。一旦你调用w.write(b)它,它实际上会刷新 b 中的所有字节,然后写入 f2。

于 2012-10-04T11:45:01.657 回答