докато цикълът не излиза при четене на файл през BufferedReader

В моето приложение имам клиентски и сървърни програми, всеки път, когато сървърът получи връзка от клиент, сървърът ще изпрати всички налични идентификационни номера от таблицата на MySQL към клиента, за това използвах цикъл while за четене на съдържанието на файла.

Опитах следния код:

while((a=in.read())!=-1)

но моят проблем, когато няма съдържание във файла за четене, цикълът while не излиза, той сам спира там. Как да излезете от цикъла while?


person Sai Sai    schedule 12.02.2013    source източник
comment
in.read() е блокиращо повикване, то ще спре и ще изчака някакъв вход   -  person asifsid88    schedule 12.02.2013
comment
in е четец на входен поток, който чете от файла   -  person asifsid88    schedule 12.02.2013
comment
благодаря за отговора, in е BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream()));   -  person Sai Sai    schedule 12.02.2013
comment
Защо не използвате BufferedReader и тогава можете да проверите за null.   -  person aa8y    schedule 12.02.2013
comment
благодаря за отговора asif, да in е inputstreamreader.   -  person Sai Sai    schedule 12.02.2013
comment
@Sai Sai, провери за null не за -1.   -  person aa8y    schedule 12.02.2013
comment
благодаря за отговора, всъщност a е цяло число   -  person Sai Sai    schedule 12.02.2013
comment
@Expressions_Galore Ако не получава -1 от read(), той също няма да получи нула от readLine(). Предложението е безсмислено.   -  person user207421    schedule 13.02.2013


Отговори (2)


in.read() ще блокира, докато данните станат достъпни за четене. Вижте документите за API http://docs.oracle.com/javase/6/docs/api/java/io/InputStream.html#read()

Този метод блокира, докато входните данни са налични, краят на потока не бъде открит или не бъде хвърлено изключение.

Можете да направите in.available(), за да проверите дали някой байт е достъпен за четене, преди да направите in.read().

person Bimalesh Jha    schedule 12.02.2013
comment
благодаря за отговора bimalesh, използвах in.ready() вместо in.available, така че работи за мен - person Sai Sai; 12.02.2013
comment
, зададох скорошния си въпрос като отстраняване на грешки в сокет, в това приложение получавам някакъв проблем, можете ли да ми помогнете да разреша проблема. - person Sai Sai; 26.02.2013

Не трябва да използвате цикъла while, по-скоро трябва да отидете с нишки, които ще чакат входа от сокета и когато данните са налични, той ще прочете и след това ще изпрати/обработи входа, намерен в потока. Използването на while и чакане (блокиране) на вашата основна нишка не е добра идея

person asifsid88    schedule 12.02.2013