我不熟悉使用流和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)
答案 0 :(得分:1)
您正在发送原始字节,并且您正在阅读对象。那不行。如果您读取了一个对象,那么发件人必须编写一个对象(writeObject()
)。如果发送方写入字节,则必须读取字节(使用read()
)。
请注意,您的文件阅读部分也是错误的。 read()
不保证它会读取您要求它读取的字节数。你必须使用循环来读取所有内容。或者你可以简单地使用Files.readAllBytes()
,它将正确地为你读取文件中的所有字节。