java - 尝试将 ObjectInputStream 的输出保存到文件时出现 IOException

标签 java file stream ioexception

我对在 Java 中使用流和文件的概念很陌生。

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

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

现在,这是代码(删除了 try/catch block )

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);

当程序遇到 ``byte[] fileArray = (byte[]) in.readObject(); 行时,会出现 IOException 。并且 - 可以肯定的是,int byteCount` 显示了正确的字节数,文件名也是正确的......

堆栈跟踪看起来像这样:

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() ,它将为您正确读取文件中的所有字节。

关于java - 尝试将 ObjectInputStream 的输出保存到文件时出现 IOException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33221297/

相关文章:

C:对无法放入数组的长列表进行排序

android - 使用 SIP 服务器传输文件

asynchronous - 从标准输出中删除流以便添加另一个流的正确方法是什么?

python - 使用 python 在内存中(即时)创建包含大量小文件的大 zip 存档

java - 如何使用 apache poi 将 .docx 转换为 .doc

java - 从键盘读取数据并存储在字符串数组中

linux - 如何在亚马逊 Linux 上安装 openjdk "1.8.0_20-b26"?

java - java中的新文件路径,没有新的对象实例

java - 使用 Java 8 Stream API 计算连续相同对象的数量

java - ArrayList<Integer> 自动将其类型更改为 ArrayList <String>