2013-12-22 103 views
0

解压缩和反序列化字节数组时遇到了EOFException。
堆栈跟踪:按字节数组反序列化时EOFExcpetion

java.io.EOFException的 在java.io.ObjectInputStream中的$ PeekInputStream.readFully(ObjectInputStream.java:2324) 在java.io.ObjectInputStream中的$ BlockDataInputStream.readShort(ObjectInputStream.java:2793 ) at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:799) at java.io.ObjectInputStream。(ObjectInputStream.java:299) at com.chuck.pack.ResourcePacket.load(ResourcePacket.java:44)

// Functions related to load 

public static ResourcePacket load(String packetName) { 
    try { 
     byte[] bytes = uncompress(fileToByteArray(new File(packetName))); 
     ByteArrayInputStream in = new ByteArrayInputStream(bytes); 
     ObjectInputStream objIn = new ObjectInputStream(in); // Error occured here 
     return (ResourcePacket) objIn.readObject(); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 

    return null; 
} 

private static byte[] uncompress(byte[] bytes) { 
    try { 
     ByteArrayOutputStream out = new ByteArrayOutputStream(); 
     Inflater ifl = new Inflater(); 
     ifl.setInput(bytes); 

     byte[] buffer = new byte[4*1024]; 
     while(ifl.finished()) { 
      int size = ifl.inflate(buffer); 
      out.write(buffer, 0, size); 
     } 
     out.close(); 
     return out.toByteArray(); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
     System.out.println("Error while load"); 
    } 
    return null; 
} 

private static byte[] fileToByteArray(File file) { 
    byte[] bytes = new byte[(int) file.length()]; 
    try { 
     FileInputStream fileInputStream = new FileInputStream(file); 
     fileInputStream.read(bytes); 
     fileInputStream.close(); 
    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } 

    return bytes; 
} 

// Functions related to save 

public void save() { 
    try { 
     byte[] bytes = compress(toByteArray()); 
     //byte[] bytes = toByteArray(); 
     FileOutputStream fileOutputStream = new FileOutputStream(packetName); 
     fileOutputStream.write(bytes); 
     fileOutputStream.close(); 
     System.out.println("Packet saved (" + resourceFiles.length + " Files)"); 
    } catch (IOException ex) { 
     ex.printStackTrace(); 
     System.exit(-1); 
    } 
} 

private byte[] compress(byte[] bytes) { 
    try { 
     ByteArrayOutputStream out = new ByteArrayOutputStream(); 
     Deflater dfl = new Deflater(); 
     dfl.setLevel(Deflater.BEST_SPEED); 
     dfl.setInput(bytes); 
     dfl.finish(); 
     byte[] tmp = new byte[4*1024]; 
     while(!dfl.finished()) { 
      int size = dfl.deflate(tmp); 
      out.write(tmp, 0, size); 
     } 
     out.close(); 
     return out.toByteArray(); 
    } catch (IOException ex) { 
     ex.printStackTrace(); 
     System.out.println("Error while save"); 
    } 
    System.exit(-1); 
    return null; 
} 

private byte[] toByteArray() { 
    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    ObjectOutputStream out = null; 
    try { 
     out = new ObjectOutputStream(bos); 
     out.writeObject(this); 
     byte[] bytes = bos.toByteArray(); 
     return bytes; 
    } catch(IOException ex) { 
     ex.printStackTrace(); 
     System.out.println("Error while create byte array"); 
    } 
    System.exit(-1); 
    return null; 
} 

有人想解决这个问题吗?

+0

当程序得知您是Chuck Norris时,它会自行修复。圣诞快乐:) – Melquiades

+0

这将是不错的;)另外,圣诞快乐 – ChuckNorris

+0

我们需要看到对象是如何序列化的,也是如何压缩的。这可能是序列化的问题,也可能是由于错误导致压缩的数据与解压缩后的结果不匹配的问题。 –

回答

0

uncompress(..)方法while循环:

while(ifl.finished()) { 
    int size = ifl.inflate(buffer); 
    out.write(buffer, 0, size); 
} 

应该是

while(!ifl.finished()) { 
    int size = ifl.inflate(buffer); 
    out.write(buffer, 0, size); 
} 

否则的uncompress(..)的结果是一个空字节数组,如果该方法终止。

+0

是的,经过长时间的搜索后,我发现自己。 – ChuckNorris