文本文件被覆盖而不是保存的问题

时间:2019-03-25 02:07:10

标签: java text-files

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

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

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

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

我希望我的程序要做的是连续添加到文本文件中。如果添加另一本书,则文本文件的内容应由

组成
  

Harry Potter:JK Rowling:学术:FIC Rowl:14

     

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

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

  

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

     

///哈利·波特的书籍详细信息被覆盖

1 个答案:

答案 0 :(得分:0)

根据Javadoc

  

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

     

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

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

因此,在您的情况下,应将true作为第二个参数传递