ObjectInputStream给出了奇怪的结果

时间:2012-04-26 01:20:56

标签: java network-programming

这是我正在使用的代码。

客户端:

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?

由于

1 个答案:

答案 0 :(得分:1)

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

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