1

这是我正在使用的代码。

客户:

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?

谢谢

4

1 回答 1

1
in.read(bytes);
in.read(bytes2);

在这里,您忽略了 read 的返回值并假设它填充了缓冲区。您应该更改read()readFully()此处,但通常您永远不应该忽略read()结果。它可以是 -1 表示 EOS,也可以是从 1 到缓冲区大小的任何计数。如果您无意中指定了长度为零的缓冲区,它甚至可以为零。

于 2012-04-26T01:28:41.913 回答