所以我制作了一个简单的文本数据库系统来存储一个对象列表,因为我讨厌使用其他的数据库程序。但我只是想知道你们认为我能做些什么来使这个更快,更少的资源密集。
package com.gmail.welsar55.WDB;
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.io.PrintWriter;
import java.util.ArrayList;
public class Managing {
public static String mime = "wtdb";
public static boolean addObject(File file, Object object) throws IOException
{
if(file.getName().endsWith(mime))
{
PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file, true)));
pw.println(object.toString());
pw.close();
return true;
}
else
{
return false;
}
}
public static boolean containsObject(File file, Object object) throws IOException
{
if(file.getName().endsWith(mime))
{
BufferedReader br = new BufferedReader(new FileReader(file));
boolean IsGood = false;
while(br.ready())
{
String line = br.readLine();
if(line.trim().equals(object.toString()))
{
IsGood = true;
}
}
br.close();
return IsGood;
}
else
{
return false;
}
}
public static boolean removeObject(File file, Object object) throws IOException
{
if(file.getName().endsWith(mime))
{
BufferedReader br = new BufferedReader(new FileReader(file));
boolean IsGood = false;
ArrayList<String> linestoadd = new ArrayList<String>();
while(br.ready())
{
String line = br.readLine();
if(!line.trim().equals(object.toString()))
{
linestoadd.add(line.trim());
}
else
{
IsGood = true;
}
}
br.close();
BufferedWriter fileclearer = new BufferedWriter(new FileWriter(file));
fileclearer.write("");
fileclearer.close();
PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file, true)));
for(String linetoadd : linestoadd)
{
pw.println(linetoadd);
}
pw.close();
return IsGood;
}
else
{
return false;
}
}
public static ArrayList<String> getContents(File file) throws IOException
{
ArrayList<String> contents = new ArrayList<String>();
if(file.getName().endsWith(mime))
{
BufferedReader br = new BufferedReader(new FileReader(file));
while(br.ready())
{
contents.add(br.readLine());
}
br.close();
}
return contents;
}
}发布于 2014-09-19 05:34:51
我讨厌使用其他数据库程序。
忘记这一点吧!数据库程序员正在努力解决那些你还不明白的问题。每次读取文件都是性能上的问题,而且线程也不安全。这是一个文本“数据库”,那么为什么接受任何类型的对象呢?此数据库将任何对象写入文件,但无法将其转换回原始对象。
其他暗示:
发布于 2014-09-19 04:37:59
我讨厌使用其他数据库程序。
这不是一个好的起点。您的实现远远不能与任何数据库程序相比。
你正在做的事:
薄弱环节:
发布于 2014-09-19 20:14:00
Objects,读的是Strings。我没有办法把LolCat对象存储在你的字典里(我需要整理我的棒棒糖!)然后稍后从数据库中读取一个LolCat (我的棒棒糖不见了!)这甚至没有涵盖这样一个事实,即没有toString实现的对象的值可能从VM的一个实例到下一个实例具有不同的值。考虑编写Serializable对象,因为这将允许您在所编写的对象中读取。(注意:您需要将ObjectOutputStream包在FileWriter上。)这确实给数据库代码的使用者带来了额外的压力,但这与目前的情况并没有太大的不同,这将迫使他们编写某种parse(String s)方法,以便从DB中取回他们的LolCat。LolCat:公共字符串toString() {返回this.filename +“n”+ this.caption + "Lolz震级:“+ this.magnitude;}您的数据库将永远找不到我光荣的LolCats!您需要一些方法来确定记录的位置,而不是简单地用换行符分隔它们,或者用任何字符串来分隔它们,说实话。无论您使用什么分隔符,都可能有人在其对象的序列化中使用该分隔符(无论您是开始接受Serializable对象还是继续使用toString)。一个选项可能是创建一个索引文件,该文件跟踪数据库中记录的开始和结束位置(或开始位置和记录长度)。如果要存储记录的起始位置,这还可以提高查找记录的能力,因为您可以使用BufferedReader.skip直接跳转到所需的记录。当然,您仍然需要弄清楚如何定义索引本身。不要忘记在添加、删除和更改记录时保持索引的更新!https://codereview.stackexchange.com/questions/63318
复制相似问题