使用datainputstream和bufferedinputstream接收文件时陷入无限循环

时间:2011-10-05 03:16:02

标签: java network-programming bufferedinputstream datainputstream

我正在尝试使用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 个答案:

答案 0 :(得分:2)

我想你想做while(readByte != -1)。参见documentation(-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");

答案 1 :(得分:0)

正如Rachel所指出的,DataInputStream上的read method返回成功读入的字节数,如果已达到结束,则返回-1。循环到达结尾的惯用方法是while(readByte != -1),而你错误地1。如果从来没有读过恰好1个字节的情况,那么这将是一个无限循环(readByte一旦达到流的末尾就永远不会从-1变化)。如果偶然有一个迭代,其中只读取1个字节,这实际上会提前终止,而不是进入无限循环。

答案 2 :(得分:0)

您的问题已经得到解答,但此代码还有另一个问题,请在下面进行更正。规范流复制循环如下所示:

while ((count = in.read(buffer)) > 0)
{
  out.write(buffer, 0, count);
}