Java 中序列化字节数组的问题
Issue with serializing byte array in Java
我正在尝试通过 ObjectOutputStream 将文件从服务器发送到客户端。我认为使用此流发送不同对象和原始文件数据是一种更简单的方法。
我在一个循环中发送字节数组大小为 Integer
,原始数据本身为 byte[]
,字节数组哈希码为 Integer
,然后完成服务器和客户端发送 -1
作为大小。因此,每次迭代都会发送三个对象。
但是,它无法正常工作 - 客户端获得正确的大小和散列,但它也会在每次迭代中一次又一次地获得相同的 byte[]
数组。
客户代码:
int size;
byte[] buf;
while ((size = (int) in.readObject()) > 0) {
fOut.write((buf = (byte[]) in.readObject()), 0, size);
System.out.printf("%d\tvs\t%d%n", Arrays.hashCode(buf), (int) in.readObject());
}
服务器代码:
byte[] buf = new byte[(int) MB];
int bufSize;
while ((bufSize = fileReader.read(buf)) != -1) {
out.writeObject(bufSize);
out.writeObject(buf);
out.writeObject(Arrays.hashCode(buf));
}
out.writeObject(-1);
客户端和服务器端的out
和in
都是:
in = new ObjectInputStream(socket.getInputStream());
out = new ObjectOutputStream(socket.getOutputStream());
客户端输出:
Connecting...
Connection established
-1060163348 vs -1060163348
-1060163348 vs 1768685466
-1060163348 vs 861707881
-1060163348 vs 1055789475
-1060163348 vs -79313434
-1060163348 vs 385231183
-1060163348 vs -633252012
...
如您所见 - 所有 byte[] 都等于(
PS。请注意,文件的第一个 MB 已正确发送。如果文件大小小于 1 MB,它也会被正确发送。
我想问题是流保存了每个写入的对象。所以我从某种缓存中读取字节数组,而不是从套接字中读取...
但是,它有帮助!
byte[] buf = new byte[(int) MB];
int bufSize;
while ((bufSize = fileReader.read(buf)) != -1) {
out.writeObject(bufSize);
out.writeObject(buf);
out.writeObject(Arrays.hashCode(buf));
out.reset(); // new line - it helps!!!!
}
out.writeObject(-1);
我正在尝试通过 ObjectOutputStream 将文件从服务器发送到客户端。我认为使用此流发送不同对象和原始文件数据是一种更简单的方法。
我在一个循环中发送字节数组大小为 Integer
,原始数据本身为 byte[]
,字节数组哈希码为 Integer
,然后完成服务器和客户端发送 -1
作为大小。因此,每次迭代都会发送三个对象。
但是,它无法正常工作 - 客户端获得正确的大小和散列,但它也会在每次迭代中一次又一次地获得相同的 byte[]
数组。
客户代码:
int size;
byte[] buf;
while ((size = (int) in.readObject()) > 0) {
fOut.write((buf = (byte[]) in.readObject()), 0, size);
System.out.printf("%d\tvs\t%d%n", Arrays.hashCode(buf), (int) in.readObject());
}
服务器代码:
byte[] buf = new byte[(int) MB];
int bufSize;
while ((bufSize = fileReader.read(buf)) != -1) {
out.writeObject(bufSize);
out.writeObject(buf);
out.writeObject(Arrays.hashCode(buf));
}
out.writeObject(-1);
客户端和服务器端的out
和in
都是:
in = new ObjectInputStream(socket.getInputStream());
out = new ObjectOutputStream(socket.getOutputStream());
客户端输出:
Connecting...
Connection established
-1060163348 vs -1060163348
-1060163348 vs 1768685466
-1060163348 vs 861707881
-1060163348 vs 1055789475
-1060163348 vs -79313434
-1060163348 vs 385231183
-1060163348 vs -633252012
...
如您所见 - 所有 byte[] 都等于(
PS。请注意,文件的第一个 MB 已正确发送。如果文件大小小于 1 MB,它也会被正确发送。
我想问题是流保存了每个写入的对象。所以我从某种缓存中读取字节数组,而不是从套接字中读取...
但是,它有帮助!
byte[] buf = new byte[(int) MB];
int bufSize;
while ((bufSize = fileReader.read(buf)) != -1) {
out.writeObject(bufSize);
out.writeObject(buf);
out.writeObject(Arrays.hashCode(buf));
out.reset(); // new line - it helps!!!!
}
out.writeObject(-1);