0

这是修改后的代码,当我运行程序时它可以工作,但它没有按我预期的那样工作。我不知道为什么它不会写出我在输入“add”后输入的行,而且当我输入“show”时它也没有显示任何内容。好像我可能会遗漏一些东西:

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


}
4

3 回答 3

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

请注意在扫描器周围使用 try 语句的重要性,因为扫描器会消耗资源 (System.in),因此在您不再需要该资源时释放该资源很重要。

现在,我已经将操作的逻辑与菜单的呈现分开了。这样菜单算法就可以只关心这个,而每个动作方法都可以关心它自己的动作。因此,您可以担心在 中读取文件loadList,担心将其保存在 中saveList,担心在列表中添加新元素addToList等等

现在,如果有问题的文件只包含字符串,正如您的问题所暗示的那样。你可以做一些非常简单的事情来使用 Java NIO 来阅读它,比如

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

写回文件就像这样简单:

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

或者您可以使用像 BufferedReader 和 FileWriter 这样的传统 Java I/O 类,因为其他答案似乎暗示了这一点。

-- 编辑 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(). 由于我们在两个不同的地方执行此操作,您可能更愿意为此编写一个方法,以便您只编写此代码一次。有点像:

private String[] getComnand(Scanner sc) {
   System.out.println("Enter command (or type help for options): ");
   return sc.nextLine().split(" ");
}

现在我们可以在菜单代码中重用它。

此外,您可能希望修复菜单以在用户键入错误命令或键入帮助时显示可供用户使用的命令列表。

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

在该showHelp()方法中,您可能希望显示可用命令的列表。有点像:

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
于 2013-09-28T13:18:40.847 回答
0

At the beginning of the program , you reconstruct the array list from the file, if it exists. Then do all the operation you want, finally if the command is exit, write the contents to the file and exit

于 2013-09-28T12:33:56.093 回答
0
package com.morgan.stanley;

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

public class unfinished {

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

}

} /* Enter the Command: add Pratik Enter the Command: show 1. Pratik [Pratik] Enter the Command: */

Your code for witing to the text file is correct and works as expected. When user enters show use the above function to deserialize the object from the txt file and display it

于 2013-09-28T12:44:23.817 回答