1

我真的要疯了。

我正在编写一个小型 Java(必须是 SDK 6)工具,使用 commons-net-3.1.jar 库将一堆文件同时上传到另一组服务器。我主要将它与 .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(),你会没事的。

这是避免此类繁琐代码并使用实用方法的另一个原因,例如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 回答