Java 将文件读入字节数组并将其传输到新文件中
我的项目是编写一个服务器和客户端类。服务器等待接收文件的路径,该路径将从CSV转换为XML,然后将文件内容读回客户端,客户端将把内容保存到新文件中。 到目前为止,我已经完成了90%的工作,唯一的问题是最终文件是空的,但是在服务器端创建了XML文件 这是服务器连接处理方法Java 将文件读入字节数组并将其传输到新文件中,java,serversocket,Java,Serversocket,我的项目是编写一个服务器和客户端类。服务器等待接收文件的路径,该路径将从CSV转换为XML,然后将文件内容读回客户端,客户端将把内容保存到新文件中。 到目前为止,我已经完成了90%的工作,唯一的问题是最终文件是空的,但是在服务器端创建了XML文件 这是服务器连接处理方法 public void handleConnection(InputStream sockInput, OutputStream sockOutput){ CsvToXml csv = new CsvToXml();
public void handleConnection(InputStream sockInput, OutputStream sockOutput){
CsvToXml csv = new CsvToXml();
String csvAddress;
while(true)
{
byte[] buffer = new byte[4094];
int bytes_read = 0;
byte[] bytes_out = new byte[4094];
try {
bytes_read = sockInput.read(buffer, 0, buffer.length);
csvAddress = new String(buffer, 0, bytes_read);
System.err.println(csvAddress);
csv.convertFile(csvAddress , "C:/Users/Arian/Desktop/xmlFile.xml", ",");
if(bytes_read < 0){
System.err.println("Tried to read from socket, but returned < 0. Closing socket.");
return;
}
System.out.println("Server Received "+ bytes_read + "bytes, data=" + (new String(buffer, 0, bytes_read)));
bytes_out = readXml();
bytes_read = sockInput.read(bytes_out, 0, bytes_out.length);
sockOutput.write(bytes_out);
sockOutput.flush();
} catch(Exception e){
System.err.println("Exception reading/writing from/to socket, e=" +e);
e.printStackTrace(System.err);
return;
}
}
}
这是客户端的inputStream和outputStream方法
公共无效开始转换(整数迭代)
{
System.err.println(“打开到“+serverHostname+”端口“+serverPort”的连接);
试一试{
sock=新套接字(服务器主机名、服务器端口);
sockInput=sock.getInputStream();
sockOutput=sock.getOutputStream();
}捕获(IOE异常){
e、 printStackTrace(System.err);
返回;
}
System.err.println(“即将开始读取/写入套接字”);
对于(inti=1;i您正在用它做一顿真正的饭。Java中在流之间复制的标准方法如下:
int count;
byte[] buffer = new byte[8192]; // or whatever you like, any size greater than zero
while ((count = in.read(buffer)) > 0)
{
out.write(buffer, 0, count);
}
请注意,您必须循环;您不需要输入大小的缓冲区;并且在编写时必须使用读取计数,如read()
没有义务填充缓冲区,而且几乎肯定至少在EOS之前的最后一次读取时不会。通过适当调整输入和输出,可以在两端使用相同的代码。如果在执行代码时调试/逐步执行代码,那么会出现什么错误?如果是o只有在最后写入文件时,这才是一个小问题。当我调试客户端时,它什么都不做。如果我在处理输入和输出流的for循环之前放置一个断点,那么它会立即跳转到循环,并在断点处停止…它应该在断点处停止,即w为什么它被称为断点。在那之后,你自己需要让你的程序继续运行。例如,在Eclipse中,这通常是通过不同操作的按钮F5-F8来完成的。是的,我继续,它在我刚才添加的while循环中停止。如果你看到它,我在我的更新中准确地写下了位置。所以我更改了你提到的位ed,事实上我以前也有这样的设置,这就是为什么我有随机的“int len”。我有它,而不是计算几乎相同的代码段,它仍然不起作用。我写了一个关于调试中出错的地方的更新。
System.err.println("Opening connection to "+serverHostname+" port "+serverPort);
try {
sock = new Socket(serverHostname, serverPort);
sockInput = sock.getInputStream();
sockOutput = sock.getOutputStream();
} catch (IOException e) {
e.printStackTrace(System.err);
return;
}
System.err.println("About to start reading/rwriting to/from socket");
for(int i = 1; i <= iterations; i++){
try{
sockOutput.write(data, 0, data.length);
File file = new File("C:/Users/Arian/Desktop/NewFile.xml");
byte[] buffer = new byte[sockInput.available()];
sockOutput = new FileOutputStream(file);
int len;
sockInput.read(buffer);
sockOutput.write(buffer);
sockOutput.flush();
} catch(IOException e){
e.printStackTrace(System.err);
}
System.err.println("Done reading/writing to/from socket, closing socket.");
try {
sock.close();
} catch (IOException e){
System.err.println("Exception closing socket.");
e.printStackTrace(System.err);
}
System.err.println("Exiting.");
}
}
for(int i = 1; i <= iterations; i++){
try{
sockOutput.write(data, 0, data.length);
File file = new File("C:/Users/Arian/Desktop/NewFile.xml");
byte[] buffer = new byte[8192];
sockOutput = new FileOutputStream(file);
int count;
while((count = sockInput.read(buffer)) > 0){ //The client stops debugging here.
sockOutput.write(buffer, 0, count);
}
sockOutput.flush();
} catch(IOException e){
e.printStackTrace(System.err);
}
int count;
byte[] buffer = new byte[8192]; // or whatever you like, any size greater than zero
while ((count = in.read(buffer)) > 0)
{
out.write(buffer, 0, count);
}