用Java读取TEXT文件

时间:2015-04-16 00:53:40

标签: java eclipse

尝试在eclipse中打开txt文件时,我不断收到java.lang.NullPointerException。基本上,这是一个主菜单,当你点击"规则"按钮,规则文本文件应该打开。目前,txt文件位于名为" Resources" (这是我在制作游戏时使用的所有其他img文件的地方)。这是代码:

private List<String> readFile(String filename)
{
  List<String> records = new ArrayList<String>();
  try
  {
    BufferedReader buff = new BufferedReader(new InputStreamReader(
            Configuration.class.getResourceAsStream(filename)));
    String line;
    while ((line = buff.readLine()) != null)
    {
      records.add(line);
    }
    buff.close();
    return records;
  }
  catch (Exception e)
  {
    System.err.format("Exception occurred trying to read '%s'.", filename);
    e.printStackTrace();
    return null;
  }
}

//action performed
public void actionPerformed(ActionEvent ae) {
    JButton b = (JButton)ae.getSource();
    if( b.equals(newGameButton) )
        {
        flag = true;
        controller.startGame();
        buttonPressed = "newGameBtn";
        }
    if(b.equals(quitButton))
    {
        System.exit(0);
    }
    if(b.equals(ruleButton)){
        readFile("../resource/riskRules.txt");
    }

}

感谢帮助!

2 个答案:

答案 0 :(得分:1)

如果“资源”它在Eclipse中被标记为资源。构建时,应将txt文件复制到类路径中。 根据我可以从你的代码中猜出你应该做的事情

Configuration.class.getResourceAsStream("riskRules.txt")

由于您的文件位于类路径的根级别。

例如,如果文件在资源中包含名为“text”的目录,则可以使用类似

的内容
Configuration.class.getResourceAsStream("text/riskRules.txt")

答案 1 :(得分:0)

在尝试使用getResourceAsStream之前,需要对getResourceAsStream返回的结果进行一定程度的基本错误检查。您使用getResource代替String path = "/path/to/resource"; // note the leading '/' means "search from root of classpath" URL fileUrl = getClass().getResource(path); if (fileUrl != null ) { File f = new File(fileUrl.toURI()); BufferedReader = new BufferedReader(new FileReader(f)); // do stuff here... } else { // file not found... } 是否有理由?如果文件存在于磁盘上(我从你的OP看到它是因为它在一个包中,并且可能在磁盘上没有物理存在),那么你可以使用它来返回它的路径,并从中创建一个文件对象

String path = "/path/to/resource"; // note the leading '/' means "search from root of classpath"
InputStream is = getClass().getResourceAsStream(path);
if (is != null ) {
    BufferedReader = new BufferedReader(new InputStreamReader(is));
    // do stuff here...
}
else {
    // file not found...
}

如果您需要从JAR存档中提取文件,则可以执行以下操作:

getResource...

如果找不到您的资源,您将避免使用NPE,并且可以正确地解释它缺失的事实。

请注意,如果您的资源包(jar)确实存在,那么就不能使用路径来定位使用“..”的路径,因为jar存档中没有“相对路径”,实际上并不是文件系统上的文件。

您的“资源”位于您在getClass().getResourceAsStream("/com/program/resources/<file.txt>"); 方法中指定的相对路径。前导“/”表示查看类路径的根以查找资源。没有前导“/”表示相对于您用于查找资源的类文件的位置。

如果您的文件位于名为“com.program.resources”的位置,并且您尝试从名为“com.program.someotherpackage.MyClass”的类中找到它,那么您将使用:

<classpath root>
      com
           program
                resources
                     file.txt
                     img.png
                someotherpackage
                     MyClass.class
找到它。

这是我的例子:

{{1}}

通常,通常的做法是将资源保留在的包结构之外,以避免在以后查找时出现混淆。大多数IDE都有办法将目录标记为资源,因此在编译程序时,它们将被复制到类路径根目录中的适当位置,并且可以由任何要求它们的类找到。