我正在使用 Intelli-J Idea IDE 并致力于 Java EE Web 项目。我正在尝试阅读words.txt
文件。该代码在命令行中运行良好,但是当我将代码部署到 glassfish 服务器中时,它给了我“FileNotFoundException”。
文件位于“src/Analyser/pWords.txt”
读取文件内容的代码:
Scanner scan = new Scanner(new File("src/Analyser/pWords.txt"));
搜索StackOverflow后,我发现我需要将此文件添加到资源目录中。不幸的是,我无法创建资源。当我创建包main
时以及 src
中的资源文件夹中,包变为main.resources
,我尝试了另一种方法,例如:
InputStream inputStream = new FileInputStream("src/Analyser/pWords.txt");
并且
InputStream inputStream = MyClass.class.getClassLoader().getResourceAsStream("src/Analyser/pWords.txt");
InputStream inputStream = MyClass.class.getClassLoader().getResourceAsStream("pWords.txt");
但结果是null
或error
.
有什么办法可以从 src/Analyser/
读取文件吗?我的项目中的目录?这是一个 Java EE Web 项目。
更新:
从项目结构 > 工件 > WEB-INF
文件夹中,我上传了pWords.txt
文件。现在最后,BufferedReader 不为空,在调试时我可以看到 bufferedReader
包含数据。但是当我将数据复制到字符串变量时,该变量仍为空。我对此很困惑。
代码:
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream stream = classLoader.getResourceAsStream("pWords.txt");
BufferedReader bf = new BufferedReader(new InputStreamReader(stream));
String t = "";
try {
while((t = bf.readLine()) != null) { // in debugging, (cb) contains the char data as char elements.
t += bf.readLine(); // but t = null
}
} catch(IOException x) {
}
最佳答案
您的代码中确实有两个问题/错误!
1.) 您以两种方式使用变量 t。一方面,您将结果组合为 t += bf.readLine();
另一方面,您将使用来自流的进一步输入覆盖 t (t = bf.readLine()) != null
。由于这是 while 循环的中止条件,因此 t 最终始终为 null!
2.) 您正在调用bf.readLine()
两次 - 在 while 条件中,并在循环内再次。如果您阅读 readLine()
的 API/javadoc然后你就会知道这两个调用将返回 2 个不同的(!)结果。这样,如果流 ( bf
) 仅包含一行文本,那么在您的情况下,将调用 bf.readLine()
将返回您的文本行,当您尝试将其添加到变量 t
时那么你的(第二次)调用bf.readLine()
将返回 null,因为已到达流末尾。
可能的解决方案:
String singleLine;
String wholeText = "";
try {
while((singleLine = bf.readLine()) != null) {
wholeText += singleLine;
}
} catch(IOException x) {
}
关于java - 读取 Java EE Web 项目中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47930812/