好的,所以我正在开发一个项目,在该项目中我使用 Java 程序来启动两个类(aFileSender
和FileReceiver
)之间的套接字连接。我的基本想法是FileSender
看起来像这样:
try {
writer = new DataOutputStream(connect.getOutputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//While we have bytes to send
while(filein.available() >0){
//We write them out to our buffer
writer.write(filein.read(outBuffer));
writer.flush();
}
//Then close our filein
filein.close();
//And then our socket;
connect.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
构造函数包含检查文件是否存在以及套接字是否已连接等的代码。我的 FileReader 里面是这样的:
input = recvSocket.accept();
BufferedReader br = new BufferedReader(new InputStreamReader(input.getInputStream()));
FileOutputStream fOut= new FileOutputStream(filename);
String line = br.readLine();
while(line != null){
fOut.write(line.getBytes());
fOut.flush();
line = br.readLine();
}
System.out.println("Before RECV close statements");
fOut.close();
input.close();
recvSocket.close();
System.out.println("After RECV clsoe statements");
都在一个 try-catch 块内。所以,我想要做的是FileSender
读取文件,转换为字节,发送并刷新它。 FileReceiver
,然后读取字节,写入 fileOut,刷新,并继续等待更多。我确保关闭所有我打开的东西,所以……奇怪的部分来了。
当我尝试在 Eclipse 中打开创建的文本文件时,它告诉我“发生了 SWT 错误......建议退出工作台......有关更多详细信息,请参阅 .log。”。另一个窗口弹出说“未处理的事件循环异常,(没有更多的句柄)”。但是,如果我尝试在 notepad2 中打开发送的文本文件,我会得到
ThisIsASentTextfile
这很好(嗯,减去应该有换行符的事实,但我正在努力......)。有谁知道为什么会这样?在我们检查时,如何添加换行符?
(这是在不获取其他库的情况下通过 java 传输文件的一种特别糟糕的方式吗?)
编辑:更新:我将代码更改为以下(FileReceiver),而不更改发件人:
try {
input = recvSocket.accept();
//InputStream br = new InputStream(input.getInputStream());
FileWriter fOut= new FileWriter(filename);
//BufferedWriter out = new BufferedWriter(fOut);
//String line = br.
byte info = (byte) input.getInputStream().read();
while((int)info != 0){
fOut.write(info);
fOut.flush();
info = (byte) input.getInputStream().read();
}
fOut.flush();
System.out.println("Before RECV close statements");
fOut.close();
//input.close();
recvSocket.close();
System.out.println("After RECV clsoe statements");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
这行得通。我得到一个以字节为单位大小正确的文本文件(在我获得 4Kb 标准大小之前),并且具有正确的格式。接下来我将在图像上尝试它,并让您保持更新。