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

  • 相关阅读:
    【Codeforces 349B】Color the Fence
    【Codeforces 459D】Pashmak and Parmida's problem
    【Codeforces 467C】George and Job
    【Codeforces 161D】Distance in Tree
    【Codeforces 522A】Reposts
    【Codeforces 225C】Barcode
    【Codeforces 446A】DZY Loves Sequences
    【Codeforces 429B】Working out
    【Codeforces 478C】Table Decorations
    【Codeforces 478C】Table Decorations
  • 原文地址:https://www.cnblogs.com/FSY15767366954/p/10830706.html
Copyright © 2011-2022 走看看