我有一个问题,通过套接字从服务器向android客户端发送大字符串。
字符串大约是10MB。
int socketTimeout = 200;
socket = new Socket(client.getHost(), client.getPort());
socket.setSoTimeout(socketTimeout);
OutputStreamWriter oos=new OutputStreamWriter(socket.getOutputStream());
String d = data.getData().toString() + "\n";
oos.write(d);
oos.flush();
Socket s = params[0];
InputStream is = null;
try {
is = s.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int nRead;
byte[] data = new byte[32768];
while ((nRead = is.read(data, 0, data.length)) != -1) {
baos.write(data, 0, nRead);
}
return new String(baos.toByteArray());
}
所以问题出现在我从inputStream
读取的地方,我得到OutOfMemoryException。我尝试使用从流中读取字符串的不同示例。我尝试了BufferedInputStream
,InputStreamReader
,IOUtils
,StringBuilder
,BufferedReader
..等。当字符串很大时,所有这些都会给我OutOfMemory异常。我使用较小的数据进行了大约100K的测试,结果非常好。
我在服务器端遇到的异常是“通过对等方重置连接,套接字写入错误。”
答案 0 :(得分:2)
您可以在客户端中逐字节读取并逐字节写入文件,这样您就不会将整个字符串保存在内存中。
然后当然通过令牌或行读取该文件,而不是一次读取整个字符串
答案 1 :(得分:1)
通过将其存储在ByteArrayOutputStream
(或类似)中,您将遇到Android中JVM的最大堆大小。根据设备的不同,这是不同的大小。请参阅:Android heap size on different phones/devices and OS versions
正如已经建议的那样,您应该考虑使用文件流将接收的数据写入磁盘。