UNICODE:
UTF-8:
@Test
public void test01() throws UnsupportedEncodingException {
String str = "我爱你中国";
byte[] bs ;
System.out.println("length:"+(bs=str.getBytes("gbk")).length+", content:"+Arrays.toString(bs)); //10, gbk中文使用双字节
System.out.println("length:"+(bs=str.getBytes("UNICODE")).length+", content:"+Arrays.toString(bs)); //12, UNICODE
System.out.println("length:"+(bs=str.getBytes("utf-8")).length+", content:"+Arrays.toString(bs)); //15
System.out.println("length:"+(bs=str.getBytes("ISO-8859-1")).length+" , content:"+Arrays.toString(bs)); //5
}
properties文件一般用来作为程序的配置文件,
例如,连接数据库时,需要知道数据库服务器的地址,用户名,密码等…
…
这些连接信息,可以存储在properties配置文件中,便于修改维护
java提供了专门的工具,来读写这种格式的数据
java.util.Properteis 类
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/yhmisdb?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
jdbc.username=root
jdbc.password=root
属性文件是纯文本类型,本质就是txt文件
#后面代表单行注释,尽量不要在属性文件中出现中文
每行都是kv结构,中间用=号分割
key不能重复,文件不报错,读取后的集合中只有最后一个的值
package cn.edut.tarena.day11;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.util.Scanner;
import org.junit.Test;
//这个类用来测试属性文件的读取
public class Test02_properties {
//单元测试方法:@Test + public +void + 无参
@Test//注解@
public void test01() throws IOException {
//0、获得当前类的目录
System.out.println(Test02_properties.class.getResource(""));
System.out.println(Test02_properties.class.getResource("/"));
//1、加载属性文件
InputStream is = Test02_properties.class.getResourceAsStream("/jdbc.properties");
// “/” 根目录
//1.1 Scanner打印到控制台
Scanner sc = new Scanner(is);
while(sc.hasNext()) {
System.out.println(sc.nextLine() );
}
//2、解析
Properties prop = new Properties();
is = Test02_properties.class.getResourceAsStream("/jdbc.properties"); // 文件回到开始位置;
prop.load(is);
//3、 获取
String name = prop.getProperty("name");
System.out.println("获取name:"+name);
String age = prop.getProperty("age");
System.out.println("获取age:"+age);
//4.关闭流
is.close();
sc.close();
}
}
可扩展标记语言<>,标准通用标记语言的子集,简称XML。
是一种用于标记电子文件使其具有结构性的标记语言。
- 开始标签和结束标签匹配,如: < s e l e c t > < / s e l e c t > <select></select>
- 标签可以嵌套,如: < s e l e c t > < s q l > < / s q l > < / s e l e c t > <select><sql></sql></select>
- 每个标签都可以设置属性,属性名和属性值用=连接,如: < s e l e c t i d = " " r e s u l t T y p e = " " > < / s e l e c t > <selectid=""resultType=""></select>
- 想要获取xml中存在的数据,通常使用Dom4j技术实现,由于是第三方的开源技术,使用时需要单独导入jar包
上面就有 < s e l e c t > < / s e l e c t > <select></select>标签,它有属性id和resultType,还有值“SELECT * FROM tb_order”。而txt文件就是全部读入。
评价:xml被后期出现的json技术所取代,所以了解会用即可,不必深究。
Dom4j,全称DOM API for Java。 是一个Java的XML API,是jdom的升级品,用来读写XML文件的。
dom4j是一个十分优秀的JavaXML API,具有性能优异、功能强大和极其易使用的特点,它的性能超过sun公司官方的dom技术,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。
在IBM developerWorks上面还可以找到一篇文章,对主流的Java XML API进行的性能、功能和易用性的评测,所以可以知道dom4j无论在哪个方面都是非常出色的。
如今可以看到越来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连Sun的JAXM也在用dom4j。
这已经是必须使用的jar包。
Dom4j是第三方开源API,利用SAXReader对象把xml数据,读取在内存中,组织成一个树状结构,再用不同对象来表示其他节点。
Document
--Element
--getRootElement()
--element()
--Attribute
一些网页的配置数据:
xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
</beans>
开发环境准备:
复制“dom4j-1.6.1.jar”进Project =》 Build Path add =》
代码:
package cn.edut.tarena.day11;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;
//这个类用来测试dom4j解析xml
public class Test03_XML {
//单元测试方法
@Test
public void test001() throws DocumentException {
//1. 加载文件
InputStream is = Test03_XML.class.getResourceAsStream("/spring.xml");
//2.解析xml
SAXReader read = new SAXReader();
Document doc = read.read(is); //读取
//获取根节点beans
Element root = doc.getRootElement(); //节点
//4. 获取beans里面的所有bean元素
List<Element> elementList = root.elements();
//查看类型
System.out.println("查看类类型:");
System.out.print(elementList.getClass());
System.out.println("是ArrayList吗? "+ (elementList instanceof ArrayList));
System.out.println(elementList.get(0).getClass());
System.out.println("\n获取节点信息:");
for(Element e :elementList ) {
System.out.println("路径:"+e.getPath());
System.out.println("id="+e.attribute("id").getText()+"\nclass="+e.attributeValue("class"));
System.out.println("------------");
}
}
}
g o o g l e \color{#4285f4}{g}\color{#ea4335}{o}\color{#fbbc05}{o}\color{#4285f4}{g}\color{#34a853}{l}\color{#ea4335}{e} google
JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。XML替代TXT一统江湖数十载,可最终也敌不过岁月,JSON出现后它的风光不在,JSON已经成为主流开发方式,雄霸世界。
后面课程中要讲的RESTFul请求访问形式其核心就是JSON,后面要讲的SpringMVC框架、京淘电商、SpringCloud微服务都离不开JSON.
这么牛,说的都想马上看看它,它真这么厉害吗?
我们JVM内部传输的是java对象
但网络间,异构系统间就无法直接传输java对象,早期j2ee体系中为支持这点,特别异构开发语言,就发布了WebService规范,其核心使用xml
但xml标签过多,与业务无关,造成网络传输时大量带宽的浪费。
这中间就出现了很多著名的转化工具类。
有谷歌的gson,有阿里的fastjson,但都不尽人意,实际使用中都有坑,大家百度自知。
目前很稳定的还是jackson json,包括SpringBoot一度整合用fastjson,最终在2.x版本时又换回来,其强大可见一般。
利用jackson就可以轻松实现Java对象与JSON字符串的转换。
那对于开发者也带来一个新的问题,如何把java对象转换为json或者把json转换为java对象呢?
Jackson中有个ObjectMapper类很是实用,用于Java对象与JSON的互换。
g o o g l e \color{#4285f4}{g}\color{#ea4335}{o}\color{#fbbc05}{o}\color{#4285f4}{g}\color{#34a853}{l}\color{#ea4335}{e} google
常用于序列化和反序列化,
序列化是指 将 程 序 中 的 j a v a 对 象 序 列 化 成 二 进 制 文 件 保 存 到 磁 盘 中 永 久 存 储 \color{#4285f4}{将程序中的java对象序列化成二进制文件保存到磁盘中永久存储} 将程序中的java对象序列化成二进制文件保存到磁盘中永久存储。
反序列化是指 将 磁 盘 存 储 的 二 进 制 文 件 解 析 成 j a v a 对 象 \color{#4285f4}{将磁盘存储的二进制文件解析成java对象} 将磁盘存储的二进制文件解析成java对象在程序中使用。
ObjectMapper.readValue(json串,对象);
ObjectMapper.writeValueAsString(对象);
/**
* 创建 Human类
* 含参构造、无参构造
* Override toString()
* get、set方法
* @author Administrator
*
*/
class Human implements Serializable{
/**
* json序列化似乎不需要Serializable接口
*/
private static final long serialVersionUID = 1L;
private String name ;
private int age ;
private String address ;
//构造方法 source -- 倒数第三个 -- ok
public Human() {};
public Human(String name, int age, String address) {
super();
this.name = name;
this.age = age;
this.address = address;
}
//默认是查看对象的地址值,如果要查看属性的值,重写toString()
//Source -- toString() -- ok
@Override
public String toString() {
return "Human [name=" + name + ", age=" + age + ", address=" + address + "]";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
@Test//序列化:从java对象变成json串 -- ObjectMapper
public void test001() throws JsonProcessingException {
System.out.println("Json实现对象序列化:");
//1. 创建Human对象
Human p1 = new Human("小明",18,"广东省广州市朝阳区新建北路");
//2.把java对象变成json
ObjectMapper mapper = new ObjectMapper();
//把指定的对象p变成json串
String json = mapper.writeValueAsString(p1);
System.out.println(json);
//3.序列化输出成文件
//要先创建文件
mapper.writeValue(new File("D:\\e\\1.txt"), json);
}
@Test
public void test002() throws IOException {
System.out.println("ObjectOutputStream实现对象序列化:");
//1. 创建Human对象
Human p1 = new Human("小明",18,"广东省广州市朝阳区新建北路");
//2. 对象序列化
ObjectOutputStream oos = new ObjectOutputStream(System.out);
oos.writeObject(p1);
}
json转化为java对象
@Test
public void test003() throws JsonParseException, JsonMappingException, IOException {
System.out.println("Json实现反序列化:");
String s = "{\"name\":\"小明\",\"age\":18,\"address\":\"广东省广州市朝阳区新建北路\"}";
ObjectMapper om = new ObjectMapper();
Human man = om.readValue(s,Human.class) ;
System.out.println(man.toString());
}
使用Json实现序列化、反序列化时,对象必须实现 public 的get、set方法。
(或者把对应的属性public)
g o o g l e \color{#4285f4}{g}\color{#ea4335}{o}\color{#fbbc05}{o}\color{#4285f4}{g}\color{#34a853}{l}\color{#ea4335}{e} google
阻塞IO,BIO 就是传统的 java.io 包,它是基于流模型实现的,交互的方式是同步、阻塞方式,也就是说在读入输入流或者输出流时,在读写动作完成之前,线程会一直阻塞在那里,它们之间的调用时可靠的线性顺序。它的有点就是代码比较简单、直观;缺点就是 IO 的效率和扩展性很低,容易成为应用性能瓶颈。
非阻塞IO,NIO,也叫new io,对比传统的同步阻塞IO操作,实际上NIO是同步非阻塞IO 。NIO 是 Java 1.4 引入的 java.nio 包,提供了 Channel、Selector、Buffer 等新的抽象,可以构建多路复用的、同步非阻塞 IO 程序,同时提供了更接近操作系统底层高性能的数据操作方式。
异步IO,AIO 是 Java 1.7 之后引入的包,是 NIO 的升级版本,提供了异步非堵塞的 IO 操作方式,所以人们叫它 AIO(Asynchronous IO),异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。但目前还不够成熟,应用不多。