首页 > 解决方案 > 文本文件被覆盖而不是保存的问题

问题描述

我有一个文本文件,我试图通过它在我的程序中写入。每当用户想要将书籍添加到图书馆目录时,书籍详细信息将保存到文本文件中。问题是我的程序成功写入文本文件,但如果我尝试添加另一本书,它只会一遍又一遍地覆盖第一行。

我有一个继承自 Book 类的 ArrayList,它包含一本书的特定属性(标题、作者、出版商等)

在我当前的程序中,我创建了一个名为bookInfo的变量,该变量存储书籍属性的 String 和 int 值,这些值来自它们各自的 jTextField。我相信它是一个“类变量”(但我可能错了)因为我将它初始化为 book 类的构造函数

Book bookInfo = new Book(bookTitle, author, publisher, brandCallNumber, numberOfCopies);

然后将此变量添加到 arrayList,并在我的程序中调用 WriteToFile() 方法。

AddBookDialog类的代码

public class AddBookDialog extends javax.swing.JDialog {

ArrayList<Book> books = new ArrayList<Book>();
/**
 * Creates new form AddBook
 */
public AddBookDialog(java.awt.Frame parent, boolean modal) {
    super(parent, modal);
    initComponents();
}

               

private void jButtonSaveToLibraryActionPerformed(java.awt.event.ActionEvent evt) {                                                     
    String bookTitle = jTextFieldTitle.getText();
    String author = jTextFieldAuthor.getText();
    String publisher = jTextFieldPublisher.getText();
    String brandCallNumber = jTextFieldBranchCallNumber.getText();
    int numberOfCopies = Integer.parseInt(jTextFieldCopies.getText());
    
    Book bookInfo = new Book(bookTitle, author, publisher, brandCallNumber, numberOfCopies);
    
    books.add(bookInfo);
    
    WriteToFile();
    this.setVisible(false);
}                                                    

private void WriteToFile()
{
    WriteFile wf = new WriteFile("BookDetails.txt");
    
    for(int i = 0; i < books.size(); i++)
    {
     Book b = books.get(i);
     String bookDetails = b.getBookTitle() + " : " + b.getAuthorName() + " : " + b.getPublisherName() + " : " + b.getBranchCallNumber() + " : " + b.getNumberOfCopies();
     
     wf.write(bookDetails);
    }
    wf.close();
}

WriteFile类的代码

public class WriteFile{
private FileOutputStream filename;

public WriteFile(String inputfilename)
{
    try
    {
        filename = new FileOutputStream(inputfilename,false);
    }
    catch (IOException e) {}
 }

 public void write(String item)
 {
    PrintStream output = new PrintStream(filename);
    output.println(item);
 }

 public void close()
 {
    try
    {
        filename.close();
    }
    catch (IOException e) {
      e.printStackTrace();
}
 }
}

我希望我的程序做的是不断添加到文本文件中。如果我添加另一本书,那么文本文件的内容应该包括

哈利波特:JK 罗琳:学术:FIC 罗琳:14

哈姆雷特:威廉莎士比亚:企鹅:FIC Shak:23

相反,当我尝试将另一本书写入文件时,它会覆盖第一行

哈姆雷特:威廉莎士比亚:企鹅:FIC Shak:23

//哈利波特的书详情被覆盖

标签: javatext-files

解决方案


根据Javadoc

公共 FileOutputStream(文件文件,布尔附加)抛出 FileNotFoundException

创建一个文件输出流以写入由指定 File 对象表示的文件。如果第二个参数为真,那么字节将被写入文件的末尾而不是开头。创建一个新的 FileDescriptor 对象来表示此文件连接。

第二个参数 ( boolean append) 用于控制是否附加到现有文件而不是覆盖它。

true所以在你的情况下,你应该作为你的第二个参数传递


推荐阅读