我知道这个问题有很多种不同的说法,但是今天我想强调一个特殊的场景,当一个人希望读取一个.txt文件而不指定绝对路径时。
假设我们在eclipse中设置了以下内容。
projectName/packageName/subPackage/
我们有一个班级叫 Read.java
在分装里面。该类将尝试从 input1.txt
.
我们还有 input1.txt
在同一个分装里。
如果使用绝对路径,则内部的代码 Read.java
将是以下内容(现在假设 input1.txt
放在我的桌面上以便于演示):
// Create a list to store the list of strings from each line of the input1.txt.
LinkedList<String> inputStrings = new LinkedList<String>();
BufferedReader bufferedTextIn = null;
try {
String line;
// Specify the file
String fileName = "C:" + File.separator
+ "Users" + File.separator
+ "Kevin" + File.separator
+ "Desktop" + File.separator
+ "input1.txt";
bufferedTextIn = new BufferedReader(new FileReader(fileName));
while ((line = bufferedTextIn.readLine()) != null) {
inputStrings.add(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (bufferedTextIn != null) {
bufferedTextIn.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
上面的问题是使用绝对路径到我的桌面。如果我将代码传递给我的朋友,他将需要手动更改到桌面的路径。即使我将input1.txt放在我的项目文件夹中,我的朋友仍然需要手动更改路径才能工作。
注意,使用 File.separator
这是一个很好的实践,因为不同的操作系统对分隔符的解释有点不同,但仍然不够。
那我们该怎么办呢?
2条答案
按热度按时间e37o9pze1#
这是我的解决办法。
让我们回顾一下场景。我们有自己的
input1.txt
文件放置在与Read.java
. 所以,上面的代码试图去哪里Read.class
存在(在bin
文件夹),并查找input1.txt
. 这是相对于read.class所在位置的路径(在本例中,它通常位于同一文件夹中,但您可以指定另一个相对于read.class所在位置的文件夹)。print语句可以让您确切地知道它所在的位置,这是调试时的一个好习惯。在eclipse中构建时
.java
src文件夹中的文件将编译为.class
文件和文件夹将放在bin文件夹中。最妙的是input1.txt
也会复制到bin文件夹上(并保留所有包层次结构)。需要注意的一点是使用
getPath()
而不是toString()
,因为后者会在路径的前面添加一些额外的文本(我只知道是因为我把它打印出来的),因此您会得到一个NULL pointer exception
因为fileName
格式不正确。另一个需要注意的重要事情是
Read.class.getResource("input1.txt").getPath();
而不是this.getClass().getResource("input1.txt").getPath();
因为代码是在静态上下文中调用的(在我的main方法中)。如果您创建了一个对象,那么可以随意使用后者。如果您对更高级的功能感兴趣,可以查看以下链接:
class.getresource()和classloader.getresource()之间有什么区别?
我希望这有帮助!
编辑:您可以使用以下命令来获取read.class所在的目录。
指定
getResource("..")
将转到父目录。如果您想拥有更多指定路径的控件(例如,如果您想创建
output.txt
在read.class所在的目录中,使用o2g1uqev2#
如果您知道该文件将位于运行该程序的每个系统中的同一文件夹中,则可以使用系统变量来确保定义的任何路径仍适用于不同的用户。对于windows,我使用了:
获取用户名。在您的示例中,可以将其替换为:
我不知道这将如何工作以外的窗口然而。