Какой лучший способ контролировать InputStream? - PullRequest
1 голос
/ 28 февраля 2009

Я читаю файл через 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);

}

Мой вопрос - какой самый надежный способ защитить систему от блокировки на неопределенный срок? Должен ли я установить таймер в отдельном потоке? Или есть более простой способ сделать это?

Ответы [ 2 ]

4 голосов
/ 28 февраля 2009

Если ваш код зависает, это означает, что ваш FTP-сервер не отправил весь файл. Вы можете использовать Таймер, но я считаю, что FtpClient позволяет вам установить тайм-аут.

Кстати: способ чтения файла очень неэффективен. Если ваш файл больше, чем несколько K, он будет использовать все больше процессорных ресурсов.

Вы создаете Символ из байта (что само по себе является плохой идеей) и объекта String для каждого байта в файле.

Я предлагаю использовать предоставленный метод копирования или тот, который поставляется с библиотекой commons-io, для копирования данных в ByteArrayInputStream.

1 голос
/ 28 февраля 2009

Просто с быстрого взгляда на документы, если вы сделали ...

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

Похоже, что нужно было бы дважды проверить, что вы можете читать без блокировки, прежде чем вы начнете читать. Хотя я не уверен в этом.

...