eclipse—在java中从相对路径读取.txt文件

gzszwxb4  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(729)

我知道这个问题有很多种不同的说法,但是今天我想强调一个特殊的场景,当一个人希望读取一个.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 这是一个很好的实践,因为不同的操作系统对分隔符的解释有点不同,但仍然不够。
那我们该怎么办呢?

e37o9pze

e37o9pze1#

这是我的解决办法。

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

System.out.println(fileName);

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

让我们回顾一下场景。我们有自己的 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所在的目录。

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

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

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

如果您想拥有更多指定路径的控件(例如,如果您想创建 output.txt 在read.class所在的目录中,使用

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

o2g1uqev2#

如果您知道该文件将位于运行该程序的每个系统中的同一文件夹中,则可以使用系统变量来确保定义的任何路径仍适用于不同的用户。对于windows,我使用了:

String user = new com.sun.security.auth.module.NTSystem().getName();

获取用户名。在您的示例中,可以将其替换为:

String fileName = "C:" + File.separator 
                        + "Users" + File.separator 
                        + user + File.separator 
                        + "Desktop" +  File.separator 
                        + "input1.txt";

我不知道这将如何工作以外的窗口然而。

相关问题