Java 我无法写入已创建的文本文件

Java 我无法写入已创建的文本文件,java,filewriter,Java,Filewriter,我创建了一个带有一些标题的文本文件,然后将其关闭。之后,当我有数据要写入该文件时,什么都没有发生,我的代码就在下面,当我尝试打印到它时,我得到了堆栈跟踪 public class Writetofile { BufferedWriter writer = null; public void recordData(String record) throws IOException { try { writer.append(record

我创建了一个带有一些标题的文本文件,然后将其关闭。之后,当我有数据要写入该文件时,什么都没有发生,我的代码就在下面,当我尝试打印到它时,我得到了堆栈跟踪

public class Writetofile {

    BufferedWriter writer = null;

    public void recordData(String record) throws IOException {

        try {
            writer.append(record);
            writer.newLine();
            writer.close();
        } catch (Exception e) {e.printStackTrace();
        }
    }

    public void createtxtfile(String[] details) throws IOException {
        String machine = details[0];
        String date = details[1];
        String start_time = details[2];
        try {
            File new_cal = new File("C:\\Activity_Calibrator\\log\\" + machine + "//" + machine + ".txt");
            new_cal.getParentFile().mkdirs();
            FileWriter fwriter = new FileWriter(new_cal);
            writer = new BufferedWriter(fwriter);
            writer.append("Linear Calibration for " + machine + " carried out " + date);
            writer.newLine();
            writer.close();
        } catch (Exception e) {
        }
    }
}

Message that is recieved
java.io.IOException: Stream closed
  at java.io.BufferedWriter.ensureOpen(BufferedWriter.java:116)
  at java.io.BufferedWriter.write(BufferedWriter.java:221)
  at java.io.Writer.write(Writer.java:157)
  at java.io.Writer.append(Writer.java:227)
  at Writetofile.recordData(Writetofile.java:27)
  at UserInterFace.update(UserInterFace.java:75)
  at Comms.serialEvent(Comms.java:124)
  at gnu.io.RXTXPort.sendEvent(RXTXPort.java:732)
  at gnu.io.RXTXPort.eventLoop(Native Method)
  at gnu.io.RXTXPort$MonitorThread.run(RXTXPort.java:1575)
这是很难理解的,因为我已经读到,我应该总是在写了一个流之后关闭它

什么也没发生,我也没有出错

最好的第一步是不要接受异常-例如,您可以将堆栈跟踪打印到控制台:

} catch (Exception e) {
    e.printStackTrace();
}

然后,您将获得一条适当的异常消息,该消息将帮助您找到问题。

在这一行中,您将
“/”
添加到路径:

        File new_cal = new File("C:\\Activity_Calibrator\\log\\" + machine + "//" + machine + ".txt");
您可能想添加
“\\”


我认为这将打乱文件创建,但我不确定在没有测试的情况下具体如何。它甚至可能依赖于操作系统。请务必打印
file.getCanonicalFile()
返回的文件名。

如果没有任何异常,请至少说明其被忽略的原因。永远不要捕获异常,除非记录并重新抛出它。永远不要使用
尝试{
..
}catch(异常e){/*empty*/}
在任何代码中,即使是为了调试,因为你会忘记它一次并毁掉整个世界。好的,我已经这样做了,并且可以看到它告诉我流是关闭的,但是在我读到的每一个地方,我都被告知应该在每次写入流时关闭它。什么方法调用引发异常?另外,请检查文件名,它是您认为的吗?@hyde我认为在调试时临时使用它是可以的(或者根本不捕获它,让它传播到main)-但我同意它不适合于生产代码-不过听起来OP不会很快向广大受众发布该代码。@davidrennan一旦关闭它,就不能再对其进行编写了。因此,您可以在仍在使用它时将其保持打开状态,或者如果这会导致您将其保持长时间打开,请在需要时重新打开它。例如,见: