InputStream.available()奇怪的行为

问题描述 投票:0回答:1

我有一个正在运行的项目的源代码 - 不幸的是它已经部署给客户。 以下 Java 代码正在运行更新过程:

public void downloadChanges() throws IOException {
  try (InputStream is = WebClient.doRawRequest(HttpMethod.GET, machinePath + "/update/", null)) { //IOexception is thrown outside
            if (is.available() == 0) {
                logInfo("Nothing downloaded");
            }
            
                   //continue with downloaded stuff
        }
    }

我现在需要为此编写一个新的后端。 我不知道为什么 is.available() 总是返回 0。 我发现 InputStream.available() 不起作用 但由于 java 代码在这里没有选项,所以我打开了一个新线程。

我尝试在Java代码中添加一些调试代码进行测试,所以它看起来像这样:

           if (is.available() == 0) {
                byte[] data = is.readNBytes(2048 * 1024);
                String content = new String(data, StandardCharsets.UTF_8);
                System.out.println(content);
            System.out.println("Nothing downloaded.");
            return;
       }

在这种情况下,我通过我的 php 软件得到了完整且正确的答案。

有人知道如何正确设置我的 php 来使用 is.available 吗? 我无法更改 java 代码,并且需要让我的服务器运行,无论这将多么hacky。 我们无法拜访世界各地的每一位客户......

java php inputstream
1个回答
0
投票

谢谢大家对我的帮助!

答案是:

available() 方法并不是为了做你想做的事。没有办法设置 php 软件来使该方法执行您想要的操作。如果你想将InputStream的内容保存到本地文件,只需使用Files.copy,如果你想将其读入字节数组,请使用is.readAllBytes() – 霍尔格

WebClient.doRawRequest()会将请求发送到服务器并立即返回InputStream。由于只有服务器处理完请求并传送数据后,InputStream 才会有可用数据,因此对 is.available() 的调用将返回 0(因为此时读取数据将被阻止)。在 PHP 方面您无法做任何事情来改变这一点。 – 托马斯·克拉格

我现在想结束这个话题。

© www.soinside.com 2019 - 2024. All rights reserved.