我的项目结构:
project
out
file.txt
myjar.jar
Main.class
我的代码段(找不到file.txt):
BufferedWriter output = new BufferedWriter(new FileWriter("file.txt", true));
output.append(player.toString());
output.close();
如何找到file.txt并将文本附加到file.txt?
答案 0 :(得分:1)
可以确定当前工作目录与计算机上的每个进程相关联。进程启动时,通常会有一个当前工作目录。这适用于JVM进程(在您的计算机上运行命令java
时启动的进程)。
您在各种IO类方法中指定的相对路径与当前工作目录有关。这是java.io.File
java
所说的内容:
默认情况下,java.io包中的类总是解析相对的 针对当前用户目录的路径名。该目录已命名 由系统属性user.dir,通常是在中的目录 调用了Java虚拟机。
因此,重要的是在调用file.txt
时使用正确的工作目录。相对路径(例如您的import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class Foo {
public static void main(String[] args) throws IOException {
try (BufferedReader reader = new BufferedReader(new FileReader("Foo.java"))) {
System.out.println(reader.readLine());
}
}
}
)是那些不以前导' /'开头的路径。或驱动器盘。
以下是一个例子:
Foo.java
此类在运行时会尝试查找import java.io.BufferedReader;
本身并输出其第一行,即:Foo.class
。
Foo.class
。/tmp
的文件夹为/tmp
。java Foo
=>中的终端上cd $HOME
。这应按预期打印第一行。java -cp /tmp Foo
。Foo.java
(这是因为你的班级仍在/ tmp中)这失败了:
线程中的异常" main" java.io.FileNotFoundException:Foo.java(No 这样的文件或目录)在java.io.FileInputStream.open0(Native 方法)在java.io.FileInputStream.open(FileInputStream.java:195)at at java.io.FileInputStream。(FileInputStream.java:138)at java.io.FileInputStream。(FileInputStream.java:93)at java.io.FileReader。(FileReader.java:58)at Foo.main(Foo.java:10)
这是因为它试图在当前工作目录中找到$HOME
,Foo.java
和/tmp
本身位于其他文件夹(BufferedReader
)中。在你的案例中BufferedWriter
的{{1}}也是如此。
因此,您应该从file.txt
所在的文件夹运行此程序:
cd project/out
java -cp myjar.jar Main
更好的想法是始终知道要写入的文件的位置。这样,您的程序可能会绑定到特定类型计算机上的特定路径,但至少可以从该计算机上的任何位置运行它而不会出现问题。