【问题标题】:Read InputStream from file via URL query string通过 URL 查询字符串从文件中读取 InputStream
【发布时间】:2016-02-08 13:27:48
【问题描述】:

当 URL 是查询字符串而不是文件的直接链接时,是否可以使用 java URL.openStream() 方法将文件读入输入流?例如。我的代码是:

URL myURL = new URL("http://www.test.com/myFile.doc");
InputStream is = myURL.openStream(); 

这适用于直接文件链接。但是如果 URL 是 http://www.test.com?file=myFile.doc 呢?我还能从服务器响应中获取文件流吗?

谢谢!

【问题讨论】:

  • 你为什么不试试呢?
  • 因为我现在无法尝试,我想知道它是如何工作的。我知道,当有直接链接时,我已经有了文件的位置,但是当它是查询字符串时,由服务器返回 as 内容的位置。我很好奇这是如何工作的。

标签: java url networking junit httpconnection


【解决方案1】:

通常是的,它会起作用的。

但请注意,URL.openStream() 方法不遵循重定向,并且在指定一些额外的 HTTP 行为时不太灵活:请求类型、标头等。

我建议改用Apache HTTP Client

final CloseableHttpClient httpclient = HttpClients.createDefault();         
final HttpGet request = new HttpGet("http://any-url");

try (CloseableHttpResponse response = httpclient.execute(request)) {
    final int status = response.getStatusLine().getStatusCode();

    if (status == 200) {
        final InputStream is = response.getEntity().getContent();
    } else {
        throw new IOException("Got " + status + " from server!");
    }
}
finally {
    request.reset();
}

【讨论】:

  • 非常感谢您的有用回复!有了这个特定的资源,我收到了一个 302 从查询返回的位置。 url.openStream() 会自动解析到该位置吗?还是我必须像你那样做?
  • 不幸的是,正如我使用url.openStream() 提到的,您需要处理 3xx 状态并以某种循环方式手动跟踪这些重定向。 HttpClients.createDefault() 默认遵循重定向并做许多有用的事情,看看官方文档,它们非常人性化。
【解决方案2】:

URL 类适用于任何 url,包括:

  • new URL("http://www.example.com/");
  • new URL("file://C/windows/system32/cmd.exe");
  • new URL("ftp://user:password@example.com/filename;type=i");

由应用程序来处理数据,例如下载数据或将其视为纯文本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-30
    • 2022-01-17
    • 2012-09-02
    • 2015-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多