2015-01-05 5 views
0

나는 텍스트 파일에 저장되어있는 설명서를 저장할 수있는 작은 라이브러리 응용 프로그램을 작성하고 그 텍스트 파일을 다시로드합니다. 그러나 현재 사용자가 파일을로드하면 단순히 콘솔 영역 내에 텍스트가 표시되므로 배열에 라이브러리를 저장할 수 없습니다.자바 - txt 파일에서 읽기 및 배열에 저장

어떻게로드 된 library.txt 파일을 콘솔에 인쇄하지 않고 라이브러리에 저장할 수 있습니까?

: 여기
public class startLibrary { 

/** 
* The main method. 
* 
* @param args the arguments 
*/ 
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. 

필요한 전체 넣다 내 라이브러리 클래스입니다 : 여기
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(); 
      } 

내 부하 구현 내 startLibrary 클래스입니다 : 여기

은 저장 구현 내 매뉴얼 클래스
package library; 

import java.util.ArrayList; 


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

} 

}

+0

아이디어를 얻으려는 답변을 추가했습니다. 다른 해결책은 매뉴얼을 저장하는 데이터베이스입니다. – ProgrammingIsAwsome

+0

내 대답은 유익한 경우 동의하고 upvote하시기 바랍니다. 방금 파싱에 대한 아이디어를주고 싶었습니다. – ProgrammingIsAwsome

답변

1

나는 당신이 질문을 다시 게시했다고 생각합니다. 그리고 그 질문은 꽤 잘 대답했다고 생각합니다. 설명해 드리겠습니다.

라이브러리를 텍스트 파일로 저장합니다. 다음과 같이 모든 설명서를 추가하십시오 :

이제는 많은 내용을 library.txt 파일에 작성합니다. 문제 : 정보를 추출 할 수 없습니다. 해결책은 PARSING입니다. 당신이 정말로 코드를 적용해야한다는,

final String delimiterManuals = ";;;;;;;;"; 
    final String delimiterValues = "::::::::"; 

//save file 
for (int i1 = 0; i1 < Library.ManualList.size() - 1; i1++) 
{ 
    //here are all attributes 
    pw.print(Library.ManualList.get(i1).title)); 
    pw.print(delimiterValues); 
    pw.print(Library.ManualList.get(i1).author)); 
    pw.print(delimiterValues); 
    pw.print(Library.ManualList.get(i1).publicationYear)); 
    pw.print(delimiterValues); 
    pw.print(Library.ManualList.get(i1).status)); 
    pw.print(delimiterValues); 
    pw.print(Library.ManualList.get(i1).borrower)); 
    pw.print(delimiterValues); 
    pw.print(Library.ManualList.get(i1).borrowDate)); 
    pw.print(delimiterValues); 
    pw.print(Library.ManualList.get(i1).returnDate); //this is your last attribute 
    pw.print(delimiterManuals); 
} 
//WATCH: lastAttribute is just an example (because I don't want to write every attribute) 
//last Manual has no delimiterManual at the end (end of file) 
pw.print(Library.ManualList.get(Library.ManualList.size()-1).title)); 
pw.print(delimiterValues); 
pw.print(Library.ManualList.get(Library.ManualList.size()-1).author)); 
pw.print(delimiterValues); 
//other attributes of the manual... 
pw.print(Library.ManualList.get(Library.ManualList.size()-1).lastAttribute); 


ArrayList<String> a = new ArrayList<String>(); 
//load 
FileReader fr = new FileReader("Library.txt"); 
BufferedReader br = new BufferedReader(fr); 

String str; 
while ((str = br.readLine()) != null) 
{ 
    a.add(str); 
} 
ArrayList<Manual> manuals = new ArrayList<Manual>() 
for(int i = 0; i < a.size(); ++i) 
{ 
    //split into single manuals 
    String[] split1 = a.get(i).split(delimiterManuals); 
    for(int j = 0; j < split1.length; ++j) 
    { 
     //split into single values 
     String[] split2 = split1.split(delimiterValues); 
     //here you have all values of a manual in the order you saved them so: 
     Manual m = new Manual(); 
     m.title = split[0]; // <-- please don't do this! create and use setter/getter (like m.setTitle(split[0]); 
     m.author = split[1] 
     // till all fields are filled up 
     manuals.add(m); 
    } 
} 

//now you have all manuals in the manuals ArrayList 

고려하십시오 : 여기 이것은 당신이 작동 얻기 위해 적응해야 조금 코드입니다. 난 단지 당신에게 일반적인 아이디어를 파헤 치기 위해서 을주고 싶었다.

+0

답장을 보내 주셔서 감사합니다. 그러나 코드의 저장 부분을 수정했지만 "lastAttribute"가 언급되었거나 "lastAttribute를 확인할 수 없거나 필드가 아닙니다"라는 오류가 발생합니다. 또한 알리는 "ArrayList를 "라인에 오류가 "이 라인에서 여러 개의 마커가 \t - ArrayList의이 유형에 해결 될 수없는 \t - ArrayList를이 \t 형태로 해결 될 수없는 - 구문 오류가 삽입"; " 완료하려면 \t LocalVariableDeclarationStatement "올바른 위치에 해당 줄을 구현했는지 확실하지 않습니다. ( – Oscar

+0

그래서 내 대답을 편집했습니다 : 누락 된 세미콜론을 썼습니다. 그리고 lastAttribute에 대해 물론입니다. 이것은 단지 예일 뿐이므로 작성자, 제목 등 모든 속성을 사용하여이 작업을 수행해야합니다. 마지막 속성의 목적은 구분 기호를 인쇄 한 마지막 값 이후에 수동으로 INSTEAD OF de limiterValues ​​ 참고 : 파서를 작성하는 데 많은 노력과 노력이 필요합니다. 그래서 당신이 파서에 특화되어 있기 때문에 그러한 오류를 찾아야합니다. – ProgrammingIsAwsome

관련 문제