Попал в бесконечный цикл при получении файла, используя datainputstream и bufferedinputstream - PullRequest
0 голосов
/ 05 октября 2011

Я пытаюсь создать серверную программу, которая получает файл от клиента, используя DataInputStream и BufferedInputStream.

Вот мой код, и он попадает в бесконечный цикл, я думаю, что это из-за не использования available (), ноне совсем уверен.

DataInputStream din = new DataInputStream(new BufferedInputStream(s.getInputStream()));
//s is socket that connects fine
fos = new FileOutputStream(directory+"/"+filename);

byte b[] = new byte[512]; 
int readByte = din.read(b);
while(readByte != 1){
    fos.write(b);
    readByte = din.read(b);
    //System.out.println("infinite loop...");
}

Может кто-нибудь сказать мне, почему он попадает в бесконечный цикл?если это из-за неиспользования доступных, скажите, пожалуйста, как его использовать?Я на самом деле гуглил, но меня смущало использование.Большое спасибо

Ответы [ 3 ]

2 голосов
/ 05 октября 2011

Я думаю, что вы хотите сделать while(readByte != -1). См. документацию (-1 означает, что больше нечего читать).

Ответ на комментарий

Это работает для меня:

FileInputStream in = new FileInputStream(new File("C:\\Users\\Rachel\\Desktop\\Test.txt"));
DataInputStream din = new DataInputStream(new BufferedInputStream(in));
FileOutputStream fos = new FileOutputStream("C:\\Users\\Rachel\\Desktop\\MyOtherFile.txt");

byte b[] = new byte[512]; 
while(din.read(b) != -1){
    fos.write(b);
}

System.out.println("Got out");
0 голосов
/ 05 октября 2011

На ваш вопрос уже дан ответ, но в этом коде есть другая проблема, которая исправлена ​​ниже. Канонический цикл копирования потока выглядит следующим образом:

while ((count = in.read(buffer)) > 0)
{
  out.write(buffer, 0, count);
}
0 голосов
/ 05 октября 2011

Как указала Рэйчел, метод read в DataInputStream возвращает количество успешно прочитанных байтов или -1, если достигнут конец. Идиоматический способ зацикливания до достижения конца - while(readByte != -1), тогда как у вас было 1 по ошибке. Если никогда не читается ровно 1 байт, то это будет бесконечный цикл (readByte никогда не изменится с -1 после достижения конца потока). Если случайно есть итерация, в которой читается ровно 1 байт, это фактически закончилось бы раньше, чем переход в бесконечный цикл.

...