目录
节点流与处理流
节点流
处理流
处理流中常用类
缓冲字节流
数据流
缓冲字符流
实例问题
对象序列化-反序列化
定义
对象的输入输出流
实例
注意
节点流与处理流
● 根据封装类型不同流又分为
- 节点流
- 处理流
节点流
如果流封装的是如文件、字符串、字符串数组等, 则称为节点流。
处理流
如果流封装的是其它流对象,称为处理流。 处理流提供了额外功能
处理流中常用类
缓冲字节流
- 缓冲字节输出流 BufferedOutputStream
- 缓冲字节输入流 BufferedInputStream
FileInputStream fileInputStream = new FileInputStream("E:/file_a.txt");//缓冲字节流,内部有一个默认是8192长度的字节数组,进行一个数据缓存BufferedInputStream bufferedInputStream= new BufferedInputStream(fileInputStream);FileOutputStream fileOutputStream = new FileOutputStream("E:/file_e.txt");BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);byte [] bytes = new byte[1024];int length = 0 ;while ((length=bufferedInputStream.read(bytes))!=-1){bufferedOutputStream.write(bytes,0,length);}bufferedInputStream.close();bufferedOutputStream.flush();//刷新缓冲区,将缓冲区的内容全部写出去bufferedOutputStream.close();
数据流
- 数据输出流 DataOutputStream\
- 数据输入流 DataInputStream
/*模拟聊天,一人发消息(输出),一人接收到消息(输入)*///数据处理流//输出:String msg = "在吗?影";FileOutputStream outputStream = new FileOutputStream("E:/msg.txt");DataOutputStream outputStream1 = new DataOutputStream(outputStream);outputStream1.writeUTF(msg);outputStream1.flush();outputStream1.close();//输入FileInputStream inputStream = new FileInputStream("E:/msg.txt");DataInputStream datainputStream = new DataInputStream(inputStream);String s =datainputStream.readUTF();System.out.println(s);datainputStream.close();
缓冲字符流
- 缓冲字符输出流 BufferedWriter
- 缓冲字符输入流 BufferedReader
/*缓冲字符流;*/FileReader reader = new FileReader("E:/msg.txt");BufferedReader bufferedReader = new BufferedReader(reader);String line = "";FileWriter writer = new FileWriter("E:/msg_1.txt", true);//true 避免被覆盖BufferedWriter bufferedWriter = new BufferedWriter(writer);String line1 = "";while ((line1=bufferedReader.readLine())!= null) {bufferedWriter.write(line1);bufferedWriter.newLine();//换行}bufferedReader.close();bufferedWriter.flush();bufferedWriter.close()
实例问题
.实现用户注册,登录。
输入1 进入注册功能,输入2进入登录功能,输入3退出
用户信息:账号(account),密码(password)
(1)注册功能:输入用户账号信息,保存到文件 user.txt
文件中的内容格式为:(一个用户信息占一行)
account=123;password=123
account=321;password=123
account=456;password=123
account=789;password=123
(2)登录:输入用户的账号,密码信息,与文件中的每行用户信息比较,判断登录是否成功.
package com.wyk.java.Io.homework;import java.io.*;
import java.util.Scanner;public class User implements Serializable {private String acccount;public Scanner scanner=new Scanner(System.in);private String password;private void add( ) throws IOException {System.out.println("请注册账户");this.acccount = scanner.next();System.out.println("请设置密码");this.password = scanner.next();FileWriter fileWriter = new FileWriter("E:/user.txt",true);BufferedWriter writer = new BufferedWriter(fileWriter);writer.write("account="+this.acccount);writer.write(";password="+this.password);writer.newLine();writer.flush();writer.close();}private void Into() throws IOException {System.out.println("请输入账户");String s = scanner.next();System.out.println("请输入密码");String s1 = scanner.next();FileReader fileReader = new FileReader("E:/user.txt");BufferedReader reader = new BufferedReader(fileReader);boolean flag = true;String line = "";while ((line=reader.readLine())!=null){if ( line.equals("account="+s+";password+"+s1)) {flag = false;System.out.println("登录成功");break;}}if (flag ) {System.out.println("账号或密码错误");}reader.close();}public void app(User user) throws IOException {out:while (true){System.out.println("输入1 进入注册功能--输入2 进入登录功能--输入3 退出");int close = scanner.nextInt();switch (close){case 1:user.add();break;case 2:user.Into();break ;case 3:break out;}}}}
package com.wyk.java.Io.homework;import java.io.IOException;public class text {public static void main(String[] args) throws IOException {User user = new User();user.app(user);}
}
对象序列化-反序列化
定义
Java中的对象都在内存中储存,一旦程序运行结束,内存中的对象都会消失
有时,需要在程序停止时,将对象数据长久保存下来,下次启动程序时,继续使用
对象的输入输出流
主要的作用是用于写入对象信息与读取对象信息。 对象信息 一旦写到文件 上那么对象的信息就可以做到持久化了.
对象的输出流:ObjectOutputStream
对象的输入流:ObjectInputStream
在ObjectInputStream 中用readObject()方法可以直接读取一个对象,
ObjectOutputStream中用writeObject()方法可以直接将对象保存到输出流中
实例
/*String s = "abc";Date date = new Date();//调用的是Java中给定的类·FileOutputStream outputStream = new FileOutputStream("E:/ab.txt");ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);objectOutputStream.writeObject(s);objectOutputStream.writeObject(date);objectOutputStream.flush();objectOutputStream.close();*//* FileInputStream inputStream = new FileInputStream("E:/ab.txt");ObjectInputStream objectInputStream= new ObjectInputStream(inputStream);String s1= (String) objectInputStream.readObject();Date date1 =(Date) objectInputStream.readObject();System.out.println(s1);System.out.println(date1);objectInputStream.close();*/
注意
- 当一个类中需要被序列化(对象输出)时,该类需要实现Serializable接口,会为我们的类自动生成一个唯一编码
- 自动生成的编码,一旦类信息发生变化后,编号会自动改变
- 一般情况下,可以为类生成一个固定的身份证号,当类信息改变时,编号不会发生改变
Java中生成序列化id的操作