当尝试将输出从ObjectInputStream保存到文件时,IOException



我对Java中处理流和文件的概念很陌生。

我正在写一段代码,我有一个非常简单的服务器,它正在监听传入的文件。

然后我有一个处理传入文件的处理程序。

现在,这里是代码(剥离try/catch块)

ObjectInputStream in;
in = new ObjectInputStream(new BufferedInputStream(
        clientSocket.getInputStream()));
File f = new File(fileName);
int byteCount = in.readInt();
byte[] fileArray = (byte[]) in.readObject();
Files.write(f.toPath(), fileArray);

有一个IOException当程序到达' ' byte[] fileArray = (byte[]) in.readObject();line. And - to be sure, the int byteCount '显示正确的字节数,文件名也正确…

Stacktrace是这样的:

java.io.OptionalDataException
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1304)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)
    at com.fileservice.util.ClientHandlerRunnable.run(ClientHandlerRunnable.java:85)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:744)

发送文件的客户端代码:

    Socket socket = new Socket(data.getIp(), data.getTcpPort());
    FileInputStream fis = null;
    BufferedInputStream bis = null;
    // OutputStream os = null;
    // send file
    File myFile = new File(data.getFileName());
    String test = myFile.getAbsolutePath();
    byte[] mybytearray = new byte[(int) myFile.length()];
    fis = new FileInputStream(myFile);
    bis = new BufferedInputStream(fis);
    bis.read(mybytearray, 0, mybytearray.length);
    ObjectOutputStream os = new ObjectOutputStream(
            new BufferedOutputStream(socket.getOutputStream()));
    os.flush();
    System.out.println("Sending " + data.getFileName() + "("
            + mybytearray.length + " bytes)");
    if (os != null) {
        os.writeInt(mybytearray.length);
        os.write(mybytearray, 0, mybytearray.length);
        os.flush();
        System.out.println("Done.");
    }
    if (bis != null) {
        bis.close();
    }
    if (os != null) {
        os.close();
    }
    if (socket != null) {
        socket.close();
    }

您正在发送原始字节,并且正在读取对象。这行不通。如果你读一个对象,那么发送者必须写一个对象(用writeObject())。如果发送方写入字节,那么您必须读取字节(使用read())。

注意你的文件读取部分也是错误的。read()不保证它将读取您要求它读取的字节数。你必须使用循环来读取所有内容。或者您可以简单地使用Files.readAllBytes(),它将为您正确地从文件中读取所有字节。

相关内容

  • 没有找到相关文章

最新更新