当前位置: 首页 > 知识库问答 >
问题:

如何只使用FileReader读取多行?

孟文栋
2023-03-14
public class Reader {
    public static void main(String[] args) throws IOException {
        try (FileReader in = new FileReader("D:/test.txt")) {
            // BufferedReader br = new BufferedReader(in);
            int line = in .read();
            for (int i = 0; i < line; i++) {
                //System.out.println(line);

                System.out.println((char) line);
                line = in .read();
            }
        }
    }
}

和一个文件test.txt,其内容如下:

Hello
Java

当我运行上面的代码时,它只读取hello。我只想使用FileReader读取多行。我不想使用BufferedReaderInputStreamReader等,这可能吗?

共有1个答案

吴浩皛
2023-03-14

我不认为这个版本的代码打印的是“你好”。

你在打电话:

int line = in.read();

这是做什么的?在Javadocs中查找阅读器:

然后它进入循环,line==72,所以它进入循环:

  for(int i=0;i<line;i++)

…做出“0小于72吗?是的,所以我将进入循环块”的决定。

然后,每当它读取一个字符时,的值就会变为另一个整数,每个时间循环都围绕i递增。因此,循环表示“只要字符的ASCII值大于我计算的迭代次数,就继续执行”。

H
e
l
l
o


J
a
v
a

这不是你想要的:

  • 您不希望循环重复,直到i>=“我刚刚读到的字符”。您希望它重复,直到in.read()返回-1。您可能已经学会了如何循环直到满足某个条件。
  • 您不想println()每个字符,因为这样会添加您不想要的换行符。使用print().

您还应该查看reader.read(byte[]buffer)方法,看看是否可以编写更大的代码块。

  Type x = getSomehow();
  while(someCondition(x)) {
      doSomethingWith(x);
      x = getSomehow();
  }
  Type x = value_of_x_which_meets_condition;
  while(someCondition(x)) {
      x = getSomehow();
      doSomethingWith(x);
  }
 类似资料:
  • 我对java比较陌生,对如何使用缓冲读取器读取文件很好奇。这是因为我正在上一门课,被分配做一个简单的ceaser密码,我应该解密一个文本文件,创建一个新文件,并将解密的文本放入该文件。我可以用扫描仪和一个10KB的小文件来完成,但是当我要测试的100MB的大文本文件的时候,它是非常慢的。这是我的代码,它应该是读取文件内容。 如果有人能给我指明正确的方向,那就太好了。 提前致谢

  • 由来 在FileUtil中本来已经针对文件的读操作做了大量的静态封装,但是根据职责分离原则,我觉得有必要针对文件读取单独封装一个类,这样项目更加清晰。当然,使用FileUtil操作文件是最方便的。 使用 在JDK中,同样有一个FileReader类,但是并不如想象中的那样好用,于是Hutool便提供了更加便捷FileReader类。 //默认UTF-8编码,可以在构造中传入第二个参数做为编码 Fi

  • 本文向大家介绍如何使Java ArrayList只读?,包括了如何使Java ArrayList只读?的使用技巧和注意事项,需要的朋友参考一下 您可以使用Collections接口的unmodifiableList()方法使集合不可修改。 示例 输出结果

  • 问题内容: 使用JPA将实体设为只读的正确方法是什么?我希望我的数据库表永远不会以编程方式进行修改。 我想我知道我应该用锁定我的对象。从数据库检索后,是否可以使用注释使我的实体直接锁定?还是我必须弄乱并覆盖该特定实体的通用DAO? 问题答案: 一种解决方案是使用基于字段的注释,将字段声明为,并仅建议公共获取者。这样做,您的对象无法更改。 (此解决方案不是特定于实体的,它只是构建不可变对象的一种方法

  • 问题内容: 我有以下代码: 和此web.xml(缩短了程序包并更改了名称,但外观相同) 我想在过滤器之后调用Servlet。我希望可以做到这一点,但是我总是会遇到以下错误: 问题答案: 你可能开始使用 in 使用HttpServletRequest : 你的servlet尝试调用相同的请求,这是不允许的。你需要做的是使用制作请求正文的副本,因此你可以使用多种方法读取它。

  • 问题内容: 有点卡在这里,可能需要您的帮助。我想一次阅读几个BLE特性,有人建议为此使用PriorityQueue。我已经知道所有的uuid,等等。只需要一种同时读取多个uuid的方法。谁能解释它到底是什么样子?也许还有另一个更简单的解决方案? 在此先感谢,这是我的代码: 更新: 即使将它们放在不同的线程上,它仍然仍然只对一个gatt.readCharacteristic(…)做出反应。如下所示: