zoukankan      html  css  js  c++  java
  • 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数据类型

  • 相关阅读:
    电子产品使用感受之—我的iPad Pro坏了。。。
    我最近读了什么书?(随时更新)
    我了解到的新知识之--GDPR
    我了解到的新知识之—MPLS
    我了解到的新知识之—Apple Captive Portal 网页认证登陆公共Wifi
    电子产品使用感受之--无线充电器到底是不是鸡肋?
    大家春节好,过节了也不要忘记来听听我的播客节目哦!
    Python学习笔记之--我又开始学习Python了(随时更新)
    电子产品使用感受之--Mac Mini 买了之后有什么用?-- 开发啊!
    第一次个人编程作业
  • 原文地址:https://www.cnblogs.com/FSY15767366954/p/10830706.html
Copyright © 2011-2022 走看看