ObjectInputStream和Apache-Commons-Net FTPClient

时间:2014-11-20 01:29:38

标签: java ftp inputstream objectoutputstream apache-commons-net

我正在尝试从Apache Commons库中使用FTPClient类访问的FTP服务器读取文件,但获取文件retrieveFile(remoteFileName, OutputStream)的方法需要OutputStream。我试图在没有先将文件写入磁盘的情况下获取对象。有什么办法可以让ObjectInputStream从OutputStream中读取?或者其他一些我没有想到的方式?

编辑: 我尝试了两种方法:

public class FTPObjectReader
{
    public static Object read()
    {
        try
        {
            FTPClient ftp = new FTPClient(); 
            // Connect and stuff

            // Way one
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ftp.retrieveFile("Data.dat", baos);
            baos.close();
            ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
            ObjectInputStream = new ObjectInputStream(bais);
            Object o = ois.readObject();

            // Way two
            ObjectInputStream ois = new ObjectInputStream(ftp.retrieveFileStream("Data.dat"));
            Object o = ois.readObject();
        }
    }
}

堆栈追踪:

java.io.StreamCorruptedException: invalid type code: 0A
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readArray(Unknown Source)
    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.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.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.microgodrad.dev.Net.FTPObjectReader(FTPObjectReader.java:14)
    at com.microgodrad.dev.Net.main(Net.java:162) // File that calls this function

1 个答案:

答案 0 :(得分:0)

使用ByteArrayOutputStream,然后当它关闭时将其字节数组包装在ByteArrayInputStream中并将其包装在ObjectInputStream.