IO 包中的其他类
- 打印流
- PrintWriter 和 PrintWriter
- 直接操作输入流和文件
 
- 序列流
- SequenceInputStream
- 对多个输入流进行合并
 
- 操作对象
- ObjectInputStream 和 ObjectOutputStream
- 被操作的对象需要实现 Serializable (标记接口)
 
- RandomAccessFile
- 随机访问文件, 自身具备读写的方法
- 不是 IO 体系的子类,继承自 Object
 
- 管道流
- 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
- 特点: - 该对象既能读,也能写. 如果文件不存在,则创建;如果文件存在,不创建.
- 该对象内部维护了一个 byte 数组, 并通过指针可以操作数组中的元素
- 可以通过 getFilePointer 方法获取指针的位置,和通过 seek 方法设置指针的位置
- 其实该对象就是将字节输入流和输出流进行了封装
- 该对象的源或者目的只能是文件,通过构造函数就可以看出.(构造函数的参数为: 文件或者文件路径)
 
- 构造函数: - 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. 操作字符串
- StringReader 和 StringWriter
 
 参考资料
- JavaSE 基础视频(毕向东)
- JDK 1.6 中文文档
IO 包中的其他类的更多相关文章
- 黑马程序员——【Java基础】——File类、Properties集合、IO包中的其他类
		---------- android培训.java培训.期待与您交流! ---------- 一.File类 (一)概述 1.File类:文件和目录路径名的抽象表现形式 2.作用: (1)用来将文件或 ... 
- Java基础---IO(三)--IO包中的其他类
		第一讲 对象序列化 一.概述 将堆内存中的对象存入硬盘,保留对象中的数据,称之为对象的持久化(或序列化).使用到的两个类:ObjectInputStream和ObjectOutputStrea ... 
- IO包中的RandomAccessFile类
		RandomAccessFile RandomAccessFile 是随机访问文件的类.它支持对文件随机访问的读取和写入,即我们也可以从指定的位置读取/写入文件数据,因为该类在其内部封装了一个数组和指 ... 
- IO包中的其他类
		查看各对象API文档 打印流 PrintWriter PrintStream 序列流:对多个流进行排列合并 SequenceInputStream public static void main(St ... 
- Java笔记(二十八)……IO流下 IO包中其他常用类以及编码表问题
		PrintWriter打印流 Writer的子类,既可以接收字符流,也可以接收字节流,还可以接收文件名或者文件对象,非常方便 同时,还可以设置自动刷新以及保持原有格式写入各种文本类型的print方法 ... 
- IO包中的其他类总结
		一.PrintStream和PrintWriter PrintStream 为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式. PrintStream 打印的所有字符都使用平台的默认字符 ... 
- Java之IO(十四)IO包中其它类
		转载请注明出处:http://www.cnblogs.com/lighten/p/7267553.html 1.前言 此章介绍IO包中剩余未介绍的几个流和工具类,包括LineNumberReader. ... 
- java.io包中的字节流—— FilterInputStream和FilterOutputStream
		接着上篇文章,本篇继续说java.io包中的字节流.按照前篇文章所说,java.io包中的字节流中的类关系有用到GoF<设计模式>中的装饰者模式,而这正体现在FilterInputStre ... 
- Java IO流中的File类学习总结
		一.File类概述 File类位于java.io包中,是对文件系统中文件以及文件夹进行封装的对象,可以通过对象的思想来操作文件和文件夹. File类有多种重载的构造方法.File类保存文件或目录的各种 ... 
随机推荐
- makefile之short函数
			函数名称:排序函数-$(sort LIST) 函数功能:给字串"LIST"中的单词以首字母为准进行排序(升序),并去掉重复的单词. 返回值:空格分割的没有重复单词的字串. 函数说明 ... 
- python对象序列化之pickle
			本片文章主要是对pickle官网的阅读记录. The pickle module implements binary protocols for serializing and de-serializ ... 
- python学习之pypandoc
			对于程序员来说,文件格式之间的转换是一件非常费劲的事!比如md文件转化为html文件. 于是乎,就有一群牛人搞出了个神器,他就是pandoc. 而python中,对应的第三方模块就是pypandoc. ... 
- 解决错误:  ios property has a previous declaration
			今天维护一个项目的时候,我新添加了一个库,运行的时候报错了: ios property has a previous declaration 上网查了一下没有找到思路,不过根据提示自己试了一下,原来这 ... 
- myeclipse能启动tomcat但是用startup.bat无法启动
			myeclipse能启动tomcat但是用startup.bat无法启动 这个问题困扰了我一天,把一天的周末时间白白花费了.各种百度,各种尝试都没办法解决.在江湖上闯,难道就只有百度一招吗? 不是,我 ... 
- android studio 中配置androidAnnotation 的新版正确配置
			apply ].processResources.manifestFile resourcePackageName 'com.peiandsky.firstandroidstudio' }} 
- redission计数器实现,redisTemplate计数器
			在redission 2.9.0版本之前是有BUG,在实现下面代码时,第一次是成功的,但是在第二次就会失败: RedissonClient client;//client参考别的demo RMapCa ... 
- linux 启动jar命令
			进入ECS目录jar 存放目录: 1.执行命令: linux:启动jar nohup java -jar qualityshop-api.jar>log.file 2>&1 &am ... 
- python笔记9 : 多线程
			基础: 什么是进程(process)? 每一个程序的内存是独立的,例如:world不能访问QQ. 进程:QQ是以一个整体的形式暴露给操作系统管理,里面包含了各种资源的调用(内存管理.网络接口调用等). ... 
- 第二百一十二节,jQuery EasyUI,Combo(自定义下拉框)组件
			jQuery EasyUI,Combo(自定义下拉框)组件 学习要点: 1.加载方式 2.属性列表 3.事件列表 4.方法列表 本节课重点了解 EasyUI 中 Combo(自定义下拉框)组件的使用方 ... 
