gpt4 book ai didi

java - 从 ObjectInputStream 读取与写入 ObjectOutputStream 不同的 byte[]

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:52:12 26 4
gpt4 key购买 nike

我有一个奇怪的 java 问题。我想在 ObjectOutputStream 中写入(除其他外)一个 byte[] 并从那里写入一个新文件。该字节数组表示从磁盘读取的其他文件。

稍后,在写入新创建的文件后,我想从该文件中读取。但是现在从 ObjectInputStream 中读取的 byte[] 与写入的不同。

这就是我的问题:为什么 byte[] 不一样?

为了让大家看清楚,我写了一个简短的程序,它会准确地表达我的意思:

import java.io.*;
import java.net.URL;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.security.MessageDigest;
import org.bouncycastle.util.encoders.Hex;

public class MyTest {

public static void main(String[] args) throws Exception {

// 1st step:
// ------------------------------------------------
byte[] data = openFile();

// Create file to write
FileOutputStream fos = new FileOutputStream(new File("test"));
ObjectOutputStream oosf = new ObjectOutputStream(fos);
// Write byte[]-length and byte[]
oosf.writeInt(data.length);
oosf.write(data);

// Flush & Close
fos.flush();
fos.close();

// Print hash value of saved byte[]
try {
final MessageDigest messageDigest = MessageDigest.getInstance("SHA-512");
messageDigest.reset();
System.out.println(new String(Hex.encode(messageDigest.digest(data))));
} catch (Exception e) {
}

// 2nd step
// ------------------------------------------------

// Open just saved file
FileInputStream fis = new FileInputStream(new File("test"));
ObjectInputStream ois = new ObjectInputStream(fis);

// Read the length and create a byte[]
int length = ois.readInt();
byte[] dataRead = new byte[length];
// Read the byte[] itself
ois.read(dataRead);

// Print hash value of read byte[]
try {
final MessageDigest messageDigest = MessageDigest.getInstance("SHA-512");
messageDigest.reset();
System.out.println(new String(Hex.encode(messageDigest.digest(dataRead))));
} catch (Exception e) {
}

// Both printed hash values should be the same

}

private static byte[] openFile() throws Exception {
// Download a sample file which will be converted to a byte[]
URL website = new URL("http://www.marcel-carle.de/assets/Cryptonify/Cryptonify-1.7.8.zip");
ReadableByteChannel rbc = Channels.newChannel(website.openStream());
FileOutputStream fos2 = new FileOutputStream("tmp");
fos2.getChannel().transferFrom(rbc, 0, 1 << 24);
fos2.flush();
fos2.close();

// Open downloaded file and convert to byte[]
File selectedFile = new File("tmp");
FileInputStream fis1 = new FileInputStream(selectedFile);
byte[] data = new byte[(int) selectedFile.length()];
fis1.read(data);
fis1.close();


return data;
}
}

我希望你能帮助我!

最佳答案

您忽略了异常;您没有关闭正确的流;并且您假设 read() 填充缓冲区。使用 readFully()。您不是在编写对象,因此您也可以为此使用 DataInputStreamDataOutputStream 并节省一点空间。

关于java - 从 ObjectInputStream 读取与写入 ObjectOutputStream 不同的 byte[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13094966/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com