当前位置: 首页 > 面试题库 >

无法写入超出特定大小的DataOutputStream-OutOfMemoryError

涂飞航
2023-03-14
问题内容

我有以下代码会产生OutOfMemory异常:

byte[] buf = new byte[10240];
int len = 0;
DataOutputStream dataOS = new DataOutputStream(conn.getOutputStream());
while ((len = _inputStream.read(buf)) > 0) {
    System.out.println("len : " + len);
    System.out.println("Going to write buf into dataOS : " + buf.length);
    dataOS.write(buf, 0, len);
    System.out.println("dataOS.size() : " + dataOS.size());
}
_inputStream.close();

以下是调试输出的最后几行:

len : 10240
Going to write buf into dataOS : 10240
dataOS.size() : 342804702
len : 10240
Going to write buf into dataOS : 10240
dataOS.size() : 342814942
len : 10240
Going to write buf into dataOS : 10240

当我尝试写入342814942之后的dataOS时,会发生异常。

有人可以帮我解决这个问题吗?

谢谢!


问题答案:

它与DataOutputStream(不保留任何数据)无关,并且与基础流无关conn.getOutputStream()。现在,您尚未在此处显示相关代码,但是我猜“
conn”是HttpURLConnection的一个实例。我相信HttpURLConnection的outputstream缓冲输出,以便它可以确定输出长度(除非您明确设置)。如果您知道输出长度,则可以直接使用进行设置,HttpURLConnection.setFixedLengthStreamingMode也可以调用HttpURLConnection.setChunkedStreamMode允许以块的形式发送数据,而不是将其完全缓冲在内存中。

将来,当您遇到OOME时,应 始终 生成堆转储并在内存分析器中将其打开。几乎总是可以立即向您显示问题所在(例如,在基础流中, 而不是
在DataOutputStream中)。



 类似资料:
  • 我已经研究了大多数问题,但我找不到如何在一个单词中使用大写或小写特定字符。 例子: 如果我想使“b”大写,其余字母小写,那么如何使第一个字母大写,其余字母小写呢? 比如“约翰” 我有和。他们转换整个文本。 我也试着加入charAt,但从未与我合作过。

  • 问题内容: 如标题所示,我想从PDF中过滤出超过特定字体大小的所有文本。当前,我正在使用PDFBox库,但可以使用其他任何Java免费库。 我的方法是使用PDFStreamParser遍历令牌。当我通过大小大于阈值的Tf运算符时,不要添加下一个看到的Tj / TJ。但是,对我来说很清楚,这种相对简单的方法将不起作用,因为文本可能会被当前的转换矩阵缩放。 有没有我可能会采用的更好的方法,或者使我的方

  • 我正在处理大量的二进制文件。在最近对本地git repo进行了一次更改之后,我试图将更改推回到远程,结果收到以下错误。 不幸的是,我不能使用这里描述的策略,因为所有的更改都包含在一次提交中。有什么建议吗?我怎样才能绕过这个包装尺寸限制?

  • 我正在开发一个Android应用程序,我想将输入过滤器设置为只允许EditText中包含21个字符。 我使用的XML代码片段如下 在活动中, 它不允许输入超过21个字符,但我无法告知用户长度不能超过21个字符,因为没有显示过滤器中的消息。 我尝试过使用,但它在第21个字符后没有被调用,因为我使用将限制设置为21。 任何人,请帮我找到解决办法。

  • 问题内容: 我正在编写一个连接到servlet的程序,这要感谢a,但是我在检查url时卡住了 我得到了错误: java.net.ProtocolException:读取输入后无法写入输出。 如果我用注释中的代码检查网址,但不幸的是它可以正常工作,我需要检查网址,所以我认为问题出在方法上,但我不知道如何解决 非常感谢你 问题答案: HTTP协议基于请求-响应模式:首先发送请求,然后服务器响应。服务器

  • 问题内容: 当我运行我的代码时,Node.js引发由过多的递归调用引起的异常。我试图将Node.js堆栈大小增加,但是Node.js崩溃而没有任何错误消息。当我不使用sudo再次运行此命令时,Node.js将输出。是否有可能在不删除递归调用的情况下解决此问题? 问题答案: 您应该将递归函数调用包装到 , 要么 函数使node.js有机会清除堆栈。如果您不这样做,并且有很多循环没有任何 真正的 异步