tags:

views:

247

answers:

5

I am trying to do an exercises in the book that asks us 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 cant get each string on a new line even if i use the writer.write('\n'), i realised i forgot the writer.close(); ;)

+1  A: 

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

Brian Agnew
+2  A: 

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.
Maurice Perry
A: 

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.

Paul Tomblin
+1  A: 

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

Deepak Singh Rawat
+1  A: 

Without altering your code very much...

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

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