输入输出流及文件操作
22
4.6java.nio—视图缓冲区 视图缓冲区
上面的缓冲区都是基于字节的,像IntBuffer、LongBuffer等这些都 可以调用ByteBuffer的as***Buffer(***表示某个数据类型)得到,所 以这种类型的缓冲区又被称为视图缓冲区(View Buffer)。 视图缓冲区有以下特点。 (1)视图缓冲区有自己独立的position和limit,但它不是一个新的 创建,只是原来字节缓冲区的一个逻辑缓冲区。字节缓冲区的任何 修改都会影响视图缓冲区,反之亦然。 (2)视图缓冲区按照数据类型的大小进行索引,而不是字节顺 序。 (3)也提供了put()和get()及其系列方法,用于数据的整块传输。
20
4.6java.nio—使用缓冲区 使用缓冲区
2.获取缓冲区对象 缓冲区分为直接缓冲区和非直接缓冲区,两者区别在于直接缓冲 区上的数据操作。虚拟机将尽量使用本机的I/O,并尽量避免使用中 间缓冲区。判断一个缓冲区是否是直接缓冲区,可以调用isDirect() 方法。 有三种方式来获取一个缓冲区的对象。 (1)调用allocate()或者allocateDirect()方法直接分配,其中 allocateDirect()返回的是直接缓冲区。 (2)包装一个数组,如 byte[] b = new byte[1024]; ByteBuffer bb = ByteBuffer.wrap(b); (3)内存映射,即调用FileChannel的map()方法。
字节输出流类的作用就是将暂存在计算机内存中的数据输出到外 部设备。在编写应用程序时,常常需要定义字节输出流类的子类以 及方法,才能够实现字节输出功能。下表列出了字节输出流类派生 的子类。
6
返回目录
4.2字节流类—字节输出流类 字节流类 字节输出流类
下表列出了字节过滤输出流派生的子类。
7
返回目录
4.2字节流类—字节输出流类 字节流类 字节输出流类
19
4.6java.nio—使用缓冲区 使用缓冲区
1.层次结构 所有缓冲区的基类都是Buffer,除boolean类型外,其他数据类型 都有对应的缓冲区类。ByteOrder类,用来设置缓冲区的大小端顺 序,即BigEndian或者是LittleEndian,默认情况下是BigEndian,其 层次结构图如下图所示。
14
返回目录
4.4文件操作—文件过滤器 文件操作 文件过滤器
文件过滤器(Filter)是Java提供的两个接口,包括FileFileter和 FilenameFilter接口,用来对文件名字符串进行筛选,以便获得满足需 求特征的文件集合。这两个接口都包含accep()方法。但方法的参数不 同,具体声明如下: public interface FileFilter { public boolean accept(File pathname) } public interface FilenameFilter { pulic boolean accept(File dir,String name) }
返回总目录
第4章 输入 输出流及文件操作 章 输入/输出流及文念 4.2字节流类 4.3字符流类 4.4文件操作 4.5文件输入/输出流的应用 4.6 java.nio
1
返回目录
4.1System类及流的概念 类及流的概念
System类是Java语言中一个功能强大、非常有用的类,它提供了 标准输入/输出及运行时的系统信息。从System类不能创建对象,也 就是说,System类的所有属性和方法都是静态的,引用时要以 System作为前缀。System.in与System.out是System类的两个静态 属性,分别对应系统的标准输入/输出流。 其中,System.in称为标准输入流,用于程序输入,通常读取用户 从键盘输入的信息;System.out称为标准输出流,用于程序输出, 通常向用户显示信息;System.err称为标准错误流,用于向用户显示 出错信息。 标准输出流定义了向屏幕输出不同类型数据的方法print()和 println()。println()方法的一般语法格式可以概括如下: public void println (类型 变量或对象);
下表列出了抽象类OutputStream中的方法,所有这些方法在发生错 误时都会抛出 IOException异常,而且这个抽象类定义的方法都可以被它们所有 的子类继承使用。
8
返回目录
4.2字节流类—字节流的高级应用 字节流类 字节流的高级应用
1.管道流 管道用来把一个程序、线程和代码块的输出连接到另一个程序、线程 和代码块的输入。 java.io中提供了类PipedInputStream和PipedOutputStream作为管道 的输入/输出流。管道输入流作为一个通信管道的接收端,管道输出流 则作为发送端。管道流必须是输入和输出并用,即在使用管道前,两者 必须进行连接。 2.对象流 (1)对象的持续性(Persistence)。 能够记录自己的状态以便将来再生的能力,称为对象的持续性。 (2)对象的串行化(Serialization)。 对象通过写出描述自己状态的数值来记录自己的过程称为串行化。串 行化的主要任务是写出对象实例变量的数值,如果变量是另一个对象的 引用,则引用的对象也要串行化。这个过程是递归的。 (3)对象流。 能够输入/输出对象的流称为对象流。可以将对象串行化后,通过对象 输入/输出流写入文件或传送到其他地方。
2
返回目录
4.2字节流类—字节输入流类 字节流类 字节输入流类
字节输入流类的作用就是从外部设备获取字节数据到计算机内存 中。在编写应用程序时,常常需要定义字节输入流类的子类以及方 法,才能够实现字节输入功能。下表列出了字节输入流类派生的子 类。
3
返回目录
4.2字节流类—字节输入流类 字节流类 字节输入流类
16
4.5文件输入 输出流的应用 文件输入/输出流的应用 文件输入
下表列出了字节文件输入/输出流类的构造方法,
17
4.6java.nio
java nio的全称是java new I/O,即一个全新的I/O控制系统,它的 API的包名为java.nio,是在JDK 1.4后引入的。 nio之所以为新,在于它并没在原来I/O的基础上进行开发,而是 提供了全新的类和接口,除了原来的基本功能之外,它还提供了以 下新的特征。 (1)多路选择的非封锁式I/O设施。 (2)支持文件锁和内存映射。 (3)支持基于Perl风格正则表达式的模式匹配设施。 (4)字符集编码器和译码器。
15
4.4文件操作—随机存取文件流类 文件操作 随机存取文件流类
随机存取文件流(RandomAccessFile)是一种可以随机地在文件 中指定任意位置进行数据操作的I/O流,并且该流可以同时进行读/写 操作。随机存取文件流使文件数据的操作变得更加容易。Java API中 提供的随机存取文件流是RandomAccessFile类。 RandomAccessFile类创建的流与前面的输入、输出流不同, RandomAccessFile类既不是输入流类InputStream类的子类,也不是 输出流类OutputStream类的子类。但是RandomAccessFile类创建流 的指向既可以作为源也可以作为目的地,换句话说,当对一个文件进 行读/写操作时,创建一个指向该文件的RandomAccessFile流即可, 这样既可从这个流中读取文件的数据,也可以通过这个流写入数据到 文件。 RandomAccessFile类的两个构造方法。 (1)RandomAccessFile(String name, String mode)。 (2)RandomAccessFile(File file, String mode)。
13
返回目录
4.4文件操作—file类 文件操作 类
File类是对文件和目录的抽象表达。在Java语言中,目录被视为一 种特殊的文件。通过File类提供的方法,可以获取文件和目录信息, 并对文件和目录进行创建、修改和删除。 File类的构造方法如下: public class File extends Object implements Serializable, Comparable <File> { public File(String pathname) public File(String fparent, String child) public File(File parent, String child) } 其中,参数pathname是可以包含路径的文件名,fparent是文件所 在目录的文件对象,parent是文件所在目录的字符串,child是不带路 径的文件名。
10
返回目录
4.3字符流类—字符输入流类 字符流类 字符输入流类
下表列出了字符输入流类派生的若干具体子类。
11
返回目录
4.3字符流类—字符输出流类 字符流类 字符输出流类
下表列出了字符输出流派生的若干具体子类。
12
返回目录
4.3字符流类—字符输出流类 字符流类 字符输出流类
下表列出了字符输出流类中的方法,所有这些方法在发生错误 时都会抛出IOException异常,而且这个抽象类定义的方法都可 以被它们所有的子类继承使用。
18
4.6java.nio—使用信道
1.获取文件信道 文件的信道的类为FileChanne,它没有提供打开文件的方法,可 以通过调用FileInputStream、FileOutputStream和RandomAccessFile类实例的 getChannel()方法来获取其实例。 2.从信道读取数据 读取的数据会默认放到字节缓冲区中。FileChannel提供了四个API 读取数据。 3.向信道写入数据 数据来源默认是字节缓冲区。FileChannel提供了四个API写入数据 4.使用文件锁 5.使用内存映射
21