将文本文件数据存储到数组中

时间:2015-01-05 15:50:31

标签: java store

我正在开发一个小型图书馆应用程序,允许存储,借用,返回和删除技术手册。

目前我已实现了一项保存功能,可将库内容保存到外部文本文件中。我希望每次应用程序启动时加载它,但是当我尝试将文本文件加载回我的应用程序时,它只是将内容打印到控制台。

以下是我的意思的一个例子:

enter image description here

以下是我的Manuals类中的保存代码:

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

这是我的startLibary类的加载代码:

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.

}

以下是我&#34;图书馆&#34;的代码。类:

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

}

}

如果有人知道如何将保存的手册存储到手册数组中,请告诉我。我是Java的新手,并且已经在这方面苦苦挣扎了一段时间!

2 个答案:

答案 0 :(得分:1)

您在&#34; Library.txt&#34;上为一本手册存储的内容是一回事;如何向用户显示这是另一回事。 - 确定文本文件上手动数据的格式以及如何从手动类中的数据生成字符数据。编写一个从一个这样的行创建Manual对象的方法。接下来,编写用于保存库中所有手册的代码和用于重新创建已保存库的代码。

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

写作:

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

读:

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

等。等

答案 1 :(得分:0)

在循环中,您需要检查每一行的内容并做出相应的响应。这个过程被称为&#34;解析&#34;。以下是介绍:http://en.wikibooks.org/wiki/Introduction_to_Programming_Languages/Parsing

当您逐行阅读时,您需要回复您阅读的文本并将这些行分类为不同的数据结构。