2013-09-28 2 views
0

수정 된 코드는 프로그램을 실행할 때 작동하지만 예상대로 작동하지 않습니다. 필자는 "추가"를 입력 한 후에 입력 한 줄을 쓰지 않는 이유를 모르며 "표시"를 입력해도 아무 것도 표시하지 않습니다.어떻게 ArrayList 객체를 .txt 파일에 넣고 읽고 수정할 수 있습니까?

여기
import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.nio.charset.Charset; 
import java.nio.file.FileSystems; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.StandardOpenOption; 
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Scanner; 
import java.util.List; 

public class unfinished { 

public static void main(String[] args) throws IOException { 

    //String command; 
    //int index = 0; 

    Path path = FileSystems.getDefault().getPath("source.txt"); 
    List<String> list = loadList(path); 

    try(Scanner sc = new Scanner(System.in)){ 
    // System.out.print("Enter the Command: "); 
     String[] input = sc.nextLine().split(" "); 
     while(input.length > 0 && !input[0].equals("exit")){ 

      switch(input[0]){ 
      case "add" : addToList(input, list); break; 
      case "remove" : removeFromList(input, list); break; 
      case "show": showList(input, list); break; 
     } 
      } 
      input = sc.nextLine().split(" "); 

} 

    saveList(path, list); 

} 

정렬 내 이전 코드의 일부이며 명확 : 내가 뭔가 빠진 있습니다 것 같아, 당신은 파일에서 배열 목록을 재구성 프로그램의 시작 부분에서

/** 
Collections.sort(MenuArray); 
int i = 0; 
for (String temporary : MenuArray) { 
System.out.println(++i + ". " + temporary); 
} 
//clear 
MenuArray.clear(); 
System.out.println("All objects have been cleared !"); 
*/ 

private static void saveList(Path path, List<String> list) throws IOException { 
    // TODO Auto-generated method stub 
      Files.write(path, list, Charset.defaultCharset(), 
       StandardOpenOption.CREATE, 
       StandardOpenOption.TRUNCATE_EXISTING); 
     } 


private static void removeFromList(String[] input, List<String> list) { 
// TODO Auto-generated method stub 

} 


private static void showList(String[] input, List<String> list) { 
    // TODO Auto-generated method stub 

} 

private static void addToList(String[] input, List<String> list) { 
    // TODO Auto-generated method stub 

} 

private static List<String> loadList(Path path) throws IOException { 
    // TODO Auto-generated method stub 
      return Files.readAllLines(path, Charset.defaultCharset()); 
} 


} 
+1

어디서 붙어 있나요? 당신이 겪고있는 문제는 무엇입니까? –

+0

개체는 .txt 파일에 기록되지 않습니다. 나는 그 (것)들을 저장하고 txt 파일에서 그 (것)들을 읽거나 표시 할 필요가있다. – lawZ

+0

예, 다음 번에 같은 질문을 두 번하지 않을 것입니다 ... – lawZ

답변

2

한편으로 switch 문을 사용하여 프로그램을 실제 메뉴 프로그램으로 작성하여 단순화 할 수 있습니다. 예를 들어 :

Path path = FileSystems.getDefault().getPath("jedis.txt"); 
List<String> list = loadList(path); 

try(Scanner sc = new Scanner(System.in)){ 
    String[] input = sc.nextLine().split(" "); 
    while(input.length > 0 && !input[0].equals("exit")){ 
     switch(input[0]){ 
     case "add" : addToList(input, list); break; 
     case "show": showList(input, list); break; 
     } 
     input = sc.nextLine().split(" "); 
    } 
} 

saveList(path, list); 

공지 스캐너 (System.in)에 자원을 소모하기 때문에, 스캐너 주위에 try 문을 사용의 중요성이 더 이상 필요하지 않을 때 해당 자원을 확보하는 것이 중요하다.

이제는 메뉴의 렌더링과 동작의 논리를 구분했습니다. 이 방법은 메뉴 알고리즘이 그것에 대해서만 걱정할 수있는 반면, 모든 액션 메소드는 자체 액션에 대해 걱정할 수 있습니다. 그래서, 당신은 loadList에서 파일을 읽기에 대해 걱정할 수 있고, addToList의 목록에 새 요소를 추가하는 방법에 대한 걱정, 그리고 saveList에 저장 걱정 이제

에, 문제의 파일은 단순히 문자열을 포함하는 경우, 당신의 질문이 암시하는 것처럼 보입니다.당신은

public static List<String> loadList(Path path) throws IOException { 
    return Files.readAllLines(path, Charset.defaultCharset()); 
} 

처럼, 자바 NIO를 사용하여 읽기가 정말 간단 뭔가를 할 수 그리고 파일 등을 기록하는 것처럼 간단 할 것이다 :

public static void saveList(Path path, List<String> list) throws IOException { 
    Files.write(path, list, Charset.defaultCharset(), 
     StandardOpenOption.CREATE, 
     StandardOpenOption.TRUNCATE_EXISTING); 
} 

아니면 기존의 자바 I/O 클래스를 사용할 수 있습니다 BufferedReader 및 FileWriter 같은 다른 대답을 제안하는 것 같다.

- 편집 1--

목록에서 요소를 제거하고자한다면 글쎄, 당신이해야 할 모든 메뉴에 다른 작업을 지원하는 것입니다 :

switch(input[0]){ 
    case "add" : addToList(input, list); break; 
    case "remove" : removeFromList(input, list); break; 
    case "show": showList(input, list); break; 
} 

그리고 해당 조치 방법을 구현하십시오. 예를 들어, 그 제거 작업을 위해, 그것은이 같은 수 :

public static void removeFromList(String[] input, List<String> list){ 
    if(input.length == 2 && input[1].matches("\\d+")){ 
     int index = Integer.parseInt(input[1]); 
     if(index < list.size()){ 
     list.remove(index); 
     } else { 
     System.out.println("Invalid index: " + index); 
     } 
    } else { 
     System.out.println("Invalid input: " + Arrays.toString(input)); 
    } 
} 

이 경우 사용자가 명령처럼 입력해야 목록에서 해당 인덱스를 제거하기 위해 "10 제거".

사용자가 요소를 쉽게 선택할 수 있도록 요소의 인덱스를 표시하는 방식으로 목록을 표시하도록 메서드를 구현하고자 할 수 있습니다. 예를 들어, 표시 목록 방법은

0. Obi-wan 
1. Yodah 
2. Luke 
3. Anakin 

과 같이 표시되어야합니다 - 편집 2--

사용자 입력을 읽기 위해서는이 같은 메시지를 표시 할 수 있습니다를 "(명령을 입력 또는 옵션에 대한 도움말을 입력하십시오) : ".

분명히 사용자 입력을 읽기 전에이 내용을 sn.nextLine()으로 입력해야합니다. 두 곳에서이 작업을 수행하고 있으므로,이 코드를 한 번만 작성하면되도록이 메서드를 작성하는 것이 좋습니다. 다소 좋아요 :

이제 메뉴 코드에서이를 다시 사용할 수 있습니다.

또한 잘못된 명령을 입력하거나 도움을받을 때마다 사용자가 사용할 수있는 명령 목록을 표시하도록 메뉴를 수정해야 할 수 있습니다. showHelp() 방법에서

switch(input[0]){ 
    case "add" : addToList(input, list); break; 
    case "remove" : removeFromList(input, list); break; 
    case "show": showList(input, list); break; 
    default: showHelp(input); 
} 

당신은 아마 사용할 수있는 명령의 목록을 표시 할 것입니다. 다소 좋아요 :

Available commands: 

add <name>...........Adds the given name to the list 
remove <index>.......Removes the item in the given index 
show.................Displays all items and their indices 
help.................Displays this help 
+0

그래, 이건 정말로 도움이된다, tq Sir !! 그런 다음 문자열 인덱스로 특정 개체를 삭제하려면 어떻게해야합니까? 예를 들어 txt에는 10 개의 개체가 있고 다음 명령으로 7 번째 개체를 삭제하려고합니다. Delete 7. – lawZ

+0

와우, 정말 유용합니다 !! 실제로 알파벳 순서에 따라 객체를 정렬하고 존재하는 모든 객체를 지우는 방법은 여전히 ​​있습니다. 내 프로그램은 이미 끝났지 만, ".txt"를 구현하고 싶다. 그래서 그 부분을 고쳐서 고쳐야한다. 나는 단지 내 자신으로 시도하고 싶다. 다시 물어 보겠습니다. 아주 많이! – lawZ

+0

@lawZ 음, 정렬은'''Collections.sort''' 메소드를 사용하여 쉽게 할 수 있습니다. 당신은 단순히 목록을 전달하고 그것이 당신을 위해 그것을 정렬합니다. 그리고 목록 지우기는 목록 자체에'''clear'' 메소드를 호출하여 수행 할 수 있습니다. 그래서, 당신은 마무리에 가깝다고 생각합니다. –

0

을, 그것이 존재한다면. 그런 다음 원하는 모든 작업을 수행하고 마지막으로 명령이 종료되면 내용을 파일에 쓰고 종료하십시오.

0
package com.morgan.stanley; 

import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; 가져 오기 java.io.FileNotFoundException; import java.io.FileOutputStream; 가져 오기 java.io.IOException; 가져 오기 java.io.ObjectInputStream; 가져 오기 java.io.ObjectOutputStream; 가져 오기 java.util.ArrayList; import java.util.List; 가져 오기 java.util.Scanner;

공용 클래스 미완성 {

public static void main(String[] args) { 

    String command; 
    int index = 0; 

    Scanner input = new Scanner(System.in); 
    ArrayList<String> MenuArray = new ArrayList<String>(); 

    boolean out = false; 

    while (!out) { 
     System.out.print("Enter the Command: "); 

     command = input.nextLine(); 
     if (command.startsWith("add ")) { 
      MenuArray.add(command.substring(4)); 
      index++; 

      try { 
       FileOutputStream fos = new FileOutputStream(new File("output.txt")); 
       ObjectOutputStream oos = new ObjectOutputStream(fos); 
       oos.writeObject(MenuArray); // write MenuArray to 
              // ObjectOutputStream 
       oos.close(); 
      } catch (Exception ex) { 
       ex.printStackTrace(); 
      } 

     } 

     else if (command.startsWith("show")) { 
      int i = 0; 

      for (String temporary : MenuArray) { 
       System.out.println(++i + ". " + temporary); 
      } 
      showContents("output.txt"); 

     } 

     else if (command.startsWith("exit")) { 
      out = true; 
     } 

     else { 
      System.out.println("Wrong Command !"); 
     } 
    } 

    System.out.println("Done ! Exit"); 

} 

private static String readFile(BufferedReader reader) { 
    // TODO Auto-generated method stub 
    return null; 
} 

private static void showContents(String string) { 
    try { 
     List<String> results = new ArrayList<String>(); 
     FileInputStream fis = new FileInputStream(new File("output.txt")); 
     ObjectInputStream ois = new ObjectInputStream(fis); 
     results = (ArrayList)ois.readObject(); 
     System.out.println(results); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 

} /* 명령을 입력 : 입력 명령을 Pratik 을 추가 보여 1 Pratik [Pratik] 입력 명령 : */

텍스트 파일에 대한 witing 코드가 정확하고 예상대로 작동합니다. 사용자가 show를 입력하면 위의 함수를 사용하여 txt 파일에서 객체를 비 직렬화하고 표시합니다.

+0

괜찮습니까? 코드를 어디에 넣어야합니까? 왜냐하면 내가 진짜로 얻지 못하는 오류가 있기 때문이야. – lawZ

+0

show coomand에 대해 else 행에서 주석 처리 된 행을 제거하고 메소드를 호출하기 위해 행을 추가하십시오. showContent ("output.txt") –

+1

죄송합니다. 이미 메소드를 추가했으나 목록의 유형이 일 때 오류가 발생했습니다. . 매개 변수가 맞지 않는 것 같습니다. – lawZ

관련 문제