Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 读取对象时发生StreamCorrupedException_Java_Exception_Header_Stream_Redis - Fatal编程技术网

Java 读取对象时发生StreamCorrupedException

Java 读取对象时发生StreamCorrupedException,java,exception,header,stream,redis,Java,Exception,Header,Stream,Redis,嗨,我需要读取字节数组作为一个对象。然而,每当我尝试它打印出流腐蚀异常 下面是我的写作代码 public class TestSave { public static void main(String[] args) { String key = "redismap"; Map<String, Object> map = new HashMap<String, Object>(); List<String>

嗨,我需要读取字节数组作为一个对象。然而,每当我尝试它打印出流腐蚀异常

下面是我的写作代码

public class TestSave {
    public static void main(String[] args) {
        String key = "redismap";
        Map<String, Object> map = new HashMap<String, Object>();
        List<String> list = new ArrayList<String>();

        map.put("String", "test");
        map.put("List", list);

        ObjectOutputStream oos = null;
        ByteArrayOutputStream bos = null;

        JedisHelper helper = JedisHelper.getInstacne();
        Jedis connection = helper.getConnection();

        try{
            bos = new ByteArrayOutputStream();
            oos = new ObjectOutputStream(bos);
            oos.writeObject(map);
            byte[] value = bos.toByteArray();           
            oos.close();
            connection.set(key.getBytes(), value);
        }catch(Exception e){e.printStackTrace();}
        helper.returnResource(connection);
        helper.destroyPool();
        System.out.println("DONE!");
    }
}
这就是我收到的错误信息

java.io.StreamCorruptedException: invalid stream header: EFBFBDEF
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:804)
    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:299)
    at org.owls.redis.test.TestWithdaw.main(TestWithdaw.java:28)
java.io.StreamCorruptedException:无效的流头:EFBFBDEF
位于java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:804)
位于java.io.ObjectInputStream。(ObjectInputStream.java:299)
位于org.owls.redis.test.TestWithdaw.main(TestWithdaw.java:28)
我不明白这个流标题有什么问题。
这些是我已经尝试过的:-我相信问题在于存储和检索序列化的字节-执行序列化和反序列化的代码本身就很好

如果没有中间存储,代码将正常工作,如下所示:

  ByteArrayOutputStream bos = new ByteArrayOutputStream();
  ObjectOutputStream oos = new ObjectOutputStream(bos);
  oos.writeObject(map);
  byte[] value = bos.toByteArray();
  oos.close();

  for (byte b : value)
  {
    System.out.print(Integer.toHexString(0xff & b) + " ");
  }
  System.out.println("");

  final ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(value));
  final Object read = ois.readObject();

  System.out.println("read: " + read);
这将产生:

ac ed 0 5 73 72 0 11 6a 61 76 61 2 E 75 74 69 6c 2 E 48 61 73 68 4d 61 70 5 7 da c1 c3 16 60 d1 3 0 2 46 0 a 6c 6 F 61 64 61 63 74 6 F 72 49 0 9 74 68 72 65 73 6 F 6 c 64 78 70 3 F 40 0 0 0 0 0 0 c 77 8 0 0 0 0 0 0 0 0 0 0 0 0 2 74 6 7 7 7 6 E67 74 0 4 74 65 74 74 74 74 0 4 c 6 6 6 6 6 76 61 76 6 72 72 75 74 7 7 7 6 72 6 c 2 72 72 72 72 72 72 6 7 7 4 c 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 774 78 81 d2 1d 99 c7 61 9d 3 0 1 49 0 4 73 69 7a 65 78 70 0 0 0 0 0 77 4 0 0 0 78

读取:{List=[],String=test}

您将看到,我们发现字节流的开头是
ac ed 00 05 73
,这是以下Java对象序列化规范常量:

  • STREAM\u MAGIC
  • STREAM\u版本
  • TC\u对象
因此,您的调查应该关注原始数据与最初生成的数据不匹配的原因


让我们继续这个方向(免责声明:我从未使用过Redis)

您可以使用以下代码从Redis获取数据:

String key = "redismap";
String result = connection.get(key);
byte[] primalData = result.getBytes();
在这里,您以Java
字符串的形式获取数据,然后使用Java VM的默认编码方案获取字节。这可能与Redis使用的编码表示不同

为什么不使用返回字节[]
的版本?这将是:

String key = "redismap";
byte[] primalData = connection.get(key.getBytes());

这在任何
字符串
字节[]的编码和解码中都可能是一致的。

如果在
bos.toByteArray
之前调用
oos.close
会发生什么?
ObjectOutputStream
被缓冲!在检索数据之前,您需要调用
flush()
(或
close()
)。@immibis是相同的结果。它仍然显示StreamCorruptedException。@Boristeider我认为这无关紧要,因为写作没有问题。这些代码是分开工作的,但我发布输入代码也是因为它可能有编码问题。是否有类似于
connection.get(key)
的东西返回字节数组?字符串不是字节数组-我刚刚注意到您正在将数据转换为字符串并返回。非常感谢。实际上,我担心的是字符编码的密钥集。然而,在我按照您的建议将参数从字符串更改为byte[]之后,它工作得非常好。再次感谢:D@greg当我们在Redis数据存储中使用ISO-8859-1编码时,也发生了类似的事情。最后将所有内容转换为byte[],现在一切正常。谢谢你的回答给了我一些调试的建议。
String key = "redismap";
byte[] primalData = connection.get(key.getBytes());