简谈Java中的数据
对于程序而言,数据与算法是最关键的两个部分,这两个部分支撑着整个程序的运行。在这里,我们简单聊一聊基于Java和数据打交道的那些事
保存对象的手段 – 序列化
Java序列化简介
首先抛出一个简单的定义:Java序列化是将Java对象保存为二进制字节码的过程,Java反序列化是把二进制码重新转换成Java对象的过程。
通过定义,我们不难理解,通过序列化与反序列化,我们可以将当前的对象保存,在需要的时候,可以恢复该对象
那么,通常在什么时候需要这么做呢?
第一种情况,当我们需要持久化一个Java对象的时候,就需要序列化对象,然后将其保存
第二种情况,需要把Java对象通过网络进行传输的时候。因为数据只能够以二进制的形式在网络中传输,因此需要将对象序列化成二进制数据,并在接收端将数据反序列化为原来的对象
Java序列化的实现
什么样的对象可以序列化?
1. 该类实现java.io.Serializable接口
2. 该类所有属性必须时可序列化的,如果其中的某一属性不是可序列化的,应注明其实短暂的(使用transient关键字)
关于Serializable接口
Serialzable接口内未定义任何内容,本身只起一个标注的作用,注明可序列化。
序列化
/**
* Person类对象user序列化实现
* @param person User类的对象
* @param outPath 序列化后输出路径
*/
public static void doSerial(Person person, String outPath){
try {
FileOutputStream out = new FileOutputStream(outPath);
ObjectOutputStream oos = new ObjectOutputStream(out);
oos.writeObject(person);
oos.flush();
oos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
反序列化
/**
* 反序列化Person类获取person对象
* @param inPath 序列化文件路径
* @return user
*/
public static Person deSerial(String inPath){
Person person = null;
try {
FileInputStream in = new FileInputStream(inPath);
ObjectInputStream ois = new ObjectInputStream(in);
person = (Person)ois.readObject();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return person;
}
关于ObjectOutputStream 与 ObjectInputStream
oos与ois是FileOutputStream与FileInputStream的装饰器,增加了对于目标对象序列化的实现并且将序列化的结果输出,达到持久化的目的
小结
Java序列化可以实现对象的持久化,在Java跨平台的特性下,具有一定的灵活性。但是,由于其序列化方式由Java本身实现,当我们需要在网络环境下与其他语言产生的服务进行交互时,显然是行不通的,这时,我们需要一些统一的规范来完成新的要求。
可扩展标记语言 – XML
XML 简介
- XML 指可扩展标记语言(EXtensible Markup Language)。
- XML 是一种很像HTML的标记语言。
- XML 的设计宗旨是传输数据,而不是显示数据。
- XML 标签没有被预定义。您需要自行定义标签。
- XML 被设计为具有自我描述性。
- XML 是 W3C 的推荐标准。
详情参考W3school
<?xml version="1.0" encoding="UTF-8"?>
<person id="161630321">
<name>ToMax</name>
<sex>M</sex>
<age>21</age>
<hobbies sum="3">
<item index="1">CS</item>
<item index="2">Basketball</item>
<item index="3">Guitar</item>
</hobbies>
</person>
XML解析方法和工具
XML DOM
XML Document Object Model : XML文档对象模型
定义了访问和处理XML文档的标准方法
用于 XML 的标准对象模型
用于 XML 的标准编程接口
中立于平台和语言
W3C 的标准
详情参考W3school
XPath
XPath 使用路径表达式在 XML 文档中进行导航
XPath 包含一个标准函数库
XPath 是 XSLT 中的主要元素
XPath 是一个 W3C 标准
详情参考W3school
Java对于XML的支持
Java完全支持对于XML的解析,并提供了很多解决方案,其中包括:DOM解析、SAX解析、JDOM解析、DOM4J解析,这里,我们仅讨论DOM4J这个解析方案
DOM4J是一个开源的XML解析库,用于XML,XPath,XSTL, 完全支持DOM、SAX、JAXP
dom4j的依赖
下面看一些例程
/**
* 读取xml,返回document
* @param fileName
* @return
* @throws MalformedURLException
* @throws DocumentException
*/
public static Document read(String fileName) throws MalformedURLException, DocumentException {
SAXReader reader = new SAXReader();
Document document = reader.read(new File(fileName));
return document;
}
/**
* 获取根节点
* @param doc
* @return
*/
public static Element getRootElement(Document doc){
return doc.getRootElement();
}
/**
* 通过节点参数索引节点
* @param root
* @param attrName
* @param attrValue
* @return
*/
public static Node findNodeByAttr(Element root, String attrName, String attrValue){
return root.selectSingleNode("//*[@"+attrName+"='"+attrValue+"']");
}
/**
* 通过标签名获取节点
* @param root
* @param tagName
* @return
*/
public static List<Node> findNodeByName(Element root, String tagName){
return root.selectNodes("//"+tagName);
}
/**
* 输出document,即更新xml文件
* @param document
* @param filePath
* @throws IOException
*/
public static void writeDocument(Document document,String filePath) throws IOException {
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
XMLWriter writer = new XMLWriter(new FileWriter(filePath),format);
writer.write(document);
writer.close();
}
JS 对象标记 – JSON
- JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)
- JSON 是轻量级的文本数据交换格式
- JSON 独立于语言 *
- JSON 具有自我描述性,更易理解
- JSON 是存储和交换文本信息的语法。类似 XML。
- JSON 比 XML 更小、更快,更易解析。
{
id : "161630321",
name : "ToMax",
age : 21,
sex : 'M',
hobbies : [
"CS","Basketball","Guitar"
]
}
详情参考W3school
java对于JSON的支持
依赖
下面看一些例程
/**
* person对象转json
* @param person
* @return
*/
public static JSONObject person2JSON(Person person){
JSONObject json = new JSONObject();
json.put("id",person.getId());
json.put("name",person.getName());
json.put("age",person.getAge());
json.put("sex",person.getSex());
JSONArray jArray = new JSONArray();
for (String in : person.getHobbies()){
jArray.add(in);
}
json.put("hobbies",jArray);
return json;
}
/**
* json 转 person 对象
* @param json
* @return
*/
public static Person parsePersonJson(JSONObject json){
List<String> hobbies = new ArrayList<>();
JSONArray array = json.getJSONArray("hobbies");
for (int i=0; i<array.size(); i++){
hobbies.add(array.getString(i));
}
return new Person(json.getString("id"),
json.getString("name"),
json.getInt("age"),
json.getString("sex").charAt(0),
hobbies);
}
Database – 关系型数据库
这里,我们主要谈SQL以及其一个流行的关系型数据库管理系统–MySQL
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司。MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
- Mysql是开源的,所以你不需要支付额外的费用。
- Mysql支持大型的数据库。可以处理拥有上千万条记录的大型数据库。
- MySQL使用标准的SQL数据语言形式。
- Mysql可以允许于多个系统上,并且支持多种语言。这些编程语言包括C、C++、Python、Java、Perl、PHP、Eiffel、Ruby和Tcl等。
- Mysql对PHP有很好的支持,PHP是目前最流行的Web开发语言。
- MySQL支持大型数据库,支持5000万条记录的数据仓库,32位系统表文件最大可支持4GB,64位系统支持最大的表文件为8TB。
- Mysql是可以定制的,采用了GPL协议,你可以修改源码来开发自己的Mysql系统。
详情参考菜鸟教程
Java对于SQL的支持 – JDBC
JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。
详情参考易百教程
依赖
下面看一些例程
private static String URL = "jdbc:mysql://localhost:3306/train";
private static String USER = "root";
private static String PASSWORD = "";
/**
* 测试
* @throws ClassNotFoundException
* @throws SQLException
*/
public static void test() throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM USER");
while (rs.next()){
System.out.println(rs.getString("username"));
}
}
非关系型数据库 – NOSQL
NoSQL(not only sql),指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。
NoSQL用于超大规模数据的存储。(例如谷歌或Facebook每天为他们的用户收集万亿比特的数据)。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。
详情参考菜鸟教程
这里,我们仅了解key-value数据库,其中非常典型的代表为 redis
Redis
Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。
Redis 与其他 key - value 缓存产品有以下三个特点:
- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
- Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
- Redis支持数据的备份,即master-slave模式的数据备份。
详情参考菜鸟教程
java对于redis的支持
Jedis – redis的java客户端
依赖
下面看一些例程
/**
* 插入数据
* @param value
* @param key
*/
public static void setData(String key, String value){
Jedis jedis = new Jedis("localhost");
jedis.set(key,value);
}
/**
* 获取数据
* @param value
* @param key
* @param sec
*/
public static void setData(String key, String value, int sec){
Jedis jedis = new Jedis("localhost");
jedis.set(key,value);
jedis.expire(key,sec);
}
/**
* 获取数据
* @param key
* @return
*/
public static String getData(String key){
Jedis jedis = new Jedis("localhost");
return jedis.get(key);
}
相关博客
使用Jedis操作redis 缓存
Redis客户端:Jedis
总结
持久化数据的方式有很多种,灵活的选择与数据交互的方式,可以极大地提高我们对于数据地利用率,降低数据的操作难度。