zoukankan      html  css  js  c++  java
  • IO 包中的其他类

    1. 打印流
      • PrintWriter 和 PrintWriter
      • 直接操作输入流和文件
    2. 序列流
      • SequenceInputStream
      • 对多个输入流进行合并
    3. 操作对象
      • ObjectInputStream 和 ObjectOutputStream
      • 被操作的对象需要实现 Serializable (标记接口)
    4. RandomAccessFile
      • 随机访问文件, 自身具备读写的方法
      • 不是 IO 体系的子类,继承自 Object
    5. 管道流
      • PipedInputStream 和 PipedOutputStream
      • 输入和输出可以直接进行连接, 通过结合线程使用

    1. 打印流

    PrintStream

    1. 提供了打印方法,可以对多种数据类型值进行打印, 并保持数据的表现形式
    2. 它不抛出 IOException
    3. 它的构造函数, 接受三种类型的值:
        - 字符串路径
        - File 对象
        - 字节输出流
    4.常用方法
    
    PrintStream out = new PrintStream("print.txt");
    
    // 使用记事本打开后, 显示为 a
    // 只打印最低 8 位
    out.write(97);
    
    // 先将 97 变成字符串, 以保持原样, 再将数据打印到目的地
    // 使用记事本打开后, 显示仍为 97
    out.print(97);  
    

    PrintWriter

    1. 它的构造函数, 接受四种类型的值:
        - 字符串路径
        - File 对象
        - 字节输出流
        - 字符输出流
    
    // 示例:
        // 控制台输入与输入流相关联
        BufferedReader bufr = new BufferedReader(new InputStream(System.in));
    
        // 输出流与控制台相关联
        PrinWriter out = new PrintWriter(System.out);
    
        String line = null;
        while((line=bufr.readLine())!=null){
    
            // 判断是否输入结束
            if("over".equals(line))
                break;
    
            // 将输入的字符转换为大写, 然后输出
            out.println(line.toUpperCase());
            out.flush();  // 写入一行后, 需要刷新, 才能显示在控制台上
        }
    
        // 关闭流
        bufr.close();
        out.close();
    
    
    // 说明: public PrinterWriter(OutputStream out, boolean autoFlush);
    //  autoFlush : 如果为 true, 则 println, printf 或 format  方法将自动刷新输出缓冲区.
    

    2. 序列流

    • 对多个输入流的逻辑串联
    // 需求: 将 1.txt, 2.txt, 3.txt 文件中的数据合并到一个文件中
    
        public static void main(String[] args){
    
            Vector<FileInputStream> v = new Vector<FileInputStream>();
    
            v.add(new FileInputStream("1.txt"));
            v.add(new FileInputStream("2.txt"));
            v.add(new FileInputStream("3.txt"));
    
            Enumeration<FileInputStream> en = v.elements();
    
            // SequenceInputStream 的构造函数只有两种
            // SequenceInputStream(<Enumeration<? extends InputStream> e>)
            SequenceInputStream sis = new SequenceInputStream(en);
    
            FileOutputStream fos = new FileOutputStream("4.txt");
    
            byte[] buf = new byte[1024];
            int len = 0;
            while((len=sis.read(buf))!=-1){
                fos.write(buf);
            }
    
            fos.close();
            sis.close();
        }
    
    // 升级版, 用 ArrayList 替换 Vector
    
        public static void main(String[] args){
    
            ArrayList<FileInputStream> al = new ArrayList<FileInputStream>();
            for(int i=1; i<3; i++){
                al.add(new FileInputStream(x+".txt"));
            }
    
            // ArrayList 集合需要具备枚举功能
            Enumeration<FileInputStream> en = Collections.enumeration(al);
    
            /*
             * 模拟实现 Enumeration
             * final Iterator<FileInputStream> it = al.iterator();
             *
             * 匿名内部类
             * Enumeration<FileInputStream> en = new Enumeration<FileInputStream>(){
             *    
             *           public boolean hasMoreElements() {
             *                       
             *                   return it.hasNext();
             *            }
             *            
             *            public FileInputStream nextElement(){
             *                   
             *                   return it.next();
             *             }
             *   }
             * /
    
            SequenceInputStream sis = new SequenceInputStream(en);
    
            FileOutputStream fos = new FileOutputStream("5.txt");
    
            // 以下同上
        }
    

    3. 操作对象

    • ObjectInputStream 和 ObjectOutputStream
    • 存储对象的文件,扩展名一般为 .object
    • 被操作的对象需要实现 java.io.Serializable (标记接口)
      • 该接口用于给被序列化的类加入 ID 号, 用于判断类和对象是否是同一个版本
      • 序列化写入的是非静态和非瞬态字段的值
      • transient 关键字, 非静态数据不想被序列化,可以使用该关键字修饰. 即瞬态

    // 示例: 往文件中写入 Person 对象
    
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("obj.object"));
    
        // 对象的序列化, Person 类需要实现 Serializable 接口
        oos.writeObject(new Person("小强",30));
    
        oos.close();
    
    // 读取文件中的 Person 对象
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("obj.object"));
    
        // 对象的反序列化, 需要具备: Person.class 文件和 obj.object 文件
        Person p = (Person)ois.readObject();
        System.out.println(p.getName()+"..."+p.getAge());
    

    4. RandomAccessFile

    1. 特点:

      • 该对象既能读,也能写. 如果文件不存在,则创建;如果文件存在,不创建.
      • 该对象内部维护了一个 byte 数组, 并通过指针可以操作数组中的元素
      • 可以通过 getFilePointer 方法获取指针的位置,和通过 seek 方法设置指针的位置
      • 其实该对象就是将字节输入流和输出流进行了封装
      • 该对象的源或者目的只能是文件,通过构造函数就可以看出.(构造函数的参数为: 文件或者文件路径)
    2. 构造函数: RandomAccessFile(File file, String mode);

      • 其中 mode 只有四个值可以取: r(只读), rw(读和写), rws, rwd
    // 示例: 基本写入过程
        RandomAccessFile raf = new RandomAccessFile("random.txt");
    
        // 写入姓名, 需要转换为字节
        raf.write("张三".getBytes());
    
        // 写入年龄, 使用 writeInt(),
        // 不能使用 write(), 因为该方法只写低八位
        raf.writeInt(97);
    
    // 示例: 基本读取过程
        RandomAccessFile raf1 = new RandomAccessFile("random.txt");
    
        // 可以通过 seek 设置指针的位置, 从小强开始读取
        // 只要指定指针的位置, 就可以实现随机的读取
        raf.seek(1*8);
    
        byte[] buf = new byte[4];
        raf1.read(buf);
        int age = raf1.readInt(); // 读取年龄, 该方法一次读取四个字节, 并自动转换为整数
    
        String name = new String(buf);  // 读取姓名
    

    5. 管道流

    • PipedInputStream 和 PipedOutputStream
    • 输入流和输出流可以直接进行连接, 通过结合线程使用

    6. 操作基本数据类型

    • DataInputStream 和 DataOutputStream

    7. 操作字节数组

    • ByteArrayInputStream 和 ByteArrayOutputStream
    • 源和目的都是内存

    8. 操作字符数组

    • CharArrayInputStream 和 CharArrayOutputStream

    9. 操作字符串

  • 相关阅读:
    Mac下Mysql启动异常["ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)"]
    Appium的前世今生
    appium自动化测试
    ubuntu下nvm,node以及npm的安装与使用
    Android反编译
    Android 常用 adb 命令总结
    Android SDK开发常用工具的使用及其异常处理
    如何获取android app的Activity
    Android 上多方式定位元素(python)
    获得android应用的版本号
  • 原文地址:https://www.cnblogs.com/linkworld/p/7519270.html
Copyright © 2011-2022 走看看