我正在尝试为猜词游戏编写代码,当我使用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");
}
}
答案 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
。