从url stream问题中读取最后n行

时间:2011-08-22 13:38:04

标签: java

我有问题从url读取最后n行。怎么做 ?我有url.openstream但是没有RandomAccessFile的contrsuctor,它有流的输入。有人能帮助我吗? meybe有没有这个库。 (我知道如何在我有文件的情况下使用RandomAccess实现,但是如何将流更改为文件)。

2 个答案:

答案 0 :(得分:2)

  1. 按照惯例打开网址流。
  2. 将返回的InputStream包装在BufferedReader中,以便您可以逐行阅读。
  3. 维护一个LinkedList,您将保存这些行。
  4. 从BufferedReader读取每一行后:
    1. 将该行添加到列表中。
    2. 如果列表大小超过“n”,请致电LinkedList#removeFirst()
  5. 一旦您阅读了流中的所有行,该列表将包含最后一行“n”行。
  6. 例如(未经测试,仅用于演示):

    BufferedReader in = new BufferedReader(url.openStream());
    LinkedList<String> lines = new LinkedList<String>();
    String line = null;
    while ((line = in.readLine()) != null) {
      lines.add(line);
      if (lines.size() > nLines) {
        lines.removeFirst();
      }
    }
    // Now "lines" has the last "n" lines of the stream.
    

答案 1 :(得分:2)

对不起。你将不得不自己做这个。但不要担心,因为它非常简单。

您只需跟踪自n开始阅读以来遇到的最后UrlStream行。我建议使用Queue吗?

基本上你可以做类似

的事情
public String[] readLastNLines(final URL url, final int n) throws IOException{
    final Queue<String> q = new LinkedList<String>();
    final BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream()));
    String line=null;
    while ((line = br.readLine())!=null)
    {
        q.add(line);
        if (q.size()>n) q.remove();
    }
    return q.toArray(new String[q.size()]);
}

readLastNLines返回一个数组,其中包含从n读取的最后url行。

不幸的是,您不能将RandomAccessFile与来自互联网的流一起使用,因为根据定义,流不是随机访问。