1.持久化的手段
序列化
文件
properties
xml
数据库
2.如何将对象序列化
创建类-实现Serializable
使用序列化流实现序列化和逆序列化
3.xml与properties的比较
xml properties
使用标签 使用键值对
适合于存储有层次的属性信息 适合存储单纯的以键值对存在的信息
Properties
特点:以键值对的形式存储数据
name=zhangsan
age=20
sex=Male
xml
特点:以标签形式存储数据
<books>
<book>
<name>三国演义</name>
<age>400</age>
</book>
<book>
<name>红楼梦</name>
<age>401</age>
</book>
</books>
区别:
Properties存储的是单层的属性信息
xml存储的是多层的信息.
4.判断对错
outputStream = new FileOutputStream("t");
while(true){
outputStream.write("hello");
outputStream.flush();
}
错误:以为字节流不能直接接收字符串,需要先转化成字节数组
5.判断对错
outputStream = new FileOutputStream("t");
outputStream.write("hello".getBytes());
outputStream.close();
outputStream.write("hello".getBytes());
错误:当流被关闭之后,不能在进行操作.
案例:
老师从控制台录入学员信息,每行数据代表一个学员信息
具体输入格式是:
第一次输入
name:zhangsan;age:34;sex:Male
第二次
age:28;name:lisi;sex:FeMale
第三次
sex:Male;name:wangwu;age:31
要求:
1.将读取的数据放入List<Person>
2.将List进行序列化到工程下的file/source.txt,并反序列化测试
3.找到姓名是zhangsan的人,并将所有数据以key-value形式存入file/zhang.properties文件
4.读取内容,将年龄修改成40并再次写入.properties文件.
mport java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import java.util.Properties;
/*
分析:
标准输入流 System.in
集合--list
字符串切割
序列化/反序列化
Properties
File
FileInputStream
FileOutputStream
*/
public class test {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//1.将读取的数据放入List<Person>
List<Preson> list =getData2();
System.out.println(list);
//2.将List进行序列化到工程下的file/source.txt,并反序列化测试
//序列化
writePerson(list);
//反序列化
List<Preson> list1=readPreson();
System.out.println("反序列化后的list:" +list1);
//3.找到姓名是zhangsan的人,并将所有数据以key-value形式存入file/zhang.properties文件
//4.读取内容,将年龄修改成40并再次写入.properties文件.
changePro();
}
//1.将读取的数据放入List<Person>
//第一种直接使用标准输入流
public static List<Preson> getData1() throws IOException {
//创建List保存获取数据
List<Preson> list = new ArrayList<>();
//从控制台读取数据
//System.in:标准输入流
//"标准"输入流。此流已打开并准备提供输入数据。通常,此流对应于键盘输入或者由主机环境或用户指定的另一个输入源。
/*
//通过setIn将标准输入流的输入源改成了hell.txt
//输入源:数据的来源
//输出源:数据的去处
//System.setIn(new FileInputStream("hell.txt"));
*/
//System.out:标准输出流
InputStream inputStream = System.in;
/*
//从键盘接受数据---阻塞式方法
int num=inputStream.read();
*/
//实现从控制台一次接受一行数据:
StringBuffer stringBuffer=new StringBuffer();
while(true){
int num=inputStream.read();
//在windows中换行符认为是\r\n
if (num=='\r'){
continue;
}else if (num=='\n'){//读完一行时
//当我们输入over是,认为输入结束
if (stringBuffer.toString().equals("over")){
break;
}
//将当前
list.add(new Preson(stringBuffer.toString()));
stringBuffer.delete(0,stringBuffer.length());
}else {
stringBuffer.append((char)num);
}
}
return list;
}
//第二种借助转换流去使用字符缓冲流readLine
//虽然我们字符缓冲流是通过标准输入字节流转换过来的,但是由于它本身也是字符流,所以不嫩归队文本之外的数据进行处理
public static List<Preson> getData2(){
List<Preson> list = new ArrayList<>();
//获取字符转换流
try(BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(System.in));) {
String data=null;
while((data=bufferedReader.readLine())!=null){
if (data.equals("over")){
break;
}
list.add(new Preson(data));
}
} catch (IOException e) {
e.printStackTrace();
}
return list;
}
static enum Gender {
Male, FeMale
}
static class Preson implements Serializable{
// generated:由编译器自动生成的,后面加L表示long型
private static final long serialVersionUID=-123453465643445L;
private String name;
private int age;
Gender gender;
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 Gender getGender() {
return gender;
}
public void setGender(Gender gender) {
this.gender = gender;
}
public Preson(String name, int age, Gender gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
@Override
public String toString() {
return "Preson{" +
"name='" + name + '\'' +
", age=" + age +
", gender=" + gender +
'}';
}
public Preson(String str) {
//切第一刀:;
String[] strs = str.split(";");
for (String string : strs) {
String[] pair = string.split(":");
//去空格
String key = pair[0].trim();
String value = pair[1].trim();
//正则表达式
if (key.equals("name")) {
this.name = value;
} else if (key.equals("age")) {
this.age = Integer.parseInt(value);
} else if (key.equals("sex")) {
if (value.equals("Male")){
this.gender=Gender.Male;
}else {
this.gender=Gender.FeMale;
}
}
}
}
}
//2.将List进行序列化到工程下的file/source.txt,并反序列化测试
//序列化
public static void writePerson(List<Preson> list) throws IOException {
ObjectOutputStream objectOutputStream=new ObjectOutputStream(new FileOutputStream(getUrl("source.txt")));
objectOutputStream.writeObject(list);
objectOutputStream.close();
}
//反序列化
public static List<Preson> readPreson() throws IOException, ClassNotFoundException {
ObjectInputStream objectInputStream=new ObjectInputStream(new FileInputStream(getUrl("source.txt")));
return (List<Preson>) objectInputStream.readObject();
}
//创建file目录
public static String getUrl(String fileName) throws IOException {
String url="E:\\src\\Moning\\file";
File file=new File(url);
if (!file.exists()){
file.mkdir();
}
return url+"\\"+fileName;
}
//3.找到姓名是zhangsan的人,并将所有数据以key-value形式存入file/zhang.properties文件
public static void writeToPro(List<Preson> list) throws IOException {
Properties properties=new Properties();
for (Preson preson : list) {
if (preson.name.equals("zhangsan")){
properties.setProperty("name",preson.name);
properties.setProperty("age",preson.age+"");
if (preson.gender==Gender.Male){
properties.setProperty("sex","Male");
}else{
properties.setProperty("sex","FeMale");
}
}
}
//通过Properties 的store方法将数据写入zhang.properties 文件
properties.store(new FileWriter("0607/file/zhang.properties"),"save张三的信息");
}
//4.读取内容,将年龄修改成40并再次写入.properties文件.
public static void changePro() throws IOException {
Properties properties =new Properties();
properties.load(new FileReader("0607/file/zhang.properties"));
//修改内容
properties.setProperty("age",40+"");
//写回zhang.properties
properties.store(new FileWriter("0607/file/zhang.properties"),"将zhang的年龄修改成了40");
properties.list(System.out);
}
}