扫描程序抛出FileNotFoundException,但使用bufferedreader和inputstream不是吗?

时间:2016-12-13 15:06:16

标签: java

我正在尝试为猜词游戏编写代码,当我使用bufferedreader和inputstream组合时,它运行良好。但是当我使用扫描仪尝试它时,它找不到文件,即使在两个实例中文件都在同一个文件夹中。它位于我的项目文件夹中的src文件夹下的一个名为res的文件夹中(我在eclipse中编码)。

import java.util.ArrayList;
import java.util.Scanner;
import java.io.File;

public class WordGen {

    private final String filename = "/res/words.txt";
    File file = new File(filename);
    Scanner input = null;
    private ArrayList<String> list = new ArrayList<>();

    public WordGen() {
        try {
            input = new Scanner(file);

            while (input.hasNextLine()) {
                String w = input.nextLine();
                list.add(w);
            }
        } catch (Exception ex) {
            System.out.println("File not found.");
        }
    }

    public String getword() {
        if (list.isEmpty()) {
            return "NOTHING";
        }
        return list.get((int) (Math.random() * list.size()));
    }
}

public class test {

    public static void main(String[] args) {
        WordGen wordgen = new WordGen();
        System.out.println(wordgen.getword());
    }

}

我尝试搜索此问题,但无法在此处找到它。我猜这是一个非常小的错误,我无法弄清楚。谢谢和问候。

编辑:这是其他有效的代码(其他所有内容与以前相同):

public WordGenerator() 
 {
    try(InputStream input = getClass().getResourceAsStream(fileName);
            BufferedReader bfreader = new BufferedReader(new InputStreamReader(input))) 
    {
        String line = "";
        while ((line = bfreader.readLine()) != null)
            words.add(line);
    }
    catch (Exception e) 
    {
        System.out.println("Couldn't find file");
    }
}

1 个答案:

答案 0 :(得分:3)

Scanner正在尝试加载文件 - 并且您提供了绝对文件名/res/words.txt

为了创建InputStream,您需要加载资源,并为其提供绝对的资源名称,即使您已经使用了资源。我称之为变量fileName

getClass().getResourceAsStream(fileName)

这是有效的,因为可以从类路径加载名为/res/words.txt的资源,但是它没有加载文件的 filename { {1}}。

如果您运行/res/words.txt目录中的代码,则可以使用res/words.txt的文件名...或者您可以坚持使用src,这可能是个更好的主意因为它不依赖于您的工作目录,即使您的代码和资源被打包到一个jar文件中,它也将继续工作。

如果您真的想使用getResourceAsStream,可以随时使用Scanner - new Scanner(input)构造函数接受Scanner