Search code examples
javafilearraylistfilewriterbufferedwriter

ArrayList and BufferedReader Note Taking Program


I have created a simple program that takes a title and a note which you enter then you have a choice to export the notes to txt file using BufferedWriter however because each note is a object which is stored in a ArrayList when storing them I iterate through a for enhanced loop it keeps duplicating each note as I iterate through all the object.

Note Class

import java.util.*;
public class Notes
{ 
    private String notes;
    private String titleOfNotes;
    Scanner input = new Scanner(System.in);

    public Notes()
    {
        titleOfNote(input);
        takeNotes(input);
    }

    public void takeNotes(Scanner x)
    {
        System.out.println("Please Enter Your Note");
        notes = x.nextLine();
    }

    public void titleOfNote(Scanner y)
    {   
        System.out.println("Please Enter Title");
        titleOfNotes = y.nextLine();
    }
    public String toString()
    {
        return "Title: " + titleOfNotes + "\t" + notes; 
    }

}

App Class //Does mostof the Work

import java.util.*;
import java.io.*;
public class App
{
    private int exit = 0; 
    private int createANote;
    private int displayTheNotes; 
    private int inputFromUser;
    public boolean haveFileBeenWritten = true;

    File file = new File("Notes.txt");

    Scanner input = new Scanner(System.in);

    ArrayList<Notes> arrayOfNotes = new ArrayList<Notes>();

    public void makeNoteObject()
    {
        arrayOfNotes.add(new Notes());  
    }

    public void displayAllTheNote(ArrayList<Notes> n)
    {
            for(Notes singleObjectOfNote : n)
            {
                System.out.println(singleObjectOfNote);
            }
    }

    public void programUI(){


        while(exit != 1)
        {   
            System.out.println("1. Create A Note");
            System.out.println("2. Display The Notes");
            System.out.println("3. Exit");
            System.out.println("4. Export to text file");
            System.out.println("Enter Your Operation");
            inputFromUser = input.nextInt();

            if(inputFromUser == 1)
            {
                makeNoteObject();
            }
            else if(inputFromUser == 2)
            {
                displayAllTheNote(arrayOfNotes);
            }
            else if(inputFromUser == 3)
            {   
                System.out.println("Exited");
                exit = 1;
            }
            else if(inputFromUser == 4)
            {
                makeATxtFileFromNotes(arrayOfNotes); 
                System.out.println("Textfile created filename: " + file.toString()); 
            }
            else
            {
                System.out.println("You Select A Invalid Command");
            }
        }
    }

    public void makeATxtFileFromNotes(ArrayList<Notes> x)
    {

        try (BufferedWriter bw = new BufferedWriter(new FileWriter(file,haveFileBeenWritten)))
        {
//Problem here!
            for(Notes singleObjectOfNotes : x)
            {
                bw.write(singleObjectOfNotes.toString());
                bw.newLine(); 
            }


        }catch(IOException e)
        {
            System.out.println("Cant Write File: " + file.toString());
            haveFileBeenWritten = false;
        }
    }

    public App()
    {
        programUI();
    }
    public static void main(String[]args)
    {
        App objectOfApp = new App();

    }
}

I am new to Java so my code my not be the best!


Solution

  • If your problem is that you only need to see current list's Notes excluding the previous', it's because of this line:

    try (BufferedWriter bw = new BufferedWriter(new FileWriter(file,haveFileBeenWritten)))
    

    By default, haveFileBeenWritten is true so based on the FileWriter API it will APPEND on the existing file Notes.txt so if you don't want that, change it to false.

    Parameters:

    file - a File object to write to

    append - if true, then bytes will be written to the end of the file rather than the beginning

    EDIT: To access List<> elements, use get().

    Example:

    int size = myList.size();
    for (int i = 0 ; i < size ; i++) {
        //...
        Notes note = myList.get(i);
        //...
    }