尝试将ObjectInputStream的输出保存到文件时发生IOException

时间:2015-10-19 18:23:31

标签: java file stream ioexception

我不熟悉使用流和Java中的文件的概念。

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

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

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

#include <iostream>
using namespace std;
class DayOfYear
{
public:
void set(int monthValue, int dayValue) {
    month = monthValue;
    day = dayValue;
}

friend bool compare(DayOfYear&d1,DayOfYear&d2) {

    return (d1.getDay() == d2.getDay()) && (d1.getMonth() == d2.getMonth());
}

int getMonth( ) { return month; }

int getDay( ) { return day; }

private:
int month;
int day;
};

int main(){

DayOfYear obj[3];
obj[0].set(1,1);
obj[1].set(1,1);
obj[2].set(1,1);


if(compare(obj[0],obj[1])){
    cout<<"Match"<<endl;
}


return 0;
}

当程序遇到``byte [] fileArray =(byte [])in.readObject(); 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); int byteCount`显示正确的字节数时,会出现IOException文件名也正确...

Stacktrace看起来像这样:

line. And - to be sure, the

发送文件的客户端代码:

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)

1 个答案:

答案 0 :(得分:1)

您正在发送原始字节,并且您正在阅读对象。那不行。如果您读取了一个对象,那么发件人必须编写一个对象(writeObject())。如果发送方写入字节,则必须读取字节(使用read())。

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