【问题标题】:Unable to read text file in Java using FileReader and BufferedReader无法使用 FileReader 和 BufferedReader 读取 Java 中的文本文件
【发布时间】:2018-05-15 07:24:23
【问题描述】:

我想在 java8 中读取文本文件,我收到错误“类型不匹配:无法从 FileReader 转换为 Reader”。如果我将 Reader 类更改为 FileReader,则会收到错误“构造函数 BufferedReader(FileReader) 未定义” 我的陈述是

Reader fr = new FileReader("testfile.txt");
BufferedReader br =  new BufferedReader(fr);

请推荐

【问题讨论】:

  • 请提供minimal reproducible example。我的猜测是您有一个名为FileReader 的类,因此您的代码引用的FileReader 实际上并不是java.io.FileReader
  • @JonSkeet 不仅仅是猜测,我敢打赌这是 OP 描述的两个错误的唯一可能解释。
  • 我用过 import java.io.*;
  • @ErwinBolwidt:他们可能有一个Reader 类而不是FileReader 类;)(转换同样不可行......)
  • I have used import java.io.* 好吧,给我们看看代码。你所拥有的还不够。

标签: java bufferedreader filereader


【解决方案1】:

要确认您有一个名为 FileReader 的课程,只需在代码中使用完整的课程名称:

java.io.Reader fr = new java.io.FileReader("testfile.txt");
java.io.BufferedReader br =  new java.io.BufferedReader(fr);

这将确保您使用特定的类而不是 yourPackage.FileReader 类。

然后,由于似乎只有FileReader 有问题,您可以将其清理一下:

import java.io.*

...

Reader fr = new java.io.FileReader("testfile.txt");
BufferedReader br =  new BufferedReader(fr);

仅指定FileReader 全名。

注意:

使用Class.GetPackage,你应该知道你正在使用哪个类。

System.out.println(FileReader.class.getPackage());

说明:

JLS - 7.5. Import Declarations

这些声明导入的类型或成员的范围和阴影在§6.3§6.4 中指定。

6.4.1. Shadowing

包声明永远不会影响任何其他声明。

包 p 的编译单元 c 中的单一类型导入声明 d 导入名为 n shadows 的类型,贯穿整个 c,以下声明:

  • 在 p 的另一个编译单元中声明的任何名为 n 的顶级类型
  • 任何名为 n 的类型由 c 中的按需类型导入声明导入
  • 由 c 中的静态导入按需声明导入的任何名为 n 的类型

示例

A
A.Run
A.Test
B
B.Test

在 A.Run.java 中

System.out.println(Test.class.getPackage());

这是输出:

  • 不导入:包 A
  • 不导入import B.*:包A
  • 不导入import B.Test:包B

【讨论】:

  • 这是一个合理的测试,我希望看到 OP 也尝试一下。
  • @MDHUSENPAREET 做了一些编辑来解释为什么使用 import * 不起作用。
  • 感谢您的详细解释。它给了我关于包裹的宝贵见解。
  • BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(System.getenv("OUTPUT_PATH")));这会引发空指针异常。任何指针如何消除此错误? java.io.FileOutputStream.(FileOutputStream.java:101) 处 java.io.FileOutputStream.(FileOutputStream.java:203) 处的线程“main”java.lang.NullPointerException 中的异常。 FileWriter.(FileWriter.java:63)
【解决方案2】:

您可能正在导入 java.io.BufferedReader 和 java.io.Reader 以外的其他内容。

这行得通

package com.company;

import java.io.*;

public class Main {
        public static void main(String[] args) throws Exception {
            Reader fr = new FileReader("testfile.txt");
            BufferedReader br =  new BufferedReader(fr);
        }
}

请检查您的进口;

【讨论】:

  • 不,该代码不起作用:FileReader 构造函数可以抛出一个您既没有声明也没有捕获的 IOException,并且您还没有声明一个类。如果您要提供一个您声称编译的示例,请确保它确实如此。
  • 我收到错误“类型不匹配:无法从 FileReader 转换为 Reader”
  • 上面的代码确实为我编译(我没有测试它)。 OP 应该向我们展示他的代码,因为他的问题没有任何意义。
  • 你的包目录中是否有一个名为 Reader 或 FileReader 的类?这对我来说似乎是唯一可能的事情了。
  • 另外,如果您已经将许多小项目作为一系列计划的一部分(例如课堂作业),则可能有一个名为 FileReader 的旧课程仍然存在于以前的课程中一段代码。开始一个新项目可能很有意义,并确保一开始您只有基本的 Java 运行时。
猜你喜欢
  • 2018-08-04
  • 2017-12-01
  • 2014-05-09
  • 2023-03-27
  • 2011-10-06
  • 1970-01-01
  • 2012-09-04
  • 2013-04-12
  • 1970-01-01
相关资源
最近更新 更多