这是我正在使用的代码。
客户端:
public static void main(String[] args) throws IOException {
Socket socket = new Socket("0.0.0.0", 5555);
ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
FileInputStream in = new FileInputStream("C:/Documents and Settings/Owner/Desktop/Client/README.txt");
byte[] b = new byte[1024];
int i = 0;
i = in.read(b);
out.writeInt(i);
out.write(b, 0, i);
out.flush();
i = in.read(b);
out.writeInt(i);
out.write(b, 0, i);
out.flush();
out.close();
in.close();
socket.close();
}
服务器:
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(5555);
Socket s = ss.accept();
ObjectInputStream in = new ObjectInputStream(s.getInputStream());
FileOutputStream fos = new FileOutputStream("C:/README.txt");
int i = 0;
i = in.readInt();
System.out.println(i);
byte[] bytes = new byte[i];
in.read(bytes);
i = in.readInt();
System.out.println(i);
byte[] bytes2 = new byte[i];
in.read(bytes2);
fos.write(bytes);
fos.close();
s.close();
ss.close();
}
文件README.txt中包含~2400个字节。当我运行它时,服务器输出它。
1024
1869488225
然后抛出java.lang.OutOfMemoryError。
有人可以告诉我为什么它正在读取1869488225而不是1024?
由于
答案 0 :(得分:1)
in.read(bytes);
in.read(bytes2);
这里你忽略了read的返回值并假设它填充了缓冲区。您应该在此处将read()
更改为readFully()
,但一般情况下,您永远不应忽略read()
结果。它可以是-1表示EOS,或者它可以是从1到缓冲区大小的任何计数。如果你无意中指定了一个零长度缓冲区,它甚至可以为零。