java--输入输出流及序列化与反序列化

输入输出流

例如文件上传,文件下载;
图片上传,图片下载;
视频上传,视频下载;
我们称之为I/O流

按照方向分为输入输出流
输入输出流的标准是内存。从内存出来是输出流,进入内存是输入流
字节流:每次读写一个字节
字符流:每次读写一个字符

补充:一个字符到底是几个字节根据编码不同而不同

字符流比字节流读写速度快
但是是字符流只适用于字符的读写,而字节流比较通用
音频视频都可以转换为字节流

eclipse debug调试时F5进入 ,F6上一步
I:input 输入
O:output 输出

File类

创建文件
java--输入输出流及序列化与反序列化_第1张图片
创建文件夹
java--输入输出流及序列化与反序列化_第2张图片

FileInputStream类

InputStream 是输入流的基类
FileInputStream 是InputStream 的子类

java--输入输出流及序列化与反序列化_第3张图片

FileOutputStream类

java--输入输出流及序列化与反序列化_第4张图片
在这里插入图片描述
练习
把a.txt文件的内容写入到b.txt文件中

java--输入输出流及序列化与反序列化_第5张图片
FileInputStream和FileOutputStream可以读写任意类型的文件(图片、文本、音频、视频)
但是读和写只能每次一个字节

BufferedReader类

用来读文本,每次可以读一行
java--输入输出流及序列化与反序列化_第6张图片

BufferedWriter类

用来写入文本,每次可以写一行
java--输入输出流及序列化与反序列化_第7张图片
练习
把a.txt文本的内容写入到b.txt文本中

java--输入输出流及序列化与反序列化_第8张图片

BufferedReader和BufferedWriter不能用来读写图片

乱码

为什么出现乱码?
编码格式不一致造成的
解决:改变编码格式

序列化和反序列化

序列化:把内存中的对象以二进制的形式保存在文本中
反序列化:把文本中的对象读出来到内存中

java--输入输出流及序列化与反序列化_第9张图片

如:把学生对象序列化保存在文本中
java--输入输出流及序列化与反序列化_第10张图片
java--输入输出流及序列化与反序列化_第11张图片

异常:未序列化异常
要保存的对象对应的类一定要实现Serializable接口

java--输入输出流及序列化与反序列化_第12张图片

反序列化

java--输入输出流及序列化与反序列化_第13张图片
java--输入输出流及序列化与反序列化_第14张图片
序列化和反序列化意义:
可以永久保存对象
把对象保存在文本,即使关机重启,对象还在

练习:
要求售票的时候 ,重复的票是不可以售出的

使用序列化

Ticket.java

package xuliehuaDemo;

import java.io.Serializable;

public class Ticket implements Serializable {
	private String name;
	private String time;
	private String setNo;
	private int price;
	public Ticket() {
		super();
	}
	public Ticket(String name, String time, String setNo, int price) {
		super();
		this.name = name;
		this.time = time;
		this.setNo = setNo;
		this.price = price;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getTime() {
		return time;
	}
	public void setTime(String time) {
		this.time = time;
	}
	public String getSetNo() {
		return setNo;
	}
	public void setSetNo(String setNo) {
		this.setNo = setNo;
	}
	public int getPrice() {
		return price;
	}
	public void setPrice(int price) {
		this.price = price;
	}
	
}

Test.java

package xuliehuaDemo;


import java.util.*;
import java.io.*;
public class Test {
	public static void main(String[] args) throws Exception {
		Test  test =new Test();
		test.saveTicket();
		Scanner input = new Scanner(System.in);
		System.out.println("请输入需要购买的电影票的座位号:");
		String scan = input.next();
		Ticket ticket = new Ticket();
		ticket.setSetNo(scan);
		boolean isSell=test.isSell(ticket);
		if(!isSell) {
			System.out.println("购票失败!该票已经卖出");
		}else {
			System.out.println("购票成功");
		}
	}
	
	//1.序列化票
	//如果要卖10张票,文本要保存10个对象,怎么实现?
	public void saveTicket() throws Exception {
		
		File file = new File("D://ticket.txt");
		FileOutputStream os = new FileOutputStream(file);
		ObjectOutputStream oos = new ObjectOutputStream(os);
		
		
		ArrayList<Ticket> list = new ArrayList<Ticket>();
		
		Ticket t1 = new Ticket("唐人街探案3","2020-6-22 5:00","1",50);
		Ticket t2 = new Ticket("唐人街探案3","2020-6-22 5:00","2",50);
		Ticket t3 = new Ticket("唐人街探案3","2020-6-22 5:00","3",50);
		Ticket t4 = new Ticket("唐人街探案3","2020-6-22 5:00","4",50);
		list.add(t1);
		list.add(t2);
		list.add(t3);
		list.add(t4);
		
		oos.writeObject(list);
		oos.close();
		os.close();
	}
	
	//2.判断票是否售出
	public boolean isSell(Ticket ticket) throws Exception {
		File file = new File("D://ticket.txt");
	    FileInputStream fis = new FileInputStream(file);
		ObjectInputStream ois = new ObjectInputStream(fis);
		//读对象
		Object obj = ois.readObject();
		
		fis.close();
		ois.close();
		ArrayList<Ticket> list =(ArrayList<Ticket>)obj;
		for(int i=0;i<list.size();i++) {
			if(ticket.getSetNo().equals(list.get(i).getSetNo())) {
				return false;
			}
		}
		return true;
		
		
	}
}

你可能感兴趣的:(java基础,java)