【问题标题】:Java File Reading IssuesJava 文件读取问题
【发布时间】:2014-07-14 15:07:03
【问题描述】:

我在尝试读取文件时遇到了一些非常奇怪的问题。

它只有几行简单的代码,但由于某种原因,它认为我的文件有 8 行奇怪的 rumbo jumbo 文本,而每行有 2 行和 4 个字母。

代码(执行一次,正在读取正确的文件)

Scanner scanner = null;

    ArrayList<String> lines = new ArrayList<String>();

    try {
        scanner = new Scanner(getClass().getResourceAsStream("/level.txt"));
    } catch (Exception ex) {
        ex.printStackTrace();
    }

    while (scanner.hasNext()) {
        lines.add(scanner.nextLine());
    }

    Main.main.log(lines.size() + " size");

文件(level.txt,无空格)

sssas
sssas

输出:

8 Size

它非常奇怪,因为它只有几行和一个简单的文件。

有任何帮助、建议或错误吗?没有堆栈跟踪!

谢谢,

杰克

【问题讨论】:

  • 我不认为您的文件包含您所说的内容。
  • 打印 lines 并查看列表中的内容。
  • 可以,但如果您不相信,请将我的代码复制到您的 IDE 中并自行测试。
  • Here you go. 按预期打印 2。

标签: java file execution


【解决方案1】:

Java 7 单行读取文件到列表:

List<String> lines = Files.readAllLines(
    Paths.get(getClass().getResource("/level.txt").toURI()),
    StandardCharsets.UTF_8
);

【讨论】:

  • @Chris 你刚刚把它做成了四线!!1
  • 对不起 :) ... “一个单一的表达者”?
  • 这可行,但会返回一些不稳定的字符串。我怎样才能让它纯粹返回文件(当然在列表中)
  • 你能在摇摇晃晃的弦上细细品味吗?使用此代码,您可以在 List 中获得文件的所有行。
【解决方案2】:

要考虑的第一个问题是正如@Sotirios Delimanolis 所说,您可能从错误的 txt 文件中读取。

第二个问题是,如果您完全确定要从正确的 .txt 文件中读取,则解决方案是在附加到“lines”变量时读取scanner.hasNextLine()。

我认为当您使用“hasNext()”读取令牌时会出现问题,然后使用“scanner.nextLine()”进入下一行。

例如,您可以使用以下内容;

Scanner scanner = null;

ArrayList<String> lines = new ArrayList<String>();

try {
    scanner = new Scanner(getClass().getResourceAsStream("/level.txt"));
} catch (Exception ex) {
    ex.printStackTrace();
}

while (scanner.hasNextLine()) { /* difference is here */
    lines.add(scanner.nextLine());
}

Main.main.log(lines.size() + " size");

编辑:

您可以使用以下代码并根据需要进行修改。 我认为当您阅读文件时也会出现问题。要读取文件,您可以使用 new File() 构造函数而不是您的选择。见下文:

Scanner scanner = null;
ArrayList<String> lines = new ArrayList<String>();

try {
    scanner = new Scanner(new File("level.txt")); /* difference is here */
} catch (Exception ex) {
    ex.printStackTrace();
}

while (scanner.hasNextLine()) { /* difference is here */
    lines.add(scanner.nextLine());
}

System.out.println(lines.size()); // gives output 2.

【讨论】:

  • 输出和之前一模一样,能不能在自己的IDE里试试?
  • 我尝试并给出了正确的解决方案。请查看我的答案的编辑版本。
  • 嗯,我的不工作。该文件正在被读取,因为如果它不存在则会出错。 .rtf 会按预期工作吗?
  • 发送文件名时不要使用/标签。这可能会导致问题。
【解决方案3】:

我建议继续使用更正确的不同方法..

public static void main(String[] args) {

    BufferedReader br = null;
    ArrayList<String> lines = new ArrayList<String>();

    try {

        String sCurrentLine;

        br = new BufferedReader(new FileReader("C:\\testing.txt"));

        while ((sCurrentLine = br.readLine()) != null) {
            lines.add(sCurrentLine);
        }

    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (br != null)br.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

}

这将完美地解决问题..希望有所帮助

编辑:

如果您想从项目的类路径中读取文件,可以使用以下命令:

 InputStream in = this.getClass().getClassLoader().getResourceAsStream("SomeTextFile.txt"); 
BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8")); 

这样的想法会很好..我并不是说您不能使用扫描仪来做到这一点..恕我直言,我认为这更好..但这是一个选择问题,而不是大的架构问题..考虑是你的 :)

【讨论】:

  • 基本上 Scanner 更适合与用户输入一起使用...并且它的 api 不是最好的.. 对于读取文件更适合使用 BufferReader.. 看看这个链接例如@ 987654321@
  • 更容易使用并不意味着其他解决方案是错误的。此外,您正在从文件系统中读取,而 OP 正在从类路径中读取。解决这两个问题,你应该会没事的。
  • 如果您想解析输入或从 cmd 获取输入,则使用扫描仪。BufferReader 只是读取纯文本,这就是这里的情况。您不同意吗?
  • 如何从我的 src 中的文件位置读取,而不是从计算机上的任何位置读取?
  • 是的,我如何通过上面的示例从类路径中读取?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多