我正在尝试构建一个服务器程序,使用DataInputStream和BufferedInputStream从客户端接收文件。
这是我的代码,它陷入无限循环,我认为这是因为没有使用可用(),但我不是很确定。
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...");
}
谁能告诉我为什么它会陷入无限循环?如果是因为没有使用可用的你能告诉我怎么用吗?我实际上谷歌了一下,但我对用法感到困惑。非常感谢
我认为你想做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");
正如Rachel指出的那样,DataInputStream上的read
方法返回成功读取的字节数,如果已经到达结束,则返回-1。循环直到到达终点的惯用方法是while(readByte != -1)
,而您错误地使用了1
。如果从来没有恰好读取1字节的情况,那么这将是一个无限循环(一旦到达流的末端,readByte
将永远不会从-1改变)。如果碰巧有一次迭代恰好读取了1个字节,这实际上会提前终止,而不是进入无限循环。
你的问题已经回答了,但是这个代码有另一个问题,下面更正。规范流复制循环如下所示:
while ((count = in.read(buffer)) > 0)
{
out.write(buffer, 0, count);
}