Java - 从缓冲读取器中打印行

4
我正在编写一个InputStream,用于在常量间隔时间内提供文件中的行。我之前使用BufferedReader,但是遇到了缓冲问题(必须等待整个文件读取完毕才能获取任何内容),而且速度也不是问题(间隔时间大约为每秒或每半秒)。是否有一种类似于BufferedReader的带有readLine方法的类,除了没有缓冲?

(编辑:我刚刚检查了一下-我的类似乎有效,显然问题出在输出上)

这是我使用流的代码(OnlineDataSimulator)。我已经检查过,该流做到了我想要的,所以显然我在输出方面做错了什么。(实际问题是,我希望输出每X毫秒发生一次-X是OnlineDataSimulator的第二个参数。当我运行此代码时,我首先得到X *行的等待,然后一次性获取整个输出。)

        System.out.println("Testing:");
        PrintStream fout = new PrintStream(new FileOutputStream("testfile"));
        for(int i=0; i<20; ++i) {
            fout.println(i);
        }
        fout.close();
        BufferedReader fin = new BufferedReader(new InputStreamReader(
                new OnlineDataSimulator("testfile",250)));
        String line;
        while((line=fin.readLine())!= null){
            System.out.println(line);
            System.out.flush();
        }
        fin.close();
        (new File("testfile")).delete();

你可以使用 Scanner。这里有一个使用 示例 - Nir Alfasi
当您希望输出到接收器时,只需刷新输出即可。 - user207421
我正在尝试,但不知何故它不起作用。我现在发布了示例代码(流本身的行为符合我的预期),你能否请解释一下为什么它不起作用? - Cubic
3个回答

5

试试这种方法……对我有用。

File f = new File("path");
FileReader fr = new FileReader(f);
BufferedReader br = new BufferedReader(fr);

String s = null;

while ((s=br.readLine())!=null)
    {

           System.out.println(s);
    }

只有FileReader适用于我。在资源目录中的纯文本文件,使用gradle构建。可以像标准方式一样加载属性文件,或者使用上述方法将其作为字符串读取。这似乎很平凡,直到你尝试去做它。因为它在构建和运行时都能正常工作,所以它也应该适用于分布式JAR、fat JAR或uber JAR。 - Thufir

0

不,没有其他非缓冲选项。 一个解决方案是编写自己的Reader,它具有InputStreamReader作为底层流,在readLine()方法中应该调用底层输入流读取器的read(),直到找到"\n"。将所有这些聚合并作为字符串返回。


0

如果您不想使用真正的缓冲区,但想要使用BufferedReader的功能,您可以使用缓冲区大小为1进行初始化。由于您已经评论说速度不是问题,这可能是最可靠的解决方案。

new BufferedReader(reader, 1)

公共缓冲读取器(Reader in,int sz)

如果您想要实现自己的readLine()方法,请在此处查看源代码。


我有同样的想法,但我想知道它是否会出现空行问题(\n将被缓冲,只有在读取下一行时才会返回空行)。不过值得一试。 - JB Nizet
\n 没有缓冲...如果您检查源代码,您会发现这是 readLine 的终止符,在这种情况下(只找到 \n),用于存储行的 StringBuffer 是空的,将返回一个空字符串给调用。这意味着,空行将作为空字符串返回。 - Francisco Spaeth
该死,还是不行。FileReader可能已经被缓冲了吗? - Cubic
@Cubic:你是想在开始读取文件后修改它,并期望读取过程读取修改后的内容吗? - Francisco Spaeth
@Cubic:你的流是否在每行末尾发送行终止符? - JB Nizet
是的。我得到了正确的输出,只是延迟不在我想要的位置。 - Cubic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接