0

I am working on a small library application which allows technical manuals to be stored, borrowed, returned and deleted.

Currently I have implemented a save feature to save the library contents to an external text file. I wish for this then to be loaded each time the application has started, but currently when I try and load the text file back into my application, it just prints the contents to the console.

Heres an example of what I mean:

enter image description here

Here is the save code from my Manuals class:

import java.io.*;
import java.util.Scanner;

public class Manual {

String serial;
String title;
String author;
String publicationYear;
String status;
String borrower;
String borrowDate;
String returnDate;  

Scanner userInput = new Scanner(System.in); 

/**
 * Display the Manual:
 * @return ManualInfo
 */
final String displayManual(){
    
    String ManualInfo ="\nSerial Number: ........... "+serial+ 
                    "\nTitle: ................... "+title+
                    "\nAuthor: .................. "+author+
                    "\nPublication Year: ........ "+publicationYear+
                    "\nStatus: .................. "+status+
                    "\nBorrower: ................ "+borrower+
                    "\nDate Borrowed: ........... "+borrowDate+
                    "\nReturn date: ............. "+returnDate+
                    "\n";
    return ManualInfo;  
}   

/**
 * Creates the Manual.
 */
final void createManual(){

    serial = Console.readString(Messages.enterSerialMessage, Messages.tooShortMessage, 3);
    title = Console.readString(Messages.enterTitleMessage, Messages.tooShortMessage, 2);
    author = Console.readString(Messages.enterAuthorMessage, Messages.tooShortMessage, 3);
    publicationYear = Console.readString(Messages.enterPublicationYearMessage, Messages.tooShortMessage, 4);
    
    borrower = "N/A";
    borrowDate = "N/A";
    returnDate = "N/A";
    
    status = "Available";
}   

/***
 * Runs the main part of the program and terminates if the choice is 0.
 */
public void run(){
    
    User.addUser();
    Menu.displayMenu();//Displays the main menu and ask for choice.
    
    exit:           
        while(Menu.menuChoice != 0){
            
            
            if(Menu.menuChoice == 1 && Library.ManualList.size() > 0){                      
                Library.displayManualList();
                boolean saveYesNo = Console.readYesNo("The ManualKeeper® app is able to save your current library to a '.txt' \nfile in your workspace directory.\n\nWould you like to save the current library? (Y/N):\n");
                if(saveYesNo){
                    try {
                        FileWriter fw = new FileWriter("Library.txt");
                        PrintWriter pw = new PrintWriter(fw);

                        for (int i1 = 0; i1 < Library.ManualList.size(); i1++){
                            pw.println("-------------------- Index Number: " + i1 + " --------------------");
                            pw.println(Library.ManualList.get(i1).displayManual());
                            pw.println("---------------------------------------------------------\n");
                        }
                        pw.close();
                    } catch (IOException e) {
                        System.out.println("Error! Library unable to save.");
                    }
                    System.out.println("\n\n--------------------------------------------------------------------------");
                    System.out.println("\n                              Library saved!\n");
                    System.out.println("--------------------------------------------------------------------------\n");
                }
                    else if(saveYesNo){
                        System.out.println("\n");
                }   
                Menu.displayMenu();
            }
            
            if(Menu.menuChoice == 1 && Library.ManualList.isEmpty()){
                System.out.println(Messages.addManualFirst);
                Menu.displayMenu();
            }
            if(Menu.menuChoice == 1 && Library.ManualList.size() > 0){                      
                Library.displayManualList();
                boolean saveYesNo = Console.readYesNo("The ManualKeeper® app is able to save your current library to a '.txt' \nfile in your workspace directory.\n\nWould you like to save the current library? (Y/N):\n");
                if(saveYesNo){
                    try {
                        FileWriter fw = new FileWriter("Library.txt");
                        PrintWriter pw = new PrintWriter(fw);

                        for (int i1 = 0; i1 < Library.ManualList.size(); i1++){
                            pw.println("-------------------- Index Number: " + i1 + " --------------------");
                            pw.println(Library.ManualList.get(i1).displayManual());
                            pw.println("---------------------------------------------------------\n");
                        }
                        pw.close();
                    } catch (IOException e) {
                        System.out.println("Error! Library unable to save.");
                    }
                    System.out.println("\n\n--------------------------------------------------------------------------");
                    System.out.println("\n                              Library saved!\n");
                    System.out.println("--------------------------------------------------------------------------\n");
                }
                    else if(saveYesNo){
                        System.out.println("\n");
                }   
                Menu.displayMenu();
            }
            
            if(Menu.menuChoice == 1 && Library.ManualList.isEmpty()){
                System.out.println(Messages.addManualFirst);
                Menu.displayMenu();
            }

Here is the load code from my startLibary class:

public static void main(String[] args){
    System.out.println("\n--------------------------------------------------------------------------");
    System.out.println("\n                 Welcome to the ManualKeeper® library app!");
    System.out.println("\n--------------------------------------------------------------------------\n");
    boolean loadYesNo = Console.readYesNo("The ManualKeeper® app is able to load any 'Library.txt' files found in \nyour workspace directory.\n\nWould you like to load a library? (Y/N):\n");
    if(loadYesNo){
    try {
        FileReader fr = new FileReader("Library.txt");
        BufferedReader br = new BufferedReader(fr);
        
        String str;
        while ((str = br.readLine()) != null) {
            System.out.println(str + "\n");
        }
        
        br.close();
    } catch (IOException e) {
        System.out.println("Error! File not found");
    }
    }
    
    Manual newManual = new Manual();
    newManual.run();
            
}//End of Main Method.

}

Here is the code from my "Library" class:

package library;

import java.util.ArrayList;

public class Library {  

/** The Manual choice. */
public static int ManualChoice;

static String returnManualTitle;
    
/** The status1. */
static String status1 = "Available";

/** The status2. */
static String status2 = "Borrowed"; 

/** The Manual list. */
static ArrayList<Manual> ManualList = new ArrayList<Manual>();
static ArrayList<Manual> borrowedManuals = new ArrayList<Manual>();


/**
 * Adds the Manual.
 */
static void addManual(){
    Manual newManual = new Manual(); //create new Manual object with status "Available."
    newManual.createManual();
    ManualList.add(newManual);//add the Manual to the ManualList ArrayList.
    System.out.println("\n\n--------------------------------------------------------------------------");
    System.out.println("\n                          Manual added to library!\n");
    System.out.println("--------------------------------------------------------------------------\n");
}

/**
 * Display Manual list.
 */
static void displayManualList(){
    if (ManualList.isEmpty()){//If the library is empty, it goes back to main menu and choice.
        System.out.println("-------------------------------------------------------------");
        System.out.println(Messages.empltyLibraryMessage + Messages.tryAgainMessage);
        System.out.println("-------------------------------------------------------------");
        Menu.menuChoice = 7;
        
    } else {    
        System.out.printf("\n\nHere are the Manual/s currently stored in the library:\n\n\n");
        for (int i = 0; i < ManualList.size(); i++){
            System.out.printf("-------------------- Index Number: %s --------------------\n",i);
            System.out.println(ManualList.get(i).displayManual());  
            System.out.println("---------------------------------------------------------\n");
            }
        }//End of For Loop.         
    }// End of Else Statement.          

static void displayBorrowedManuals(){
    if (ManualList.isEmpty()){//If the library is empty, it goes back to main menu and choice.
        System.out.println("-------------------------------------------------------------");
        System.out.println(Messages.empltyLibraryMessage + Messages.tryAgainMessage);
        System.out.println("-------------------------------------------------------------");
        Menu.menuChoice = 7;
        
    } else {                    
        for (int i = 0; i < borrowedManuals.size(); i++){
            System.out.printf("-------------------- Index Number: %s --------------------\n",i);
            System.out.println(borrowedManuals.get(i).displayManual()); 
            System.out.println("---------------------------------------------------------");
        }//End of For Loop.         
    }// End of Else Statement.          
}//End of if Statement.
/**
 * Borrow Manual.
 */
public static void borrowManual(){

    //register user's Manual choice.
    displayManualList();
    ManualChoice = (Console.readInteger(Messages.enterManualIndexMessage, Messages.ManualIndexNotInListMessage, 0, Library.ManualList.size() - 1));
    
    borrowLoop:
    while(Menu.menuChoice == 3){
        //Check if the Manual to be borrowed is available.
        //ManualChoice = (Console.readInteger(Messages.enterManualIndexMessage, Messages.ManualIndexNotInListMessage, 1, Library.ManualList.size()));

        if ((ManualList.get(ManualChoice).status.equalsIgnoreCase(status1)) && (ManualList.size() >= ManualChoice)){
            //Print the borrowed Manual information and change the Manual status to borrowed.
            ManualList.get(ManualChoice).status = "Borrowed";
            ManualList.get(ManualChoice).borrower = User.userName;
            ManualList.get(ManualChoice).borrowDate = "Today.";
            ManualList.get(ManualChoice).returnDate = "In two weeks.";
            //Add the borrowed Manual to the borrowedManuals arraylist:
            borrowedManuals.add(ManualList.get(ManualChoice));
            System.out.println("\n--------------------------------------------------------------------------");
            System.out.println("\n                             Manual borrowed!\n");
            System.out.println("--------------------------------------------------------------------------\n");
            break borrowLoop;
            
        }else if(ManualList.get(ManualChoice).status.equalsIgnoreCase(status2) && ManualList.size() >= ManualChoice){
            System.out.println("\n--------------------------------------------------------------------------");
            System.out.println("\n            "
                    + " The Manual you wish to borrow is already on loan.");
            System.out.println("\n--------------------------------------------------------------------------\n");
            break borrowLoop;
            
        }else if(ManualChoice > ManualList.size()-1){
            System.out.println(Messages.noSuchManualMessage);
            break borrowLoop;
        }
    if(ManualList.size() > 1){
        displayManualList();
    }
    else if(ManualList.size() == 1){
        ManualList.get(ManualChoice).status = "Borrowed";
        ManualList.get(ManualChoice).borrower = User.userName;
        ManualList.get(ManualChoice).borrowDate = "Today.";
        ManualList.get(ManualChoice).returnDate = "In two weeks.";
        borrowedManuals.add(ManualList.get(ManualChoice));
        System.out.printf("\n\nOSCAR YOU SHOULD NOT BE SEEING THIS!!!!!!!\n\n %s\n\n", ManualList.get(ManualChoice).displayManual());
        System.out.println("Please return the Manual within two weeks!\n");
        displayManualList();
        }
    }
    Menu.displayMenu();
}

/**
 * Return Manual.
 */
static void returnManual(){
    System.out.printf("\n\nHere are the Manual/s currently out on loan:\n\n");
    
    if(borrowedManuals.size() > 0){
    for (int i = 0; i < borrowedManuals.size(); i++)
        System.out.println(borrowedManuals.get(i).displayManual());
        returnManualTitle = Console.readString(Messages.enterManualSerial, Messages.tooShortMessage, 3);
    }
    
    int x = 0;
    boolean serialExistance = false;
    while (x < ManualList.size()){//Search for the Manual by title, if it exists change it's status,
                                //it's borrower and borrowDate.
        
        if (ManualList.get(x).serial.equalsIgnoreCase(returnManualTitle)){
            
            ManualList.get(x).status = "Available";
            ManualList.get(x).borrower = "N/A";
            ManualList.get(x).borrowDate = "N/A";
            ManualList.get(x).returnDate = "N/A";
            
            int p = 0;
                while (p < borrowedManuals.size()) {
                    Manual borrowed = borrowedManuals.get(p); // guessing the name of this class
                    if (borrowed.serial.equalsIgnoreCase(returnManualTitle)) {
                        borrowedManuals.remove(p);
                        break;
                    }
                    p++;
                }               
            System.out.println(Messages.successReturnMessage);
            serialExistance = true;
            
            break;//if a title is found, break out of the loop and display choice menu.
        }
        x = x+1;
    }//end of while loop.
    if(serialExistance == false){
        boolean repeatReturnManual = Console.readYesNo("\n--------------------------------------------------------------------------" + "\n\nThe Manual with the title "+"\""+returnManualTitle +"\""+ " wasn't found!"
                                                        +"\n\nDo you want to try again? (Y/N):\n");
        System.out.println("\n--------------------------------------------------------------------------");
        if(repeatReturnManual){
            returnManual();
        }
    }else if(serialExistance){
        Menu.menuChoice = 7;
    }               
}

/**
 * Removes the Manual.
 */
public static void removeManual(){
    
    if(ManualList.size() >0){
        displayManualList();
        ManualChoice = Console.readInteger(Messages.enterRemoveManualIndex ,Messages.ManualIndexNotInListMessage, 0, ManualList.size());        
        int p = 0;
        while (p < borrowedManuals.size()){//Search for the Manual by title, if it exists change it's status,
            //it's borrower and borrowDate.

            if (borrowedManuals.get(p).title.equalsIgnoreCase(returnManualTitle)){

                borrowedManuals.remove(p);
            }
        }
        ManualList.remove(ManualChoice);
        System.out.print(Messages.successRemovedManualMessages);
        Menu.menuChoice = 7;
    }               
}

/**
 * Empty library.
 */
static void emptyLibrary(){
    System.out.println("\n                                 WARNING!");
    System.out.println("\n           You have chosen to delete all Manuals in the library.\n"); 
    System.out.println("--------------------------------------------------------------------------");
    boolean emptyLibraryChoice = Console.readYesNo("\nAre you sure you wish to destroy the library? (Y/N): \n");
    System.out.println("\n--------------------------------------------------------------------------\n");
    if(emptyLibraryChoice){
        Library.ManualList.clear();
        System.out.println(Messages.successEmptyLibraryMesssage);
        System.out.println("--------------------------------------------------------------------------\n");
        Menu.menuChoice = 7;
        }
            
}

}

If anyone has an idea of how to store the saved manuals into the manuals array, please let me know. I am new to Java and have been struggling with this for some time!

2 Answers 2

1

What you store for one Manual on a "Library.txt" is one thing; how you display this to a user is another thing. - Decide on a format for Manual data on a text file and how to produce the character data from data in a Manual class. Write a method for creating a Manual object from one such line. Next, write the code for saving all Manuals in the Library and the code for recreating the saved library.

public class Manual {
    private String serial;
    private String title;
    private String author;
    //... more String fields
    public Manual( String line ){
        String[] fields = line.split( "\t" );
        serial = fields[0];
        title = fields[1];
        //... and so on for other fields
    } 
    public String asLine(){
        return String.join( "\t", serial, title, author, // more fields
                           );
    }
}

Writing:

PrintWriter pw = new PrintWriter( new File( "Library.txt" ) );
for( Manual manual: manualList ){
    pw.println( manual.asLine() );
}
pw.close();

Reading:

BufferedReader br = new BufferedReader( new FileReader(fileName) );
String str;
while ((str = br.readLine()) != null) {
    Manual manual = new Manual( str );
    manualList.add( manual );
}
br.close();

Etc. etc.

Sign up to request clarification or add additional context in comments.

12 Comments

Thanks a lot for your help, Could you give me more code to work with? I am new to java so this is quite difficult to understand :(
More code - in which direction? Did you proceed along the outline in my answer? Where else do you have difficulties?
Sorry, I tried your suggestion but I was not sure of which bits to fill in where you have left (..), I did add the additional strings but nothing else. Also, I noticed that I got an error from the "String.join( "\t" ... " line. To help I have updated my manuals class to show the variables etc
I'm adding some more code replacing some ellipses. If a field is a String, then it's always the same, though.
Where should I implement your suggestions for the writing / reading code sorry, should I remove all of my current code for save and load?
|
0

In your loop, you need to check the contents of each line and respond accordingly. This process is called "parsing". Here is an introduction: http://en.wikibooks.org/wiki/Introduction_to_Programming_Languages/Parsing

As you read line by line, you need to respond to the texts that you read and sort the lines into different data structures.

Comments

Your Answer

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

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.