【问题标题】:Cannot read a text file in Java. [closed]无法读取 Java 中的文本文件。 [关闭]
【发布时间】:2013-09-16 21:40:35
【问题描述】:

目前,我正在学习如何使用 Java 编程作为一种爱好。我在 NetBeans 中进行了大量阅读和练习,但我没有接受过任何正式培训。所以,如果我犯了菜鸟的错误,请记住这一点。

好的,所以,我得到了如何用 Java 读取文件的代码。我在网上和这里都看到过同样的代码;我不会打扰你们的。 :)

现在,就像我说的那样,我已经做了很多阅读和研究,我知道给我的代码是垃圾。 (如果你想知道我得到了什么,包被称为“textfiles”,类被称为“FileData”和“ReadFile”,“readFile”和“OpenFile”作为“ReadFile”类下的方法。听起来很熟悉?) 不管怎样,我厌倦了,写了我自己的。现在,我的日子有点难过。我做错了什么?

这是我的主要课程:

package javaclass;

import java.io.IOException;

    public class JavaClass{

    public static void main(String[] args) throws IOException {

        String file_name = "C:/users/Admin/test.txt";
        try {
            Reader rdr = new Reader(file_name);
            System.out.println(rdr.OpenFile());
        }
        catch (IOException e) {

        }


    }
} 

这是我打开和阅读文件的课程:

package javaclass;

import java.io.FileReader;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.ArrayList;

public class Reader extends JavaClass{

    private String path;

    public Reader(String file_name) throws IOException {
        String file = path;
    }

    public String OpenFile() throws IOException {
        FileReader fr = new FileReader(path);
        BufferedReader br = new BufferedReader(fr);
        String line = null;
        ArrayList<String> list = new ArrayList<>();        
        while ((br.readLine()) !=null) {
            list.add(line);
        }
        return list.toString();           
    }
}

这是我编译时得到的:

Exception in thread "main" java.lang.NullPointerException
at java.io.FileInputStream.<init>(FileInputStream.java:134)
at java.io.FileInputStream.<init>(FileInputStream.java:97)
at java.io.FileReader.<init>(FileReader.java:58)
at javaclass.Reader.OpenFile(Reader.java:17)
at javaclass.JavaClass.main(JavaClass.java:12)
Java Result: 1
BUILD SUCCESSFUL (total time: 0 seconds)

我一直在绞尽脑汁想弄清楚这一点。我已经查看了例外情况。 Reader.java:17 指“FileReader fr = new FileReader(path);”而 JavaClass.java:12 指的是“System.out.println(rdr.OpenFile());”。

感谢您的宝贵时间和建议。 :)

【问题讨论】:

  • 提示:pathnull
  • 在 Windows 上,您需要对文件路径使用反斜杠:"C:\users\Admin\test.txt"。您使用的是 Unix/Linux 约定。
  • 另外,Java 中的变量名通常是驼峰式,所以file_name 应该是fileName。这不是必需的,但这是一种很好的做法。
  • @Hassan, / 将在 Java 中的 Windows 上工作。
  • @developerwjk 我不知道,谢谢。

标签: java readfile filereader


【解决方案1】:

堆栈跟踪告诉您错误是什么。在创建FileReader 的实例时,变量path 尚未赋值。

您将file_name 分配给一个从未使用过的变量。替换

String file = path;

path = file_name;

另外别忘了给变量赋值line

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

以便可以为其分配一个值以添加到ArrayList

【讨论】:

  • 我做了这些改变。我似乎很容易忘记在“while”语句中添加“line”。如果您忘记留下它,NetBeans 不会抛出错误,因此很容易被忽略。在 Reader 方法中,我有我的语句向后分配一个值给我的实例变量(“String file_name = path;”需要是“path = file_name;”)我还添加了一个“br.close();”运行后进行清理。现在,这就是发生的事情。当我运行时,这次没有错误,我得到“[null,null,null,null]”。你知道为什么吗?
  • 看起来您仍然没有分配 line 变量。您是否进行了更改(或可能运行旧代码)?如果是后者,请尝试清理您的项目
  • ---编辑---我做了更改,现在它可以工作了。谢谢你的指导。这一切都非常感谢!
  • Np,别忘了accept an answer :)
【解决方案2】:

你应该做这个改变 ->

                    while ((line = br.readLine()) != null) {
                            list.add(line);
                    }

【讨论】:

  • 这可能是真的,但问题是为什么...;)
  • 为什么什么? :-) .. 我希望你问我为什么要修改一段时间条件。较早的“行”没有被分配任何值并且为空。
  • 我要求您向用户解释为什么他们应该更改代码以匹配您的建议;)
  • @MadProgrammer 感谢您的洞察力。 MadProgrammer,感谢您在尝试向我展示原因时提供的指导。我知道 String 行已初始化,但在将其添加到 while 方法之前没有添加任何内容。
【解决方案3】:
while ((br.readLine()) !=null) {
    list.add(line);
}

改变:

while (br.ready()) {
    list.add(br.readLine());
}

public Reader(String file_name) throws IOException {
    String file = path;
}

改变

public Reader(String file_name) throws IOException {
    path = file_name;
}

【讨论】:

  • 这可能只是因为我是老派,但我对while ((br.readLine()) !=null) { 很好奇,我个人会使用更像while ((line = br.readLine()) != null) { 的东西。我主要担心的是,当我读到它时,ready 只会告诉你下一个readLine 是否会阻塞。虽然读取文件可能是一种有效的用途,但我可以想到文件可能“阻塞”的时间(即通过慢速网络读取),但如果用于从其他流中读取,我肯定会担心.. .只是探索想法;)
  • (抱歉,应该是while (br.ready()) {...复制了错误的文字:P - 请喝咖啡!)
  • 你说得对。我总是使用缓冲阅读器来读取本地磁盘中的文本文件,我从未遇到过这个问题(连接速度慢)。我明白了,感谢您的关注。
  • @Melih Altıntaş 我没有更改“while”语句,但我在其中添加了“line”;现在它显示为“while((line = br.hasNext()) !=null) { list.add(line); }”。现在,它起作用了。您之前提到过有关 BufferedReader 的内容,这是读取文件的最佳方式吗?你说的网络连接速度慢是什么意思?在 BufferedReader 返回 null 之前是否有时间框架?读取文件的最佳方法是什么?谢谢。
  • bufferedReader 是最好的方法。问题是我总是使用 while (br.ready()) madprogrammer 解释这是错误的。你的方法是正确的,你应该使用 while ((line = br.readLine ()) != null) 并请查看stackoverflow.com/questions/5244839/… 并将此问题标记为已解决
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-26
  • 2013-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多