我正在创建一个监狱系统,我需要存储名称,因为我需要在其中一种方法中打印出所有囚犯信息。我想让它记住并存储姓名,身份证和犯罪等信息。我该怎么做呢?
关于发布的答案,我不认为它需要是复杂的东西,因为我还没有学习任何这个任务。我想要的是我的程序在提示输入信息后打印出囚犯ID,姓名,开始和结束日期,犯罪只需一次运行。
输入/输出
新囚犯 输入名字: 输入犯罪: 输入名字: 输入犯罪:
囚犯信息 (姓名)承诺(犯罪) (姓名)已犯(犯罪)
答案 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这样的库。最后,数据库是最“标准”的解决方案,但引入了一些复杂性。根据您的需要,直接使用JDBC或JPA进行数据访问。
我的建议:如果您不需要数据库,请转到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流。