从ftp反序列化对象时StreamCorruptedException

时间:2015-05-28 22:17:44

标签: java serialization ftp deserialization

的同事。 我正在做大学评估,我需要实现FTP服务器通信。序列化似乎正常工作,但反序列化并不适用。 我做的步骤:

  1. 将FTP文件流检索到ByteArrayOutputStream
  2. 关闭流
  3. 将流写入字节数组
  4. 读取包含在ObjectInputStream中的ByteArrayInputStream的字节数组。
  5. 当我尝试阅读对象时,我得到了

    java.io.StreamCorruptedException: invalid type code: 00.
    

    以下是代码:

    try {
            ftpClient = new FTPClient();
            ftpClient.connect("********",21);
            ftpClient.login("******", "******");
            ftpClient.setFileTransferMode(ftpClient.BINARY_FILE_TYPE);
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            boolean ok = ftpClient.retrieveFile("/data/" + fileName,bos);
            System.out.println("" + ok + " " + ftpClient.getReplyCode());
            bos.close();
            byte[] b = bos.toByteArray();
            ois = new ObjectInputStream(new ByteArrayInputStream(b));
            if (fileName.contains("dataW")) {
                Warrior character = (Warrior)ois.readObject();
                System.out.println(ftpClient.getReplyCode());
                MainMenu frame = new MainMenu(character);
                frame.setVisible(true);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                parent.setVisible(false);
            } else {
                Rogue character = (Rogue)ois.readObject();
                MainMenu frame = new MainMenu(character);
                frame.setVisible(true);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                parent.setVisible(false);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    

    堆栈跟踪:

    java.io.StreamCorruptedException: invalid type code: 00
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.defaultReadFields(Unknown Source)
    at java.io.ObjectInputStream.readSerialData(Unknown Source)
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readObject(Unknown Source)
    at com.mif.mobr0858.GUI.LoadThread.run(LoadThread.java:47)
    at com.mif.mobr0858.GUI.FileChooser$2.actionPerformed(FileChooser.java:77)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$400(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.WaitDispatchSupport$2.run(Unknown Source)
    at java.awt.WaitDispatchSupport$4.run(Unknown Source)
    at java.awt.WaitDispatchSupport$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.awt.WaitDispatchSupport.enter(Unknown Source)
    at java.awt.Dialog.show(Unknown Source)
    at java.awt.Component.show(Unknown Source)
    at java.awt.Component.setVisible(Unknown Source)
    at java.awt.Window.setVisible(Unknown Source)
    at java.awt.Dialog.setVisible(Unknown Source)
    at com.mif.mobr0858.GUI.WelcomeFrame$2.actionPerformed(WelcomeFrame.java:45)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$400(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
    

    序列化:

    try {
            //get current date
            Date date = new Date();
            DateFormat dateFormat = new SimpleDateFormat("dd-MM_HH.mm");
            String fileName;
            String fileName1;
            //select appropriate file name
            if (character instanceof Warrior) {
                fileName = "dataW_" + dateFormat.format(date).toString() + ".dat";
                fileName1 = "dataBW_" + dateFormat.format(date).toString() + ".dat";
            } else {
                fileName = "dataR_" + dateFormat.format(date).toString() + ".dat";
                fileName1 = "dataRW_" + dateFormat.format(date).toString() + ".dat";
            }
            //create file and write data
            File f = new File(fileName);
            File f1 = new File(fileName1);
            oos = new ObjectOutputStream(new FileOutputStream(f));
            oos.writeObject(character);
            oos.close();
            oos = new ObjectOutputStream(new FileOutputStream(f1));
            oos.writeObject(frame);
            //connect to FTP
            FTPClient ftpClient = new FTPClient();
            ftpClient.connect("*****", 21);
            boolean connOK = ftpClient.login("*****", "****");
            if (connOK) {
                MainMenu.uploadSingleFile(ftpClient, f.getAbsolutePath(), "data/" + fileName);
            }
            } catch(IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    oos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    

    上传代码:

    public static boolean uploadSingleFile(FTPClient ftpClient, String localFilePath,
            String remoteFilePath) throws IOException {
        File localFile = new File(localFilePath);
    
        InputStream inputStream = new FileInputStream(localFile);
        try {
                ftpClient.setFileTransferMode(ftpClient.BINARY_FILE_TYPE);
                ftpClient.setFileType(ftpClient.BINARY_FILE_TYPE);
                return ftpClient.storeFile(remoteFilePath, inputStream);
        } finally {
            inputStream.close();
        }
    

    如果有人能帮我解决问题,我将不胜感激

1 个答案:

答案 0 :(得分:0)

您尚未关闭第一个ObjectOutputStream.文件不完整。