Java 使用Servlet将数据写入文件时出现的问题

Java 使用Servlet将数据写入文件时出现的问题,java,servlets,io,Java,Servlets,Io,我正在尝试读取一个XML文件并使用HttpPost发送到本地服务器。在服务器端读取数据并写入文件时,总是缺少最后几行 客户端代码: HttpClient-HttpClient=newdefaulthttpclient(); HttpPost HttpPost=新的HttpPost(“http://xxx.xxx.xxx.xxx:yyyy/FirstServlet/HelloWorldServlet"); InputStreamEntity reqEntity=新的InputStrea

我正在尝试读取一个XML文件并使用HttpPost发送到本地服务器。在服务器端读取数据并写入文件时,总是缺少最后几行

客户端代码:

HttpClient-HttpClient=newdefaulthttpclient();
HttpPost HttpPost=新的HttpPost(“http://xxx.xxx.xxx.xxx:yyyy/FirstServlet/HelloWorldServlet");      
InputStreamEntity reqEntity=新的InputStreamEntity(
新文件输入流(数据文件),-1);
requentity.setContentType(“二进制/八位字节流”);
//如果需要,发送多个部件
reqEntity.setChunked(真);
httppost.setEntity(reqEntity);
HttpResponse response=httpclient.execute(httppost);
int respcode=response.getStatusLine().getStatusCode();
服务器代码:

response.setContentType(“二进制/八位字节流”);
InputStream=request.getInputStream();
BufferedOutputStream bos=新的BufferedOutputStream(新文件(“C:\\Files\\copyFile.xml”);
字节[]buf=新字节[4096];
for(int-nChunk=is.read(buf);nChunk!=-1;nChunk=is.read(buf))
{
bos.write(buf,0,nChunk);
} 
我也尝试过使用BufferedReader,但同样的问题

BufferedReader in=新的BufferedReader(
新的InputStreamReader(request.getInputStream());
setContentType(“二进制/八位字节流”);
字符串行=null;
BufferedOutputStream bos=新的BufferedOutputStream(新文件(“C:\\Files\\copyFile.xml”);
而((line=in.readLine())!=null){
line=in.readLine();
写入((行+“\n”).getBytes());
}  
我也试着用扫描仪。在这种情况下,只有当我使用StringBuilder并将值再次传递给BufferedOutputStream时,它才能正常工作

response.setContentType(“二进制/八位字节流”);
StringBuilder StringBuilder=新StringBuilder(2000);
Scanner Scanner=新扫描仪(request.getInputStream());
BufferedOutputStream bos=新的BufferedOutputStream(新文件(“C:\\Files\\copyFile.xml”);
while(scanner.hasNextLine()){
stringBuilder.append(scanner.nextLine()+“\n”);
}
字符串tempStr=stringBuilder.toString();
write(tempStr.getBytes());
我不能使用上面的逻辑来处理非常大的XML,因为转换为字符串值将抛出Java堆空间错误

请告诉我代码有什么问题

提前谢谢

和您的输出流。发生的情况是,您没有刷新,最后几行保留在某个内部缓冲区中,并且没有被写出来

因此,在服务器代码中:

response.setContentType("binary/octet-stream");
InputStream is = request.getInputStream();
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File("C:\\Files\\copyFile.xml")));
byte[] buf = new byte[4096];
for (int nChunk = is.read(buf); nChunk!=-1; nChunk = is.read(buf)) {
   bos.write(buf, 0, nChunk);
}
bos.flush();
bos.close();