0
public static byte[] objectToByteArray(Object obj) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
ObjectOutputStream objOut = null;
try {
    objOut = new ObjectOutputStream(out);
    objOut.writeObject(obj);
    objOut.flush();
} finally {
    objOut.close();
    out.close();
}
return out.toByteArray();
}

Main Method :



 public static void main(String[] args) throws IOException {
//
// System.out.println(getFileName("/home/local/ZOHOCORP/bharathi-1397/logs/bharathi-1397.csez.zohocorpin.com_2012_05_24.log",0));
try {
    throw new IOException("Error in main method");
} catch (IOException io) {
    System.out.println(new String(objectToByteArray(io.getMessage()),
        "UTF-8"));
}
//
}

输出:��

我想将 Object 转换为 byte[] 但为什么它会返回这样的 ctrl 字符。我不明白你能帮帮我吗。

4

4 回答 4

1

序列化将对象转换为二进制数据。它基本上不是文本数据——就像图像文件不是文本数据一样。

您的代码尝试将这种不透明的二进制数据解释为 UTF-8 编码的文本数据。不是,所以难怪你会看到垃圾。如果您在文本编辑器中打开图像文件,您会看到类似的无用文本。您可以尝试将数据解释为文本(正如您所做的那样),但您不会得到任何有用的信息。

如果您想以可打印、可逆的方式将不透明的二进制数据表示为文本,您应该使用 base64 或 hex。有很多库可用于转换为 base64,包括这个公共域之一

于 2012-05-24T06:03:53.127 回答
1

当您使用 ObjectOutputStream 时,Java 以自己的二进制格式存储对象。在使用之前,您必须使用 ObjectInputStream 将数据解码为正确的对象。

于 2012-05-24T06:03:59.237 回答
0

java api doc: public final void writeObject(Object obj) throws IOException; 将指定对象写入 ObjectOutputStream。写入对象的类、类的签名、类的非瞬态和非静态字段的值及其所有超类型。可以使用 writeObject 和 readObject 方法覆盖类的默认序列化。此对象引用的对象是可传递的,因此可以通过 ObjectInputStream 重建一个完全等效的对象图。

http://docs.oracle.com/javase/1.4.2/docs/api/java/io/ObjectOutputStream.html#writeObject(java.lang.Object )

于 2012-05-24T06:10:25.427 回答
0

您可以找到以下用于从文件写入和读取字节值的方法。

转换为十六进制字符串,然后转换为 Base64 格式

读取文件 Base64 格式

    byte [] encDataByteArr = hexToBytes(encData);
    byte [] dataBack = Base64.decodeBase64(encDataByteArr);

写入文件

    byte [] data = Base64.encodeBase64(encDataByteArr);
    returnValue = bytesToHex(data);

一些实用方法如下

public static synchronized String bytesToHex(byte [] buf){
    StringBuffer strbuf = new StringBuffer(buf.length * 2);
    int i;
    for (i = 0; i < buf.length; i++) {
        if (((int) buf[i] & 0xff) < 0x10){
            strbuf.append("0");
        }
        strbuf.append(Long.toString((int) buf[i] & 0xff, 16));
    }
    return strbuf.toString();
}

public synchronized static byte[] hexToBytes(String hexString) {
     byte[] b = new BigInteger(hexString,16).toByteArray();     
     return b;
}
于 2012-05-24T06:35:35.957 回答