Java 通过套接字从服务器向android客户端发送非常大的字符串

Java 通过套接字从服务器向android客户端发送非常大的字符串,java,android,sockets,Java,Android,Sockets,我在通过套接字将大字符串从服务器发送到android客户端时遇到问题 字符串大约为10MB 将数据写入套接字的代码如下: 从套接字读取数据的代码如下: 所以问题出现在我从inputStream读取的第行,在这里我得到了内存异常。我试着用不同的例子从流中读取字符串。我尝试了BufferedInputStream,InputStreamReader,IOUtils,StringBuilder,BufferedReader等。当字符串很大时,它们都给了我OutOfMemory异常。我使用大约100

我在通过套接字将大字符串从服务器发送到android客户端时遇到问题

字符串大约为10MB

将数据写入套接字的代码如下:
从套接字读取数据的代码如下:
所以问题出现在我从
inputStream
读取的第行,在这里我得到了内存异常。我试着用不同的例子从流中读取字符串。我尝试了
BufferedInputStream
InputStreamReader
IOUtils
StringBuilder
BufferedReader
等。当字符串很大时,它们都给了我OutOfMemory异常。我使用大约100K的较小数据进行了测试,结果非常理想


我在服务器端得到的例外是“连接被对等方重置,套接字写入错误。”

您可以在客户端逐字节读取数据,然后逐字节写入文件,这样您就不会在内存中保存整个字符串


当然,然后通过标记或行来读取该文件,而不是一次读取整个字符串。通过将其存储在
ByteArrayOutputStream
(或类似文件)中,您将遇到Android中JVM的最大堆大小。这是一个不同的大小取决于设备。见:


已经提出,您应该考虑使用文件流来将接收到的数据写入磁盘。

问题是没有足够的内存来存储所有内容。code>ByteArrayOutputStream在对RAM执行任何操作之前保存RAM中的所有内容。使用FileOutputStream将其直接写入一个小文件块(128kB,或诸如此类),用于example@user251141432kB大?在Arduino上,是的,但在任何有意义的Android手机上,我不这么认为……是的,当然对我来说它看起来很大。也许这是因为堆会越来越大!也许你需要将数据直接写入某个文件中!
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());
}