我有一个正在运行的项目的源代码 - 不幸的是它已经部署给客户。 以下 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。 我们无法拜访世界各地的每一位客户......
谢谢大家对我的帮助!
答案是:
available() 方法并不是为了做你想做的事。没有办法设置 php 软件来使该方法执行您想要的操作。如果你想将InputStream的内容保存到本地文件,只需使用Files.copy,如果你想将其读入字节数组,请使用is.readAllBytes() – 霍尔格
WebClient.doRawRequest()会将请求发送到服务器并立即返回InputStream。由于只有服务器处理完请求并传送数据后,InputStream 才会有可用数据,因此对 is.available() 的调用将返回 0(因为此时读取数据将被阻止)。在 PHP 方面您无法做任何事情来改变这一点。 – 托马斯·克拉格
我现在想结束这个话题。