gpt4 book ai didi

java - 在 Java 中从相对路径读取 .txt 文件

转载 作者:行者123 更新时间:2023-11-30 08:25:13 24 4
gpt4 key购买 nike

我知道这个问题已经被无数变体问过,但今天我想强调一个特定的场景,当人们希望在不指定绝对路径的情况下读取 .txt 文件时。 p>

假设我们在 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();
}
}

上面的问题是使用了我桌面的绝对路径。如果我将代码传递给我的 friend ,他将需要手动更改到他的桌面的路径。即使我将 input1.txt 放在我的项目文件夹中,我的 friend 仍然需要手动更改路径才能使其生效。

请注意,使用 File.separator 是一种很好的做法,因为不同的操作系统对分隔符的解释略有不同,但这仍然不够。

那么我们该怎么做呢?

最佳答案

这是我的解决方案。

String fileName = Read.class.getResource("input1.txt").getPath();

System.out.println(fileName);

bufferedTextIn = new BufferedReader(new FileReader(fileName));

让我们回顾一下场景。我们将 input1.txt 文件放在与 Read.java 相同的文件夹中。因此,上面的代码尝试转到 Read.class 所在的位置(在 Eclipse 中的 bin 文件夹中的某处),并查找 input1.txt。这是相对于 Read.class 所在位置的路径(在本例中,它通常位于同一文件夹中,但您可以指定另一个相对于 Read.class 所在位置的文件夹)。 print 语句让您确切知道它所在的位置,是调试时的一个好习惯。

在Eclipse中构建时,src文件夹下的.java文件会被编译成.class文件,放在bin 文件夹。巧妙的是 input1.txt 也被复制到 bin 文件夹中(并且所有的包层次结构都被保留)。

需要注意的重要一点是使用 getPath() 而不是 toString(),因为后者会添加一些额外的文本路径的前面(我只知道是因为我把它打印出来了),因此你会得到一个 NULL pointer exception 因为 fileName 的格式不正确。

另一个需要注意的重要事项是我使用了 Read.class.getResource("input1.txt").getPath(); 而不是 this.getClass().getResource("input1.txt").getPath(); 因为代码是在静态上下文中调用的(在我的主要方法中)。如果您创建一个对象,则可以随意使用后者。

如果您对更多高级功能感兴趣,可以查看以下链接:

What is the difference between Class.getResource() and ClassLoader.getResource()?

希望对您有所帮助!

编辑:您也可以使用以下命令获取 Read.class 所在的目录。

String fileName = Read.class.getResource(".").getPath();

指定 getResource("..") 将转到父目录。

String fileName = Read.class.getResource("..").getPath();

如果你想要更多地控制指定路径(例如,如果你想在 Read.class 所在的目录中创建 output.txt,请使用

String fileName = Read.class.getResource(".").getPath() + "output.txt";

关于java - 在 Java 中从相对路径读取 .txt 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22328133/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com