2009-02-27 4 views
1

Я читаю файл через apache.commons.FtpClient.Каков наилучший способ контроля InputStream?

Это отлично работает 99,9% времени, но иногда это просто умирает в методе чтения() ...

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); 

} 

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

ответ

1

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

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

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

+0

Мне нравится это решение, хотя я подозреваю, что все еще есть шанс, что между проверкой доступных и read() соединение может как-то устаревать ... Я понимаю, что это очень маловероятно, но это может произойти, правильно? –

+0

Если у вас есть медленное соединение, доступное() вернет 0 либо в начале файла, либо каким-то образом до конца. –

+0

Если в FtpClient нет ничего плохого, это не может быть реальным решением. read() следует блокировать, только если доступно() возвращает 0, поэтому вместо ожидания в read() вы будете ждать в этом цикле и потреблять намного больше CPU. –

4

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

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

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

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

+0

плюс 1 для указания символа/байта + строка вопроса. Это должен быть StringBuilder.append как минимум. –

+0

и InputStream.read (byte [] b, int off, int len). Поэтому, хотя этот пост не является фактическим ответом, я бы сказал, что он оказывает большую помощь OP-+1 от меня. –

+0

Я согласен, что InputStream.read (byte [] b, int off, int len) должен использоваться, но это было упомянуто одним из 3 ответов, я могу видеть только два на данный момент. ?? –

Смежные вопросы