如何使用Java从Web服务保存大文件?

时间:2012-06-06 13:10:33

标签: java xml web-services inputstream

我必须调用一个以xml形式返回大量数据的rest Web服务。数据大小约为490米。每当我尝试调用该服务时,我的内存都用完了。我想要做的就是将这些数据写入文件。

有没有办法以小块读取和写入数据,以避免内存不足?

这是我尝试过的;

public class GetWs {

   private static String url ="http://somewebservice";
   public static void main(String[] args) {

    InputStream in;
    OutputStream out;
    try {
          out = new FileOutputStream("testoutfile.txt");
          in = new URL(url).openStream();
          int b;
          do {
               b = in.read();
               if (b != -1) {
            out.write(b);
                 out.flush();
               }
           } while (b != -1);
            in.close();out.close();     
    } catch (Exception e) {
        e.printStackTrace();
     }

   }

}

3 个答案:

答案 0 :(得分:2)

尝试压缩和流式传输到文件输出流,最好使用NIO。

如果必须解析并验证XML,请尝试使用STAX解析器。

答案 1 :(得分:2)

如果您真的只想将该URL的内容下载到文件中,请尝试使用Google Guava,这是非常棒的辅助方法:

URL url = ...
File file = ...
ByteStreams.copy(
    Resources.newInputStreamSupplier(url),
    Files.newOutputStreamSupplier(file));

这样可以避免编写另一个带有正确异常处理的复制循环。甚至不需要关闭任何流,ByteStreams.copy()为您完成。

如果要将数据存储为UTF-16,请使用以下内容:

Charset charsetFromServer = ...; // See notes below.

CharStreams.copy(
    Resources.newReaderSupplier(url, charsetFromServer),
    Files.newWriterSupplier(file, Charsets.UTF_16));

有几种方法可以设置charsetFromServer

  • 如果您可以信任服务器始终使用相同的字符集,请使用Charset.forName(String)或Guava的Charsets类中的一个常量手动设置它。确实,非常确定服务器永远不会使用任何其他编码,否则会破坏。

  • 更精细的方法是通过查看Content-Type标头来确定服务器在运行时使用的字符编码。我建议你看看how Apache's HttpClient是否这样做,或者只是使用HttpClient开始,使其像ContentType.getOrDefault(response.getEntity()).getCharset()一样简单。

答案 2 :(得分:1)

如果你真的只是使用输入流,只需使用

byte[] buff = new byte[5000];
int num = 1;
while(num>1){
   num = inputStream.read(buff);
   outputStream.write(buff,0,num);
}

虽然你需要添加一些代码来检测你何时到达文件的末尾~~~(依赖于输入流的实现)~~~编辑不,你不会,修改代码一些