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