java Io流的应用
标准输入输出流
1.1标准输入流
源数据源是标准输入设备(键盘、鼠标、触摸屏)等输入设备。在java中用System.in 得到一个InputStream字节输入流。
[1]在控制台输入一句话,然后原样输出
package Io2; import java.io.IOException; import java.io.InputStream; public class Test01 { public static void main(String[] args) throws IOException { //system.in是字节输入流InputStream InputStream in=System.in; //一次性读取的字节数和长度 byte[] buf=new byte[1024]; int len; len=in.read(buf); String str=new String(buf, 0, len); System.out.println(str); } } nihao nihao
标准输入流以字节流流入内存,如果在控制台中输入字符,字符以默认编码(win简体:gbk)编码成字节进入标准输入流。
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; //需求:从控制台高效读取一行数据。把一首诗写入文件。 public class Test02 { public static void main(String[] args) throws IOException { // [1] system.in是控制台字节输入流InputStream InputStream in = System.in; // 【3】 输入的是字节流,通过字节转换器转换成字符流 读取到cpu InputStreamReader reader = new InputStreamReader(in, "GBK"); // [2] 编写快速字节读取管道,实现读的对象 字节-------字符 BufferedReader br = new BufferedReader(reader); // 【4】 创建file文件 File file = new File("D:\\javatest\\l.txt"); // 【6】 cpu的是字符流,写入文件中需要转换成字节流 需要一次性写入多个,FileWriter FileWriter writer = new FileWriter(file); // OutputStreamWriter writer=new OutputStreamWriter(out, "GBK") // 【5】 编写快速字节写入管道,字符-----字节 BufferedWriter bw = new BufferedWriter(writer); String end = "bye"; while (true) { String line = br.readLine(); if (line.equals(end)) { break; } bw.write(line); bw.newLine(); } bw.flush(); bw.close(); writer.close(); } }
1.2 标准输出流(PrintStream)
数据目的地是标准输出设备(显示器)等输出设备。在java中用System.out得到一个PrintStream 字节输出流(字节打印流)。提供了更强大的
println
打印方法用于打印各种数据类型。
需求:读取文件,显示到标准输出设备
import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.io.PrintStream; public class Test04 { public static void main(String[] args) throws IOException { File file = new File("d:\\javatest\\k.txt"); FileReader reader = new FileReader(file); BufferedReader br = new BufferedReader(reader); //PrintStream 字节输出流(字节打印流) PrintStream ps = System.out; String line; while ((line = br.readLine()) != null) { ps.println(line); } } }
1.3 Scanner
通过scanner扫描文件、字节流等
import java.io.File; import java.io.IOException; import java.util.Scanner; // 扫描平台默认编码的文件 public class Test03 { public static void main(String[] args) throws IOException { File file = new File("d:\\javatest\\k.txt"); Scanner sc = new Scanner(file); String line; while (sc.hasNextLine()) { line = sc.nextLine(); System.out.println(line); } } }
1.4 序列化
把内存中的对象永久保存到硬盘的过程称为对象序列化,也叫做持久化。
把硬盘持久化的内存恢复的内存的过程称为对象反序列化。
类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化,并抛出异常
Serializable接口没有方法或字段,仅用于标识可序列化的语义
public class Student implements Serializable{ // 。。。
1.5 序列化对象
ObjectOutputStream 继承于OutputStream,专门用于把对象序列化到本地。提供了
writeXXX
writeObject() 用于写入一个对象
import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; public class Test05 { public static void main(String[] args) throws IOException { Student stu=new Student("001", "张三", 20, Gender.男); File file =new File("D:\\javatest\\m.txt"); FileOutputStream out=new FileOutputStream(file); ObjectOutputStream oos=new ObjectOutputStream(out); oos.writeObject(stu); oos.close(); out.close(); System.out.println("格式化完成"); } }
ObjectInputStream 继承于InputStream ,专门用于把本地持久化内容反序列化到内存,提供了
readXXX
readObject() 用于读取一个序列化内容并返回一个对象。
import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.ObjectInputStream; public class Test06 { public static void main(String[] args) throws IOException, ClassNotFoundException { File file = new File("D:\\javatest\\m.txt"); FileInputStream in = new FileInputStream(file); ObjectInputStream ois = new ObjectInputStream(in); // readObject() 用于读取一个序列化内容并返回一个对象。 Student stu = (Student) ois.readObject(); System.out.println(stu.getId()); System.out.println(stu.getName()); System.out.println(stu.getAge()); System.out.println(stu.getGender()); ois.close(); in.close(); } }
001
张三
20
男
1.5 序列化版本
当序列化完成后,后期升级程序中的类(Student),此时再反序列化时会出现异常。
异常原因:序列化流的serialVersionUID和升级后类的版本不匹配。
解决方案:给Student类加序列化版本号,有两种方式
default serial version ID 生成默认的serial version ID 一般值都是1L。
generated serial version ID 根据当前类的属性、方法生成一个唯一ID。
public class Student implements Serializable { private static final long serialVersionUID = -6876240585925178921L;
transient
开发过程中,如果想忽略某些字段不让其序列化时,可以使用transient修饰。
public class Student implements Serializable { private static final long serialVersionUID = -6876240585925178921L; private String id; //忽略某些字段不让其序列化时,可以使用transient修饰 private transient String name; private transient int age;
1.6 DataInputStream/DataOutputStream
DataOutputStream 继承OutputStream,专门用于把基本java数据类型写入输出流。提供了writeXXX 写入基本java数据类型。
DataInputStream 继承于InputStream,允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。
DataInputStream/DataOutputStream 特别适合读取/写入在网络传输过程中的数据流。
import java.io.DataOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; public class Test07 { public static void main(String[] args) throws IOException { File file = new File("D:\\javatest\\n.txt"); FileOutputStream out=new FileOutputStream(file); DataOutputStream dos=new DataOutputStream(out); dos.writeInt(10); dos.writeUTF("hellow中国"); dos.close(); out.close(); System.out.println("ok"); } }
import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; public class Test08 { public static void main(String[] args) throws IOException { File file = new File("D:\\javatest\\n.txt"); FileInputStream in=new FileInputStream(file); DataInputStream dis=new DataInputStream(in); int a=dis.readInt(); String string=dis.readUTF(); System.out.println(a); System.out.println(string); } }
注意:
以什么顺序写入基本java数据类型,就以什么顺序读取基本java数据类型。
写入基本java数据类型