Java 为什么我尝试将文本附加到文件时没有响应?

Java 为什么我尝试将文本附加到文件时没有响应?,java,file-io,append,bufferedwriter,Java,File Io,Append,Bufferedwriter,我只是想在我的*.txt文件中添加一行新的文本,但什么也没发生。该文件包含.war,因此我使用类加载器访问该文件。此外,我的EclipseIDE和文件内容都使用UTF-8编码 我用这些作为灵感: 现在我的代码主要基于上一篇文章,如下所示: public class test { public static void main(String[] args){ URL url = Thread.currentThread().getContextClassLoade

我只是想在我的*.txt文件中添加一行新的文本,但什么也没发生。该文件包含.war,因此我使用类加载器访问该文件。此外,我的EclipseIDE和文件内容都使用UTF-8编码

我用这些作为灵感:

现在我的代码主要基于上一篇文章,如下所示:

public class test {


    public static void main(String[] args){

        URL url = Thread.currentThread().getContextClassLoader().getResource("MilestoneExport.txt");

        File file = new File(url.getFile());

        System.out.println(file.canRead()); //true
        System.out.println(file.canWrite()); //true


        try {
            BufferedWriter out = new BufferedWriter
                (new OutputStreamWriter(new FileOutputStream(file),"UTF-8"));
            out.append("new line");
            out.append("new line 2");
            out.append("new line 3");
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }   
    }
}
我已经确认文件确实找到了,而且读起来很好。我已经能够通过使用
BufferedReader
将它的全部内容输出到控制台。文件的路径也正确,但绝对没有向文件中添加任何文本。我已确保每次运行程序时都进行了刷新和更新

此外,我还尝试创建一个名为
foo.txt
的简单空文件,该文件与test.java位于同一目录中。我在main方法中添加了以下代码,由
BufferedWriter
API提供,位于

我错过了什么?为什么没有错误信息,也没有任何响应或反馈

下面的所有内容都只是关于我尝试过的内容的附加信息。在任何情况下都没有反馈:

  • 不是这个:
  • 不是这个:
  • 不是这个:
  • 还有一个“记住关闭/冲洗”:
  • try
    块之外定义BufferedWriter没有什么区别,但我还是尝试了,因为
同样,这个代码,从这个答案来看,也不起任何作用

try {
        BufferedWriter output = new BufferedWriter(new FileWriter(new File("house.txt")));

        output.write("text");
        output.close();
    } 
    catch (IOException e) {
        e.printStackTrace();
    } 
最后但并非最不重要的一点是,我怀疑这可能与我的Web应用程序的打包以及源文件夹和目标文件夹之间的差异有关。所以我把代码复制到了一个全新的清洁项目中,但它仍然什么都没做

编辑:

此代码:

System.out.println(file.exists());
System.out.println(file.getAbsolutePath());
System.out.println(file.getCanonicalPath());
System.out.println(file.getName());
System.out.println(file.isDirectory());
System.out.println(file.isFile());
System.out.println(file.setLastModified(new   GregorianCalendar().getTimeInMillis()));
给出这些输出:

  • 真的
  • D:\Data\myworkspace\MyProject\target\classes\MilestoneExport.txt
  • D:\Data\myworkspace\MyProject\target\classes\MilestoneExport.txt
  • MilestoneExport.txt
  • 假的
  • 真的
  • 真的

我是否完全误解了java文件对象的使用,以及它与文件编写器的使用?文件已100%确认为正确的文件。

您应该使用
FileOutputStream
的另一个构造函数以追加模式打开文件:

FileOutputStream(文件,布尔追加)


newfileoutputstream(file,true)

由于我无法发表评论,您可能无法将该文件保存回其来源的存档中(我不确定java是否支持通过编辑包含的文件来写入归档文件的内部结构,但是您可能希望尝试将文件存储到归档文件的外部,以查看问题是否来自该位置)


您在评论中发布内容的原因是您的IDE不会从编译的程序中提取资源文件,如果您希望同步内部数据,您可以使用套接字设置客户端-服务器连接,并创建一个程序,将发送到web应用的数据包中的数据写入本地文件,否则将重试g您托管的已编辑文件可能不那么复杂(或者如果您是从同一台PC部署的,您可能可以通过符号链接或硬链接逃脱)

我已经尝试了与您的代码非常相似的代码,它工作得很好, 所以我认为问题在于你选择文件路径的方式

public static void main(String[] args){

    File file = new File("./localtest.txt");

    System.out.println(file.canRead()); //true
    System.out.println(file.canWrite()); //true


    try {
        BufferedWriter out = new BufferedWriter
            (new OutputStreamWriter(new FileOutputStream(file),"UTF-8"));
        out.append("new line");
        out.append("new line 2");
        out.append("new line 3");
        out.close();
    } catch (IOException e) {
        e.printStackTrace();
    }   
}
这很有效

 PrintWriter pw= new PrintWriter(
    new BufferedWriter(new FileWriter("C:\\foo.txt")));
    pw.println("line 1");
    pw.close();

很抱歉,我忘了提到这一点,但我也试过了。首先,事实上,仍然没有任何回应或输出。只要这些都不起作用,问题可能就完全不同了。我尝试了太多不同的事情,以至于认为这是一个语法问题。简单的写作在任何形式下都不起作用,而且我没有o知道问题可能是什么吗?谢谢。确认某些代码在其他地方工作对我来说非常有价值。但是我已经能够确认我文件的路径,因此检索该文件非常有效。我不应该写回我以前找到的同一个文件和路径吗?我可以问一下你的文件是否已经存在,或者它是由您的代码创建的?它在您的目录结构中的何处结束?我尝试了完全相同的代码,但据我所知,它在这里不起作用。在我的示例中,该文件不存在,而是新创建的。如果有帮助,我倾向于使用最新的Java 7类文件.newBufferedWriter(path.get(“URL”),StandardCharsets.UTF_8,StandardOpenOption.APPEND)。请注意,StandardCharset和StandardOpenOption是枚举类,因此您可以检查可能的值。此外,使用Apache IO库使这些操作更容易是一种常见做法,因为它隐藏了文件IO操作的一些复杂性。最后,请不要忘了刷新和关闭文件。希望您能提供一些建议lp you.我想你在这里找到了一些东西。文件肯定找到了,但没有更改,或者可能它被保存到了另一个位置?我想我需要做一个计算机搜索。这实际上是最好的答案。顺便说一下,欢迎使用堆栈溢出。如果你能扩展这个答案,使它包含更多的deta,那就太好了il,我会提供给你。我的文件是从我的web应用程序的源文件夹加载的,当web应用程序打包时,它会打包到目标文件夹中。在这里,它会在web应用程序启动时被检索。只要web应用程序从未重新启动,文件就可以写入和读取。但这不会反映在我的IDE源中文件夹。如果我继续开发和部署新版本,新数据将丢失。确实如此。这里的所有答案似乎都有一个共同点,那就是我要写入的文件的目标位置需要调整。
 PrintWriter pw= new PrintWriter(
    new BufferedWriter(new FileWriter("C:\\foo.txt")));
    pw.println("line 1");
    pw.close();