在Java中从相对路径读取.txt文件
我知道这个问题有很多不同的说法,但今天我想强调一个特殊的情况,即人们希望在不指定绝对路径的情况下读取.txt文件 假设我们在Eclipse中设置了以下内容在Java中从相对路径读取.txt文件,java,eclipse,Java,Eclipse,我知道这个问题有很多不同的说法,但今天我想强调一个特殊的情况,即人们希望在不指定绝对路径的情况下读取.txt文件 假设我们在Eclipse中设置了以下内容 projectName/packageName/subPackage/ 在子包中有一个名为Read.java的类。该类将尝试读取input1.txt 同样的子包中也有input1.txt 如果使用绝对路径,则Read.java中的代码将如下所示(现在假设input1.txt放在我的桌面上以便于演示): //创建一个列表来存储input1.t
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()因为代码是在静态上下文中调用的(在我的main方法中)。如果您创建了一个对象,那么可以随意使用后者
如果您对更高级的功能感兴趣,可以查看以下链接:
我希望这有帮助
编辑:
您也可以使用以下命令获取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";