写入.jar外的文件

时间:2016-05-25 17:00:08

标签: java jar filewriter bufferedwriter

我的项目结构:

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?

1 个答案:

答案 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

Foo.java

此类在运行时会尝试查找import java.io.BufferedReader;本身并输出其第一行,即:Foo.class

  1. 将其编译为Foo.class
  2. 说,{(1}}计算机上存储/tmp的文件夹为/tmp
  3. 您现在位于java Foo =>中的终端上cd $HOME。这应按预期打印第一行。
  4. java -cp /tmp Foo
  5. Foo.java(这是因为你的班级仍在/ tmp中)
  6. 这失败了:

      

    线程中的异常" 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)

    这是因为它试图在当前工作目录中找到$HOMEFoo.java/tmp本身位于其他文件夹(BufferedReader)中。在你的案例中BufferedWriter的{​​{1}}也是如此。

    因此,您应该从file.txt所在的文件夹运行此程序

    1. cd project/out
    2. java -cp myjar.jar Main
    3. 更好的想法是始终知道要写入的文件的位置。这样,您的程序可能会绑定到特定类型计算机上的特定路径,但至少可以从该计算机上的任何位置运行它而不会出现问题。