存储名称和其他信息

时间:2009-09-12 12:33:14

标签: java

我正在创建一个监狱系统,我需要存储名称,因为我需要在其中一种方法中打印出所有囚犯信息。我想让它记住并存储姓名,身份证和犯罪等信息。我该怎么做呢?

关于发布的答案,我不认为它需要是复杂的东西,因为我还没有学习任何这个任务。我想要的是我的程序在提示输入信息后打印出囚犯ID,姓名,开始和结束日期,犯罪只需一次运行。

输入/输出

新囚犯 输入名字: 输入犯罪: 输入名字: 输入犯罪:

囚犯信息 (姓名)承诺(犯罪) (姓名)已犯(犯罪)

5 个答案:

答案 0 :(得分:2)

简短的回答是“数据库”。

你的问题表明以下情况可能是压倒性的,但是read about "Macto,"一个端点到端的样本Ayende Rahein一直在撰写文章可能值得一些努力。

答案 1 :(得分:2)

关于您是否只想在程序运行时将囚犯详细信息存储在内存中,或者您是否希望将囚犯留在磁盘上,以便关闭程序时,您没有特别清楚并在下次启动时再次加载它们。

如果是前者,您可以将囚犯存储在数组或列表中。例如,假设您的囚犯类看起来像这样:

public class Prisoner {

    private String name;
    private String crime;

    public Prisoner(String name, String crime) {
        this.name = name;
        this.crime = crime;
    }

    public String getName() {
        return name;
    }

    public String getCrime() {
        return crime;
    }

}

然后您可以将囚犯存放在列表中......

List<Prisoner> prisoners = new LinkedList<Prisoner>();
prisoners.add(new Prisoner("Bob", "Murder"));
prisoners.add(new Prisoner("John", "Fraud"));

...然后遍历列表并打印详细信息......

for(Prisoner p : prisoners) {
    System.out.println(p.getName() + " committed " + p.getCrime());
}

如果你正在寻找一种方法来在计划的运行之间保持囚犯的细节,那么有许多可能的方法,其中大多数已经提到过。在大多数情况下,数据库是存储记录的最佳解决方案,JDBC是连接数据库和与数据库交互的最简单方法。

为简单起见,我建议将详细信息存储在CSV(逗号分隔值)文件中。 CSV文件只是一个纯文本文件,它将每条记录存储在一个新行上,并用逗号分隔每个字段。例如:

Bob, Murder
John, Fraud

有许多CSV读取库(参见here),但它很容易阅读+写入没有外部库的CSV文件。以下是一个例子:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;


public class PrisonerStore {

    /**
     * The file the prisoners are stored in
     */
    private File store;

    public PrisonerStore(File store) {
        this.store = store;
    }

    /**
     * Saves the specified prisoner to the file
     * @param prisoner
     */
    public void savePrisoner(Prisoner prisoner) throws IOException {
        BufferedWriter writer = new BufferedWriter(new FileWriter(store, true));
        writer.write(prisoner.getName() + "," + prisoner.getCrime());
        writer.newLine();
        writer.close();
    }

    /**
     * Reads all prisoners from the file and returns a list of prisoners
     * @return
     */
    public List<Prisoner> loadPrisoners() throws IOException{
        List<Prisoner> prisoners = new LinkedList<Prisoner>();

        BufferedReader br = new BufferedReader(new FileReader(store));

        //Read each line of the file and create a Prisoner object from it
        String line = null;
        while((line = br.readLine()) != null) {
            String[] parts = line.split(",");
            Prisoner p = new Prisoner(parts[0], parts[1]);
            prisoners.add(p);
        }

        br.close();

        return prisoners;
    }
}

在您的代码中,您可以执行以下操作:

PrisonerStore store = new PrisonerStore(new File("C:\\myFile.csv"));
Prisoner p1 = new Prisoner("Bob", "Murder");
Prisoner p2 = new Prisoner("John", "Fraud");

try {
    store.savePrisoner(p1);
    store.savePrisoner(p2);

    List<Prisoner> list = store.loadPrisoners();
    for(Prisoner p : list) {
        System.out.println(p.getName() + " committed " + p.getCrime());
    }

} catch (IOException e) {
    System.out.println("Error storing prisoners");
}

答案 2 :(得分:1)

如果这些信息需要持续超出VM的生命周期,则必须将它们写在物理存储上(实际上,持久性是允许从物理存储传递到内存表示的机制)。

为此目的有几种解决方案:

序列化是Java内置的持久性机制,但非常脆弱。普遍性是基于序列化但我没有经验,我不确定它是否解决了序列化的弱点。 XML序列化非常有趣并且很快就可以实现,特别是对于像XSteam这样的库。最后,数据库是最“标准”的解决方案,但引入了一些复杂性。根据您的需要,直接使用JDBCJPA进行数据访问。

我的建议:如果您不需要数据库,请转到XML序列化并使用XStream。请参阅XStream网站上的Two Minute Tutorial以开始使用。如果您根本不需要持久性(超出VM的生命周期),只需将囚犯存储在列表中。

答案 3 :(得分:0)

您想要商店信息在哪里? 如果您想在程序(内存)中存储信息,可以使用静态成员变量,如下所示:

// Prisoner.java
class Prisoner {
 public String Name;
 public int Age;
}

// Prisoners.java
class Prisoners {
 public static Prisoner[] GetAll() {
  Prisoner[] _data;
  // Load from database to _data;
  return _data;
 }
}

// test.java
class test() {
 public static void out() {
  System.out.println(main.allPrisoner.getLength());
 }
}

// main.java

public class main{
 public static Prisoner[] allPrisoner; 

 public static main(String args[]){
  public allPrisoner = Prisoners.GetAll();
  // From now all prisoners will be stored in program memory until you close it
 }
}

因此,如果您是Web开发,则可以使用WebCache

答案 4 :(得分:0)

如果您要使用数据库,可以从Hibernate开始。它是一个java库,可以为关系数据库表映射提供java对象。

如果要使用对象序列化例程持久保存到文件系统,我建议XStream序列化XML或JSON文本。

根据问题的添加文字,我建议看一下XStream,因为如果你需要将数据结构放到磁盘上的文件中,它就会非常简单。但是,更基本的......

您可能只需要制作一个具有囚犯所需材料的囚犯类,例如姓名,标识符等等。

public class Prisoner
{
   private String name;
   private int identifier;

   public Prisoner(String aName, int anId)
   {
      name = aName;
      identifier = anId;
   }   

   public String toString()
   {
      return "Prisoner[ name = " + name + ", id = " + identifier + " ]";
   }
}

然后,您可以将它们存储在Map<String, Prisoner>中,以便更轻松地找到它们。

Map<String, Prisoner> prisonMap = new HashMap<String, Prisoner>();

要从命令行输入,您可能需要使用System.in Sun提供了一个很好的tutorial for it

如果您只想在命令行上将它们打印出来,您将遍历Map的键集并获取每个值或只是迭代值,只需使用System.out.println()将它们打印出来。

for(Prisoner p : prisonMap.values())
{
   System.out.println(p);
}

或者,使用XStream打印XML to file或System.out流。