【问题标题】:Why is my attempt to append text to a file not responding?为什么我尝试将文本附加到文件没有响应?
【发布时间】:2014-09-05 16:42:59
【问题描述】:

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

我用这些来获得灵感:

How to add a new line of text to an existing file in Java?

Java BufferedWriter object with 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 位于同一目录中。我在 BufferedWriter API 提供的 main 方法中添加了以下代码,位于 http://docs.oracle.com/javase/7/docs/api/java/io/BufferedWriter.html

PrintWriter out2 = new PrintWriter(
    new BufferedWriter(new FileWriter("foo.txt")));
out2.println("new Line");
out2.close();

我在这里缺少什么?为什么没有错误消息,也没有任何响应或反馈?

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

此外,此答案中的此代码也没有执行任何操作...

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
  • 里程碑导出.txt
  • 是的
  • 是的

我是否完全误解了 java 的 File-objects 的使用,以及它与 FileWriters 的使用?该文件显然是 100% 确认正确的文件。

【问题讨论】:

    标签: java file-io append bufferedwriter


    【解决方案1】:

    您应该使用FileOutputStream 的其他构造函数以附加模式打开文件:

    FileOutputStream(文件文件,布尔附加)

    即,

    new FileOutputStream(file, true)

    【讨论】:

    • 对不起,我忘了提,但我也试过了。首先实际上。仍然没有任何响应或输出。只要这些绝对不起作用,问题可能就完全不同了。我尝试了太多不同的事情,认为这是一个语法问题。以任何形式编写 sinmply 都不起作用,我不知道问题可能是什么?
    【解决方案2】:

    由于我无法发表评论,您可能不会将文件保存回它来自的存档中(我不确定 java 是否支持通过编辑包含的文件来写入存档的内部结构,但是您可能想尝试将文件存储在存档的外部,以查看问题是否来自那里)。

    您在 cmets 中发布的原因是您的 IDE 不会从已编译的程序中提取资源文件,如果您想同步内部数据,您可以使用套接字和创建一个程序,从发送到您的网络应用程序的数据包中将数据写入本地文件,否则从您托管的位置检索已编辑的文件可能不那么复杂(或者如果您从同一台 PC 部署,您可能能够摆脱符号或硬链接)

    【讨论】:

    • 我认为您在这里有所作为。该文件确实找到了,但没有更改,或者它可能被保存回另一个位置?我想我需要进行计算机搜索。
    • 这实际上是这里最好的答案。顺便说一句,欢迎来到 Stack Overflow。如果你能扩展这个答案会很好,以便它包含更多细节,我会为你提供它。我的文件是从我的 web 应用程序的源文件夹加载的,当 web-app 被打包时,它被打包到目标文件夹中。在这里它是在网络应用程序启动时检索的。只要网络应用程序从不重新启动,就可以写入和读取文件。但这不会反映在我的 IDE 的源文件夹中。如果我继续开发和部署新版本,新数据将会丢失。
    【解决方案3】:

    我已经尝试过与您的代码非常相似的代码,并且运行良好, 所以我认为问题在于您选择文件路径的方式。

    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();
        }   
    }
    

    【讨论】:

    • 谢谢。确认某些代码在其他地方工作对我来说非常有价值。
    • 我已经能够确认我的文件的路径,因此检索文件非常有效。我不应该能够写回我之前找到的相同文件和路径吗?
    • 请问您的文件是否已经存在,或者是否由您的代码创建?它最终在您的目录结构中的哪个位置?我试过完全相同的代码,但据我所知,它在这里不起作用。
    • 我的示例中不存在的文件是新创建的。如果有帮助,我倾向于使用最新的 Java 7 类 Files.newBufferedWriter(Paths.get("URL")、StandardCharsets.UTF_8、StandardOpenOption.APPEND)。请注意,StandardCharsets 和 StandardOpenOption 是枚举类,因此您可以检查可能的值。此外,使用 Apache IO 库来简化这些操作也是一种常见的做法,因为它隐藏了文件 IO 操作的一些复杂性。最后请不要忘记刷新和关闭文件。希望这些建议对您有所帮助。
    【解决方案4】:

    这行得通

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

    【讨论】:

    • 确实如此。这里所有答案似乎都有一个共同点,就是我正在写入的文件的目标位置需要调整。
    猜你喜欢
    • 2019-01-12
    • 2014-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    相关资源
    最近更新 更多