如何在.txt文件上放置,读取和修改我的ArrayList对象?

时间:2013-09-28 12:27:22

标签: java arrays methods arraylist

这是修改后的代码, 当我运行程序时,它工作,但它不能像我预期的那样工作。我不知道为什么它不会写出我输入“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());
}


}

3 个答案:

答案 0 :(得分: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);
}

或者您可以使用传统的Java 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));
   }
}

在这种情况下,用户需要输入一个命令,如&#34;删除10&#34;从列表中删除该索引。

您可能希望实现您的方法,以便以显示元素索引的方式显示列表,以便用户可以更轻松地选择要删除的内容。例如,show list方法应该显示类似

的内容
0. Obi-wan
1. Yodah
2. Luke
3. Anakin

- 编辑2 -

为了阅读用户输入,您可能希望显示如下消息:&#34;输入命令(或键入帮助选项):&#34;。

显然,在您使用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

答案 1 :(得分:0)

在程序开始时,您将从文件重建数组列表(如果存在)。然后执行所需的所有操作,最后如果命令退出,则将内容写入文件并退出

答案 2 :(得分: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 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    输入命令:show 1. Pratik [PRATIK] 输入命令: * /

您输入文本文件的代码是正确的,并按预期工作。当用户进入show时,使用上面的函数从txt文件反序列化对象并显示它