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 输出流(字节打印流)。提供了更强大的

print

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数据类型

原文地址:https://www.cnblogs.com/FSY15767366954/p/10830706.html