Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中从相对路径读取.txt文件_Java_Eclipse - Fatal编程技术网

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

在Java中从相对路径读取.txt文件,java,eclipse,Java,Eclipse,我知道这个问题有很多不同的说法,但今天我想强调一个特殊的情况,即人们希望在不指定绝对路径的情况下读取.txt文件 假设我们在Eclipse中设置了以下内容 projectName/packageName/subPackage/ 在子包中有一个名为Read.java的类。该类将尝试读取input1.txt 同样的子包中也有input1.txt 如果使用绝对路径,则Read.java中的代码将如下所示(现在假设input1.txt放在我的桌面上以便于演示): //创建一个列表来存储input1.t

我知道这个问题有很多不同的说法,但今天我想强调一个特殊的情况,即人们希望在不指定绝对路径的情况下读取.txt文件

假设我们在Eclipse中设置了以下内容

projectName/packageName/subPackage/
在子包中有一个名为
Read.java
的类。该类将尝试读取
input1.txt

同样的子包中也有
input1.txt

如果使用绝对路径,则
Read.java
中的代码将如下所示(现在假设
input1.txt
放在我的桌面上以便于演示):

//创建一个列表来存储input1.txt中每一行的字符串列表。
LinkedList InputString=新LinkedList();
BufferedReader BufferedTempe=null;
试一试{
弦线;
//指定文件
String fileName=“C:”+File.separator
+“用户”+文件分隔符
+“Kevin”+File.separator
+“桌面”+文件分隔符
+“input1.txt”;
bufferedteme=newbufferedreader(newfilereader(fileName));
while((line=bufferedteme.readLine())!=null){
inputStrings.add(行);
}
}捕获(IOE异常){
e、 printStackTrace();
}最后{
试一试{
如果(BufferedtDeme!=null){
bufferedTeste.close();
}
}捕获(IOE异常){
e、 printStackTrace();
}
}
上面的问题是使用到我的桌面的绝对路径。如果我将代码传递给我的朋友,他将需要手动更改到桌面的路径。即使我将input1.txt放在我的项目文件夹中,我的朋友仍然需要手动更改路径以使其工作

请注意,使用
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()
,因为后者会在路径前面添加一些额外的文本(我只知道是因为我打印出来的),因此会出现
空指针异常
,因为
文件名
的格式不正确

另一个需要注意的重要事项是,我使用了
Read.class.getResource(“input1.txt”).getPath()
而不是
this.getClass().getResource(“input1.txt”).getPath()
如果您对更高级的功能感兴趣,可以查看以下链接:

我希望这有帮助

编辑: 您也可以使用以下命令获取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";

如果您知道该文件将位于运行该程序的每个系统的同一文件夹中,则可以使用系统变量确保定义的任何路径仍能与不同的用户一起使用。对于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";

但是,我不确定在Windows之外该如何工作。

那个
文件.separator
s是我见过的最丑陋的东西之一,因为它是“C:”你为什么要麻烦呢?编辑:哎呀,根本没读你的问题。你正试图摆脱绝对路径。但是,“/”工作Windows tooHahaha好吧,我同意它很难看!我想File.separator在功能上很好,因为如果我没有错的话,它是独立于操作系统的?我认为如果文件夹名称之间有空格,它也可以工作。(:这也很有趣。我想有很多方法可以完成这项工作(:
String fileName = "C:" + File.separator 
                        + "Users" + File.separator 
                        + user + File.separator 
                        + "Desktop" +  File.separator 
                        + "input1.txt";