java对象的序列化&流

对象序列化

把对象以流的形式修路到文件中保存,也叫对象的序列化
对象中包含的不仅仅是字符,使用字节流
ObjectOutputStream : 对象的序列化流
把文件中保存的对象,以流的方式读取出来,叫做读对象,也叫对象的反序列
读取的文件保存的都是字节,所以使用字节流
ObjectInputStream : 对象的反序列化
使用Object类型来接收
java.io.ObjectOutputStream extends OutputStream
ObjectOutputStream 对象的序列化流
把对象以流的方式写入到文件中进行保存
构造方法
ObjectOutputStream(OutputStream out)
创建写入指定OutputStream的ObjectOutputStream
参数
OutputStream out 字节输出流
特有的成员方法
void writerObject(Object obj) 将指定的对象写入ObjectOutPutStream
使用
创建
使用方法writerObject把对象写入文件
释放资源
类通过 java.io.Serializable接口以启用此序列化
=========================

public class ObjectFile {
	//对象的序列化
	public static void main(String[] args) throws IOException {
		ObjectOutputStream oos = new ObjectOutputStream(new 
				FileOutputStream("D:\\1907testjava\\day01\\person.txt"));
		//创建对象需要new
		oos.writeObject(new Person("张三",24));
		oos.close();//NotSerializableException没有序列化异常
	}

}
------------------------------------
 * 	对象的反序列化流
 * 	java.io.ObjectInputStream extends InputStream
 *  	ObjectInputStream:对象的反序列化流
 *  	把文件保存的对象,以流的方法读取出来使用
 * 		构造方法
 * 			ObjectInputStream(InputStream in)
 * 				创建从指定InputStream读取ObjectInputStream
 * 		参数
 * 			InputStream in
 * 		特有的成员方法
 * 			Object readObject() 从ObjectInputStream读取对象
 * 			
 * 		使用
 * 			创建,构造方法中传递字节输入流
 * 			使用方法readObject读取保存对象文件
 * 			释放资源
 * 			使用读取出来的对象打印
 * 		反序列化
 * 			必须实现Serializable	
 * 			必须存在类对应的class文件
--------------------------
public class ObjectInputStreamDemo {
	public static void main(String[] args) throws Exception {
		ObjectInputStream ois = new ObjectInputStream(new 
				FileInputStream("D:\\1907testjava\\day01\\person.txt"));
		Object o = ois.readObject();
		ois.close();
		//打印输出
		System.out.println(o);
		Person p = (Person)o;//强转一下
		System.out.println(p.getName()+p.getAge());
	}
}

-------------------------------
* 	序列化和反序列化会抛出NotSerializableException没有序列化异常
 * 	类通过 java.io.Serializable接口以启用此序列化
 * 		标记型接口
 * 		要进行序列化和反序列化的的类必须实现Serializable接口,就会给类添加一个标记
 * 		当我们进行序列化和反序列化的时候就会检测类上是否有这个标记
 * 			有就可以进行
 * 			没有就会抛出异常
 * 
 * 		static 关键字
 * 			静态优先于非静态加载到内存中(静态优先于对象加载到内存中)
 *static修饰的成员变量,不能被序列化,序列化的都是对象
 * 		transient 关键字,瞬态关键字
 * 			功能和静态差不多,但是没有静态的含义
 * 			被这个关键字休修饰的成员变量,不能被序列化
 * 
 * 		序列号每次运行都会生成新的class,修改代码会使序列化产生异常,class文件和txt文件的序列号不同
 * 			防止这种异常手动给类添加一个序列化
 * 			Serializable:
 * 				static final long serialVersionUID = 
 -------------------------------------
 //实现这个标记型接口
public class Person implements Serializable{
	//添加序列号42L,可以自己修改
	static final long serialVersionUID = 42L;
	
	private String name;
//	private static int age;//如果被static修饰,则这个age不能被序列化,读出来是0
//	private  int age;//
	private transient int age;//如果被transient修饰,则这个age不能被序列化,读出来是0
	
	public Person() {
		super();
	}
	
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	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;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
	
	
}
-------------------------------
import java.io.FileNotFoundException;
import java.io.PrintStream;

/*
 * 	打印流
 * 		java.io.PrintStream:打印流
 * 		  PrintStream为其他输出流添加了功能,使他们能够方便打印各种数据值表示形式。
 * 		只负责数据的输出,不负责数据的读取
 * 		这个流永远不会抛出IOException
 * 		有特有的方法print,println,可以输出任意类型的值
 * 	构造方法
 * 		PrintStream(File file) 输出的目的地是一个文件
 * 		PrintStream(OutputStream out) 目的地是一个字节输出流
 * 		PrintStream(String fileName) 目的地是一个文件路径
 * 	extends OutputStream
 * 		继承自父类的成员方法
 * 		如果使用继承自父类的write方法查看数据的时候会查看编码表。如果使用自己特有的方法print写数据原样输出
 * 		
 */
public class PrintFile {

	public static void main(String[] args) throws Exception {
		//打印流。
		PrintStream ps = new PrintStream("D:\\1907testjava\\day01\\print.txt");
		//使用继承自父类
		ps.write(97);//a
		ps.println(97);//97,可以输出任意类型
		ps.close();
		
	}
}
-----------------------------
import java.io.FileNotFoundException;
import java.io.PrintStream;

/*
 * 	可以改变输出语句的目的地
 * 		打印流的流向
 * 	默认在控制台输出
 * 		System类
 * 			static void setOut(PrintStream out)方法
 * 			改变输出语句的目的地为参数传递的打印流的目的地
 * 			
 */
public class PrintFile02 {

	public static void main(String[] args) throws Exception {
		System.out.println("在控制台输出");
		PrintStream ps = new PrintStream("D:\\1907testjava\\day01\\目的地.txt");
		System.setOut(ps);//改变目的地改变为打印流的目的地
		System.out.println("目的地输出");
		ps.close();
	} 
}
------------------------------
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;

/*
 * 	序列化集合
 * 		当我们想在文件中保存多个对象时
 * 		可以把对象存储到一个集合当中
 * 		对集合进行序列化和反序列化
 * 	创建集合
 * 	存储对象
 * 	创建一个序列化流
 * 	使用方法对集合进行序列化
 * 	创建一个反序列化
 * 	使用对象中的方法读取文件中保存的集合
 * 	把Object类型的集合转换为ArrayList类型
 * 	遍历集合
 * 	 释放资源	
 * 
 */
public class XuLieHuaTest {

	public static void main(String[] args) throws Exception {
		ArrayList<Person> list = new ArrayList<>();
		list.add(new Person("杨悦",18));
		list.add(new Person("张三",19));
		list.add(new Person("李四",20));
		list.add(new Person("王五",21));
		//准备流对象
		ObjectOutputStream oos = new ObjectOutputStream(new 
				FileOutputStream("D:\\1907testjava\\day01\\list.txt"));
		oos.writeObject(list);
		ObjectInputStream ois = new ObjectInputStream(new 
				FileInputStream("D:\\1907testjava\\day01\\list.txt"));
		Object o = ois.readObject();
		//把o转换为集合
		ArrayList<Person> list02 = (ArrayList<Person>)o;
		//遍历
		for (Person person : list02) {
			System.out.println(person);
		}
		ois.close();
		oos.close();
		
	}
}

=====================

转换

 * java.io.OutputStreamWriter extends Writer
 * 	  OuputStreamWriter字符通向字节的桥梁可使用指定的charset将要写入流中的字符编码成字节
 * 	  	把能看懂的变成看不懂的
 * 		继承自父类中共性的成员方法
 * 		构造方法
 * 			OutputStreamWriter(OutputStream out)
 * 				创建使用默认字符编码的OutputStreamWriter
 * 			OutputStreamWriter(OutputStream out, String charsetName)
 * 				创建使用指定字符集的OutputStreamWriter
 * 		参数:
 * 			OutputStream字节输出流,可以用来写转换之后的字节到文件中 				
 * 			charsetName指定的编码表名称,不区分大小写utf-8, UTF-8.....	
 * 		使用步骤
 * 			创建
 * 			使用对象中的方法writer,把字符转换为字节存储到缓冲区中
 * 			使用方法flush刷新
 * 			释放资源
	==========================
	public class ZhuanHuanFile {

	public static void main(String[] args) throws Exception {
//		write_utf_8();
//		write_gbk();
	}
	/*	使用转换流OutputStream写utf-8格式的文件	*/
//	private static void write_utf_8() throws Exception{
		OutputStreamWriter osw = new OutputStreamWriter(new 
//				FileOutputStream("D:\\1907testjava\\day01\\UTF_8.txt"),"utf-8");
//		//不指定默认utf-8
//		OutputStreamWriter osw = new OutputStreamWriter(new 
//				FileOutputStream("D:\\1907testjava\\day01\\UTF_8.txt"),"utf-8");
	
//		osw.write("你好");
//		osw.flush();
//		osw.close();
//	}
//	/*
//	 * 写gbk格式
//	 * 
//	 */
//	private static void write_gbk() throws Exception{
//		OutputStreamWriter osw = new OutputStreamWriter(new 
//				FileOutputStream("D:\\1907testjava\\day01\\gbk.txt"),"GBK");
//		osw.write("你好");
//		osw.flush();
//		osw.close();
//	}

}
---------------------------
 * java.io.InputStreamReader extends Readers
 * 		InputStreamReader字节流通向字符的桥梁,他指定charset读取字节并将其解码为字符
 * 			把看不懂的变成能看懂的
 * 			继承自父类的成员方法
 * 		构造方法
 * 			InputStreamReader(InputStream in)创建一个使用默认字符集的InputStreamReader
 * 			InputStreamReader(InputStream in,String charsetName)
 * 				创建一个使用指定字符集的InputStreamReader
 * 		参数
 * 			InputStream字节输入,读取文件中保存的字节
 * 			String charsetName:指定编码表名称,不区分大小写,不指定默认utf-8
 * 		使用
 * 			创建
 * 			使用
 * 			释放资源
 * 				构造方法中指定的编码表名称要和文件的编码相同否则会发生乱码
	

public class ZhuanHuanInputStreamReader {
	public static void main(String[] args) throws Exception {
		read_utf_8();
//		read_gbk();
	}
	//读取utf-8
	private static void read_utf_8() throws Exception{
		//utf-8读取不了,gbk可以,设置编码字符集 为utf-8
		//默认为gbk现在
		InputStreamReader isr =  new InputStreamReader(new 
				FileInputStream("D:\\1907testjava\\day01\\gbk.txt"),"utf-8");
		int len = 0;
		while((len = isr.read())!=-1){
			System.out.println((char)len);
		}
		isr.close();
	}
	//读取gbk
	private static void read_gbk() throws Exception{
		//编码表名称要和文件的名称相同,否则发生软吗
		InputStreamReader isr =  new InputStreamReader(new 
				FileInputStream("D:\\1907testjava\\day01\\gbk.txt"),"gbk");
		int len = 0;
		while((len = isr.read())!=-1){
			System.out.println((char)len);
		}
		isr.close();
	}
}

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;

/*
 * 	转换文件编码	
 * 		将GBK文件转换为UTF-8
 * 		查看几个字节可以看出来
 */
public class ZhuanHuanTest {

	public static void main(String[] args) throws Exception {
		InputStreamReader isr = new InputStreamReader(new 
				FileInputStream("D:\\1907testjava\\day01\\gbk.txt"),"gbk");
		OutputStreamWriter osw = new OutputStreamWriter(new 
				FileOutputStream("D:\\1907testjava\\day01\\我是uf.txt"),"utf-8");
		int len = 0;
		while((len = isr.read())!=-1){
			osw.write(len);
		}
		osw.close();
		isr.close();
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值