首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >简单文本DataBase

简单文本DataBase
EN

Code Review用户
提问于 2014-09-19 04:05:30
回答 4查看 13.1K关注 0票数 6

所以我制作了一个简单的文本数据库系统来存储一个对象列表,因为我讨厌使用其他的数据库程序。但我只是想知道你们认为我能做些什么来使这个更快,更少的资源密集。

代码语言:javascript
复制
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;
    }
}
EN

回答 4

Code Review用户

发布于 2014-09-19 05:34:51

我讨厌使用其他数据库程序。

忘记这一点吧!数据库程序员正在努力解决那些你还不明白的问题。每次读取文件都是性能上的问题,而且线程也不安全。这是一个文本“数据库”,那么为什么接受任何类型的对象呢?此数据库将任何对象写入文件,但无法将其转换回原始对象。

其他暗示:

  • PrintWriter是AutoCloseable,所以您应该使用Java7尝试关闭它。
  • PrintWriter有许多构造函数,因此新的PrintWriter(新的BufferedWriter(新的FileWriter(文件,真)不是最容易创建的方法。
  • 您不需要编写其他代码,因为在if分支中,代码会返回,所以没有必要。
  • 保持代码干的
  • 该类只有静态方法。java是一种面向对象的语言,在大多数情况下,您必须避免使用“静态类”。如果你是你最好的朋友之一,你首先要学习OOP范式。
票数 7
EN

Code Review用户

发布于 2014-09-19 04:37:59

我讨厌使用其他数据库程序。

这不是一个好的起点。您的实现远远不能与任何数据库程序相比。

你正在做的事:

  • 任何Java对象都被转换为(希望)一行文本
  • 您可以向文件中添加一个对象(这是有效的)
  • 您可以问文件是否包含一个对象(线性搜索)
  • 您可以删除一个对象(线性搜索+整个文件重写)

薄弱环节:

  • 搜索和移除物体的速度慢。你不可能希望处理一千多个物体。
  • 如果您处理的对象少于1000个,最好将它们全部保存在内存中,并将它们序列化/反序列化为一个文件。
  • 不能根据对象属性进行搜索。如果你有一本电话簿,你必须知道人们的电话号码才能找到他们。
票数 6
EN

Code Review用户

发布于 2014-09-19 20:14:00

  1. 你写的是Objects,读的是Strings。我没有办法把LolCat对象存储在你的字典里(我需要整理我的棒棒糖!)然后稍后从数据库中读取一个LolCat (我的棒棒糖不见了!)这甚至没有涵盖这样一个事实,即没有toString实现的对象的值可能从VM的一个实例到下一个实例具有不同的值。考虑编写Serializable对象,因为这将允许您在所编写的对象中读取。(注意:您需要将ObjectOutputStream包在FileWriter上。)这确实给数据库代码的使用者带来了额外的压力,但这与目前的情况并没有太大的不同,这将迫使他们编写某种parse(String s)方法,以便从DB中取回他们的LolCat
  2. 您的代码假设每条记录都是一行。如果我像这样写LolCat:公共字符串toString() {返回this.filename +“n”+ this.caption + "Lolz震级:“+ this.magnitude;}您的数据库将永远找不到我光荣的LolCats!您需要一些方法来确定记录的位置,而不是简单地用换行符分隔它们,或者用任何字符串来分隔它们,说实话。无论您使用什么分隔符,都可能有人在其对象的序列化中使用该分隔符(无论您是开始接受Serializable对象还是继续使用toString)。一个选项可能是创建一个索引文件,该文件跟踪数据库中记录的开始和结束位置(或开始位置和记录长度)。如果要存储记录的起始位置,这还可以提高查找记录的能力,因为您可以使用BufferedReader.skip直接跳转到所需的记录。当然,您仍然需要弄清楚如何定义索引本身。不要忘记在添加、删除和更改记录时保持索引的更新!
票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/63318

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档