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. 操作字符串

IO 包中的其他类的更多相关文章

  1. 黑马程序员——【Java基础】——File类、Properties集合、IO包中的其他类

    ---------- android培训.java培训.期待与您交流! ---------- 一.File类 (一)概述 1.File类:文件和目录路径名的抽象表现形式 2.作用: (1)用来将文件或 ...

  2. Java基础---IO(三)--IO包中的其他类

    第一讲     对象序列化 一.概述 将堆内存中的对象存入硬盘,保留对象中的数据,称之为对象的持久化(或序列化).使用到的两个类:ObjectInputStream和ObjectOutputStrea ...

  3. IO包中的RandomAccessFile类

    RandomAccessFile RandomAccessFile 是随机访问文件的类.它支持对文件随机访问的读取和写入,即我们也可以从指定的位置读取/写入文件数据,因为该类在其内部封装了一个数组和指 ...

  4. IO包中的其他类

    查看各对象API文档 打印流 PrintWriter PrintStream 序列流:对多个流进行排列合并 SequenceInputStream public static void main(St ...

  5. Java笔记(二十八)……IO流下 IO包中其他常用类以及编码表问题

    PrintWriter打印流 Writer的子类,既可以接收字符流,也可以接收字节流,还可以接收文件名或者文件对象,非常方便 同时,还可以设置自动刷新以及保持原有格式写入各种文本类型的print方法 ...

  6. IO包中的其他类总结

    一.PrintStream和PrintWriter PrintStream 为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式. PrintStream 打印的所有字符都使用平台的默认字符 ...

  7. Java之IO(十四)IO包中其它类

    转载请注明出处:http://www.cnblogs.com/lighten/p/7267553.html 1.前言 此章介绍IO包中剩余未介绍的几个流和工具类,包括LineNumberReader. ...

  8. java.io包中的字节流—— FilterInputStream和FilterOutputStream

    接着上篇文章,本篇继续说java.io包中的字节流.按照前篇文章所说,java.io包中的字节流中的类关系有用到GoF<设计模式>中的装饰者模式,而这正体现在FilterInputStre ...

  9. Java IO流中的File类学习总结

    一.File类概述 File类位于java.io包中,是对文件系统中文件以及文件夹进行封装的对象,可以通过对象的思想来操作文件和文件夹. File类有多种重载的构造方法.File类保存文件或目录的各种 ...

随机推荐

  1. Atitit.获取主板与bios序列号获取硬件设备信息  Wmi wmic 的作用

    Atitit.获取主板与bios序列号获取硬件设备信息  Wmi wmic 的作用 1 获取硬件核心基础核心基础Wmi1 2 其他资料2 3 Wmic WMI 命令行接口2 4 Atitit.获取主板 ...

  2. [elk]kibana搜索绘图

    kibana绘图 好些日志入库了需要分析. 1,首先分析top10 url的table和柱状分布 2,其次想着分析下404所占比例,以及404所对应的url table. 3,最后分析一下请求总数. ...

  3. 亚信UED前端流程自动化构建工具

    亚信UED前端流程自动化构建工具 .wmd-input, .wmd-input:focus, #md-section-helper {font-size: 14px !important;line-h ...

  4. java的锁池和等待池

    谢邀.不知道题中的一段文字出自何处.“锁池”和“等待池”这种翻译我还是头一回见.不过,题主的思路已经对了,即不拘泥于文字,而是在考虑这两个东西在锁的调度(即决定哪个线程可以获得锁的过程)中起到什么作用 ...

  5. vue 过渡状态

    vue的过渡系统提供了非常多简单的方法设置进入.离开和列表的动效.那么对于数据元素本身的动效呢,例: 数字和运算 颜色的显示 svg节点的位置 元素的大小和其他的属性 所有的原始数字都被事先存储起来, ...

  6. 2种实现CXF方法例子

    转载自:http://www.blogjava.net/sai5201314vicky/articles/353078.html 大家好,今天我要介绍的现实webservice的一种技术——CXF 由 ...

  7. how to identify your .NET Framework version

    scenario: when I try to install github-windows on my PC, got such error "lower .NET Framework V ...

  8. Colored Sticks - poj2513(trie + 并查集)

    问题便转化为:给定一个图,是否存在“一笔画”经过涂中每一点,以及经过每一边一次.这样就是求图中是否存在欧拉路Euler-Path.由图论知识可以知道,无向图存在欧拉路的充要条件为:① 图是连通的:② ...

  9. 快使用阿里云的maven仓库

    自从开源中国的maven仓库挂了之后就一直在用国外的仓库,慢得想要砸电脑的心都有了.如果你和我一样受够了国外maven仓库的龟速下载?快试试阿里云提供的maven仓库,从此不在浪费生命…… 仓库地址: ...

  10. FireFox插件FirePHP调试PHP

    如果你和我一样,你会在开发网页项目时候完全无法离开FireBug.这个小巧的"臭虫"是一个神奇而有用的HTML/CSS/JavaScript/Ajax调试器.但是你也许不知道这个还 ...