当前位置: 首页 > 知识库问答 >
问题:

输入流读取器

苗学民
2023-03-14

我目前正试图从服务器读取图像文件,但得到的数据不完整或

Exception in thread "main" 
         java.lang.NegativeArraySizeException. 

这与缓冲区大小有关吗?我已经尝试使用静态大小而不是ContentLength。敬请指教。

  URL myURL = new URL(url);
  HttpURLConnection connection = (HttpURLConnection)myURL.openConnection();
  connection.setRequestMethod("GET");
  status = connection.getResponseCode();

  if (status == 200)
  {
    int size = connection.getContentLength() + 1024;
    byte[] bytes = new byte[size];
    InputStream input = new ByteArrayInputStream(bytes);
    FileOutputStream out = new FileOutputStream(file);
    input = connection.getInputStream();

    int data = input.read(bytes);
    while(data != -1){
       out.write(bytes);
       data = input.read(bytes);
    }
    out.close();
    input.close();

共有1个答案

滑弘扬
2023-03-14

让我们检查一下代码:

int size = connection.getContentLength() + 1024;
byte[] bytes = new byte[size];

为什么要在大小上加上1024字节?有什么意义?缓冲区大小应该足够大,以避免太多的读取,但也应该足够小,以避免消耗太多的内存。例如,将其设置为4096。

InputStream input = new ByteArrayInputStream(bytes);
FileOutputStream out = new FileOutputStream(file);
input = connection.getInputStream();

为什么创建ByteArrayInputStream,然后完全忘记它?您不需要ByteArrayInputStream,因为您不是从字节数组读取,而是从连接的输入流读取。

int data = input.read(bytes);
while (data != -1) {
    out.write(bytes);
    data = input.read(bytes);
}
out.write(bytes, 0, data);
out.close();
input.close();
 类似资料:
  • 问题内容: 我正在使用从运行约一分钟的进程中读取stdout。 我该如何stdout以流方式打印出该流程的每一行,以便可以看到生成的输出,但仍然阻止该流程终止,然后再继续? 似乎一次给出所有输出。 问题答案: 这是一个简单的示例(不检查错误): 如果ls结束太快,则while循环可能会在你读取所有数据之前结束。 你可以通过以下方式在中捕获其余部分:

  • 我从教程中创建了示例Kafka Streams应用程序: 不幸的是,这个应用程序不读取输入流。我有一个来自PostgreSQL的JDBC源连接器,它正在处理来自一个数据库的精细流数据(我可以在本主题中的Kafka Connect UI数据上看到)。 我的问题是,即使我在BOOTSTRAP\u SERVERS\u CONFIG的Properties IP is localhost中更改了IP,我也不

  • 我有以下代码: 我只想模拟这些行,并在,因为我将有多个测试用例,具体取决于行(文件为空,行为空,我只得到一行,我得到几行,等等)。 注意:我使用库访问FTP服务器上的文件,因此方法将作为返回类型,而具有。 我正在使用junit 4.12和mockito 3.1.0 提前感谢!

  • 我尝试使用getch()和kbsit()读取用户的输入,但它似乎无法识别按键被按下。 此代码打印“开始”,按下键时不打印任何内容。使用getch()读取和打印哪怕一个字符,而不使用循环,我都不走运。

  • 问题内容: 我想制作一个Servlet过滤器,该过滤器将在处理和完成响应后读取响应的内容,并以XML或PDF或其他方式返回该信息。但是我不确定如何从HttpServletResponse对象中获取任何信息。我如何获得此信息? 问题答案: 将此添加到过滤器java文件。 使用以下代码: 现在,content变量具有输出流。您也可以对二进制内容执行此操作。