如何在java里长期存储数据 不要数据库的那种
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在java里长期存储数据 不要数据库的那种相关的知识,希望对你有一定的参考价值。
长期存储数据,即把数据(如内存中的)保存到可永久保存的存储设备中(如硬盘、U盘),也就是人们常说的持久化。
常用持久化的方案有数据库、XML文件和文件存储。
数据库是按照数据结构来存储和管理数据的仓库,后文不再做详细介绍。
XML是可扩展标记语言,最早是为了简化Internet的文档数据传输,它提供统一的语法格式来描述数据的结构,通常XML文件用于一些少量且无特殊类型要求的文本存储。示例代码使用W3C标准的接口生成XML:
import java.io.PrintWriter;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class $
public static void main(String[] args) throws Exception
Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
//创建根节点为students的XML文件
Element students = document.createElement("students");
document.appendChild(students);
//在根节点下创建一个子节点学生
Element student = document.createElement("student");
students.appendChild(student);
//创建节点学生姓名,值为张三
Element name = document.createElement("name");
name.appendChild(document.createTextNode("张三"));
student.appendChild(name);
//创建节点学生年龄,值为18
Element age = document.createElement("age");
age.appendChild(document.createTextNode("18"));
student.appendChild(age);
//创建节点学生编号,值为150101
Element number = document.createElement("number");
number.appendChild(document.createTextNode("150101"));
student.appendChild(number);
//在根节点下创建第二个子节点学生
student = document.createElement("student");
students.appendChild(student);
//创建节点学生姓名,值为李四
name = document.createElement("name");
name.appendChild(document.createTextNode("李四"));
student.appendChild(name);
//创建节点学生年龄,值为20
age = document.createElement("age");
age.appendChild(document.createTextNode("20"));
student.appendChild(age);
//创建节点学生编号,值为150102
number = document.createElement("number");
number.appendChild(document.createTextNode("150102"));
student.appendChild(number);
//将XML文件保存到硬盘
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.ENCODING, "utf-8");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
PrintWriter writer = new PrintWriter(new FileOutputStream("/home/test.xml"));
transformer.transform(new DOMSource(document), new StreamResult(writer));
无论是数据库还是XML文件,它们都使用了能让数据快速方便进出的标准规范。其它文件如propeties、json,都可以使用类似XML的方式来打包数据,然后通过Java丰富的io流接口保存到磁盘中。
第二个就是JVM存在的时间一样长了,但是这个灰常占用内存,在变量前面加上static,
第三种方法定义在接口里面
第四个方法。。。。 参考技术B 可以用dom4j,生成对应xml文件来存储.就看用什么样的格式了追问
有完成的么
参考技术C 把内容写到各种本地文件需要用的时候,再从本地文件读取就可以了追问
有完成的么
参考技术D 1、建立map文件 类似索引文件2、hive hbase
3、保存txt.使用io读取数据,可以建立索引
4、readis 实现持久化
[转载]Class文件在JVM中如何存储
参考技术A JDK6 HotSpot VM用instanceKlass来记录类的元数据,每个Java类有一个对应的instanceKlass。每个instanceKlass上引用着一个constantPoolOopDesc对象,然后间接引用着一个constantPoolCacheOopDesc对象。前者跟Class文件里记录的常量池的结构类似,而后者是为了让解释器运行得更高效的一个缓存。
举例的话,用VisualVM里的 SA Plugin 来演示,java.lang.String的状况。
这里我用JDK 7的一个预览版,build 96来运行VisualVM 1.3和一个groovysh,并且用VisualVM里的SA Plugin来观察groovysh的运行状态:
图1:java.lang.String对应的一个instanceKlass
留意到instanceKlass里有个_constants字段,引用着一个constantPoolOopDesc对象(后面简称constantPool对象)。
图2:观察constantPool对象的内容:
留意到它是一个类似数组的对象,里面有_length字段描述常量池内容的个数,后面就是常量池项了。
各个类型的常量是混在一起放在常量池里的,跟Class文件里的基本上一样。
最不同的是在这个运行时常量池里,symbol是在类之间共享的;而在Class文件的常量池里每个Class文件都有自己的一份symbol内容,没共享。
图3:观察constantPool里其中一个Utf8常量的内容:
这张图的关注点是位于0x180188a8的一个symbol对象(内容是"intern"),它的结构跟数组类似,有_length来记录长度,后面是UTF-8编码的字节。
这些Utf8常量在HotSpot VM里以symbolOopDesc对象(下面简称symbol对象)来表现;它们可以通过一个全局的SymbolTable对象找到。注意:constantPool对象并不“包含”这些symbol对象,而只是引用着它们而已;或者说,constantPool对象只存了对symbol对象的引用,而没有存它们的内容。
让我们来看看原本的Class文件里内容是怎样的:
再对比图2看看,是不是正好对应上的?
图2里constantPool的第一个常量池项的内容是:
这个26738818数字是怎么来的呢?
实际上是:26738818 = 408 << 16 | 130
而原本Class文件里常量池的第一项内容正是#130.#408,也就是由一个Class_index和一个NameAndType_index组成的Methodref。
图2里还有个细节,可以看到原本Class文件里常量池第7项是一个Class,但在图2里显示的是一个“UnresolvedClass”。这正是动态类加载/链接的一个表现。这个项所指向的Class还没被String里的方法使用过,所以还没跟String链接起来,所以这里看到是unresolved。
我们可以故意在那个groovysh里执行一句:
这样会引发String.charAt()方法执行的过程中抛出一个java.lang.StringIndexOutOfBoundsException异常,那么就必须要完成链接的步骤。
然后再去看看String的常量池的样子:
就可以看到常量池的第7项已经解析(resolve)好了,从原本的符号引用变成了一个直接引用。
在JDK7以后的更新版中,HotSpot VM会逐渐去除PermGen,原本一些放在GC堆里的元数据会搬到GC管理之外的堆空间里。所以上面描述的实现会有些变化。具体会变成怎样还没真相。
至于其它JVM,其实运行时常量池想怎么组织都可以的,反正Java层面上看不出来JVM内部组织这些元数据的方式的差异。
原文地址: https://hllvm-group.iteye.com/group/topic/26412#post-187861
以上是关于如何在java里长期存储数据 不要数据库的那种的主要内容,如果未能解决你的问题,请参考以下文章
如何将BigQuery数据移动到长期存储?或者只是在90天后自动标记为? [关闭]
最近几天一直在搞Mybatis调用存储过程的问题,用<select>标签写的那种!然后用Java里写调用函数
如何在 NSMutableArray* 或 NSMutableDictionary* 中存储“int”值?以整数形式出现的 JSON 数据的长期问题。