在Java中通过HTTP将远程文件转换为输入流

时间:2010-03-04 01:49:37

标签: java http file stream

我有一个文本文件的URL,我希望我的Java程序读取该文本文件。 但情节变浓了!该文件不断添加新行,我想在它们进入时阅读这些行。

我认为正确的方法是打开URLConnection到文件的URL,并以某种方式将URLConnection置于某种StreamReader或StreamBuffer类型的对象的“监督”之下。

这是我的Java技能变得有问题的地方,我想知道是否有人愿意捐出一两个答案。

感谢。

4 个答案:

答案 0 :(得分:2)

根据上面的评论,我想我已经解决了这个问题。 我不太确定这并不意味着我每次都下载整个文件:

                long charsRead = 0;

                while(keepRunning)
                {
                    URL url = new URL(finalUrlString);
                    URLConnection connection = url.openConnection();
                    InputStreamReader stream = new InputStreamReader(connection.getInputStream());
                    BufferedReader reader = new BufferedReader(stream);
                    long skipped = reader.skip(charsRead);
                    String line = reader.readLine();
                    if(line != null)
                    {
                        charsRead += line.length() + 1;
                        process(line);
                    }
                    reader.close();
                }

这段代码在自己的线程中运行。我正在使用process方法来填充通过解析每一行生成的对象向量。

在不同的线程上,另一段代码会查看此向量 - 读取对象 - 并将其清空。

当然这个线程和另一个线程围绕该矢量实例同步。

答案 1 :(得分:1)

要使此实现成为一个InputStream,您需要在循环中生成多个http请求并跟踪到目前为止已读取的内容,以便流的使用者获得 一致的输出。

伪代码:

int read_bytes = 0;
while (should_be_reading) {
  # make http request

  # read or scan to read_bytes
  # emit any new bytes
  # update read_bytes

}

答案 2 :(得分:0)

InputStream获取URLConnection并将其包装在InputStreamReader中,然后将其包装在BufferedReader中:

InputStream is = urlConnection.getInputStream();
InputStreamReader isr = new InputStreamReader(is, <encoding>);
BufferedReader br = new BufferedReader(isr);

现在可以使用br.readLine()从资源中读取每行文本,直到它返回null(EOF)。您必须从某个地方获取字符编码,或者从HTTP响应内容类型标题中获取,或者如果已知,您可以直接指定它。

答案 3 :(得分:0)

如果跟踪读取的总字节数,可以使用http范围标头告诉服务器从给定位置开始提供文件。此功能主要用于恢复下载,但应在此处适用。

我意识到这不会给你一个输入流,但我认为它是一个更强大的解决方案。