我有一个文本文件的URL,我希望我的Java程序读取该文本文件。 但情节变浓了!该文件不断添加新行,我想在它们进入时阅读这些行。
我认为正确的方法是打开URLConnection到文件的URL,并以某种方式将URLConnection置于某种StreamReader或StreamBuffer类型的对象的“监督”之下。
这是我的Java技能变得有问题的地方,我想知道是否有人愿意捐出一两个答案。
感谢。
答案 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范围标头告诉服务器从给定位置开始提供文件。此功能主要用于恢复下载,但应在此处适用。
我意识到这不会给你一个输入流,但我认为它是一个更强大的解决方案。