1

我正在通过 apache.commons.FtpClient 读取文件。

这在 99.9% 的情况下都可以正常工作,但有时它会在 read() 方法中死掉......

InputStream inStream = ftp.retrieveFileStream(path + file.getName());
String fileAsString = "";

if(inStream == null){
    return;
}
while((c = inStream.read()) != -1){ //this is where the code sometimes just hangs               
   fileAsString += Character.valueOf((char)c);

}

我的问题是什么是防止这种无限期锁定系统的最可靠方法。我应该在单独的线程中设置计时器吗?或者有更简单的方法吗?

4

2 回答 2

4

如果您的代码挂起,则意味着您的 FTP 服务器尚未发送整个文件。您可以使用计时器,但我相信 FtpClient 允许您设置超时。

顺便说一句:您读取文件的方式非常低效。如果您的文件大于几 K,它将使用越来越多的 CPU。

您正在从一个字节(这本身就是一个坏主意)创建一个字符,并为文件中的每个字节创建一个字符串对象。

我建议使用提供的复制方法或 commons-io 库附带的方法将数据复制到 ByteArrayInputStream。

于 2009-02-28T07:22:12.970 回答
1

只需快速浏览一下文档,如果您这样做了...

while (inStream.available() > 0 && (c = inStream.read()) != -1)

似乎它会在您实际阅读之前仔细检查您是否可以阅读而不会阻塞。不过我不确定。

于 2009-02-27T22:42:44.997 回答