我必须调用一个以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();
}
}
}
答案 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);
}
虽然你需要添加一些代码来检测你何时到达文件的末尾~~~(依赖于输入流的实现)~~~编辑不,你不会,修改代码一些