0

I am trying to do an exercise in the book that asks to write the contents of the array list to a text file, can someone give me some ideas on what I am doing wrong opposed to full solutions, do I need to make a method that returns a single string then write that?

import java.util.ArrayList;
import java.io.FileWriter;
import java.util.Iterator;

/**
 * A class to maintain an arbitrarily long list of notes.
 * Notes are numbered for external reference by a human user.
 * In this version, note numbers start at 0.
 * 
 * @author David J. Barnes and Michael Kolling.
 * @version 2008.03.30
 */
public class Notebook {
    // Storage for an arbitrary number of notes.
    private ArrayList<String> notes;

    /**
     * Perform any initialization that is required for the
     * notebook.
     */
    public Notebook() {
        notes = new ArrayList<String>();
    }

    /**
     * Store a new note into the notebook.
     * @param note The note to be stored.
     */
    public void storeNote(String note) {
        notes.add(note);
    }

    /**
     * @return The number of notes currently in the notebook.
     */
    public int numberOfNotes() {
        return notes.size();
    }

    /**
     * Remove a note from the notebook if it exists.
     * @param noteNumber The number of the note to be removed.
     */
    public void removeNote(int noteNumber) {
        if(noteNumber < 0) {
            // This is not a valid note number, so do nothing.
        } else if(noteNumber < numberOfNotes()) {
            // This is a valid note number.
            notes.remove(noteNumber);
        } else {
            // This is not a valid note number, so do nothing.
        }
    }

    /**
     * List all notes in the notebook.
     */
    public void listNotes() {
        for(String note : notes) {
            System.out.println(note);
        }
    }

    /**
     * 
     */
    public void writeToFile() {
        try{
            FileWriter writer = new FileWriter("file.txt");

            for(String str : notes){
                writer.write(str.toString());
            }
        }
        catch(Exception e ){
            System.out.println("some error...");
        }
    }
}

edit: the problem I am having now is that I can't get each string on a new line even if I use the writer.write('\n'), I realized I forgot the writer.close(); ;)

3
  • What happens when you create a Notebook, add some notes to it, then call your writeToFile() method? Commented Mar 29, 2009 at 15:44
  • nothing happened until i realised i missed out writer.close after the loop :p the problem i am having now is that i cant get each string on a new line even if i use the writer.write('\n') Commented Mar 29, 2009 at 15:53
  • Don't forget that depending on your platform, you may need a carriage return and/or a line feed.... Commented Mar 29, 2009 at 16:57

5 Answers 5

2

Things that look wrong to me:

  • calling toString() on a string is pure waste
  • the writer is never closed
  • notes are written in the file without any separator between them. The file might be hard to read.
Sign up to request clarification or add additional context in comments.

Comments

1

You want to have a look at closing the FileWriter on completion. Otherwise, what forces the FileWriter to complete its operation ?

Comments

1

Get the system newline property in a string variable.

String newline = System.getProperty("line.separator");

Then in the file write module append newline to the end of each line.

writer.write(str.toString() + newline);

Comments

1

Without altering your code very much...

try{
    PrintWriter writer = new PrintWriter(new FileWriter("file.txt"));

    for(String str : notes){
        writer.println(str.toString());
    }

Comments

0

You don't have any way to delimit the strings, so when you read them back in, you won't know where one string ends and the next begins. Since Java Strings are Unicode, there are very few things you could write to the file that would not legitimately be in your strings. So what I would recommend doing is to write an int representing the length of the string, and then the string so you know how much to read. Conversely, you could look into using Java's serialization methods and just serialize the whole List into a file.

But then again, I'm a database guy, and am most comfortable with PreparedStatements and ResultSets, so I'd probably just do it all as an SQLite database.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.