例如文件上传,文件下载;
图片上传,图片下载;
视频上传,视频下载;
我们称之为I/O流
按照方向分为输入输出流
输入输出流的标准是内存。从内存出来是输出流,进入内存是输入流
字节流:每次读写一个字节
字符流:每次读写一个字符
补充:一个字符到底是几个字节根据编码不同而不同
字符流比字节流读写速度快
但是是字符流只适用于字符的读写,而字节流比较通用
音频视频都可以转换为字节流
eclipse debug调试时F5进入 ,F6上一步
I:input 输入
O:output 输出
InputStream 是输入流的基类
FileInputStream 是InputStream 的子类
练习
把a.txt文件的内容写入到b.txt文件中
FileInputStream和FileOutputStream可以读写任意类型的文件(图片、文本、音频、视频)
但是读和写只能每次一个字节
用来写入文本,每次可以写一行
练习
把a.txt文本的内容写入到b.txt文本中
BufferedReader和BufferedWriter不能用来读写图片
为什么出现乱码?
编码格式不一致造成的
解决:改变编码格式
序列化:把内存中的对象以二进制的形式保存在文本中
反序列化:把文本中的对象读出来到内存中
异常:未序列化异常
要保存的对象对应的类一定要实现Serializable接口
反序列化
序列化和反序列化意义:
可以永久保存对象
把对象保存在文本,即使关机重启,对象还在
练习:
要求售票的时候 ,重复的票是不可以售出的
使用序列化
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;
}
}