java IO系统(1)
java IO操作主要是指的是使用java进行输入、输出操作,java中的所有操作类都放在java.io包中。在这个java.io包中最重要的就是5个类和一个接口,5个类指的是File、OutputStream、InputStream、Write、Reader,一个接口指的是Serializable。掌握这些IO操作的核心就可以掌握了。
Java 流在处理上分为字符流和字节流。字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符、字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组。
Java 内用 Unicode 编码存储字符,字符流处理类负责将外部的其他编码的字符流和 java 内 Unicode 字符流之间的转换。而类 InputStreamReader 和 OutputStreamWriter 处理字符流和字节流的转换。字符流(一次可以处理一个缓冲区)一次操作比字节流(一次一个字节)效率高。
一、File类介绍
在整个IO包中,唯一与文件本身有关的类就是File类。使用File类可以进行创建和删除文件等常用操作。
①File类的构造函数:public File(String pathName)-->实例化File类时,必须要设置好路径。
②File类中常用的方法
注意:除了以上这些常用方法外,在File中还有一些静态常量字段也很有用,分别是:
①separatorChar----public static final char separatorChar
与系统有关的默认名称分隔符。此字段被初始化为包含系统属性 file.separator 值的第一个字符。在 UNIX 系统上,此字段的值为 '/';在 Microsoft Windows 系统上,它为 '\'。
②separator----public static final String separator
与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。此字符串只包含一个字符,即 separatorChar。
③pathSeparatorChar----public static final char pathSeparatorChar
与系统有关的路径分隔符。此字段被初始为包含系统属性 path.separator 值的第一个字符。此字符用于分隔以路径列表 形式给定的文件序列中的文件名。在 UNIX 系统上,此字段为 ':';在 Microsoft Windows 系统上,它为 ';'。
④pathSeparator----public static final String pathSeparator
与系统有关的路径分隔符,为了方便,它被表示为一个字符串。此字符串只包含一个字符,即 pathSeparatorChar。
二、RandomAccessFile类
File类仅仅是对文件本身进行操作的,而如果要对文件进行操作,则可以使用RandomAccessFile类。此类属于随机读取类,可以随机的读取一个文件中指定位置的数据,常用的方法如下:
注意:如果使用rw方式声明RandomAccessFile对象,在写入的文件不存在时,系统将自动进行创建。
三、字节流
字节流主要操作byte类型数据,以byte数组为准,主要操作类是OutputStream和InputStream。
①先了解一下InputStream的作用和提供的方法
InputStream是从文件中把内容读取出来,InputStream本身是一个抽象类,必须依赖其子类。InputStream提供的方法如下:
InputStream由于是一个抽象类,所以具体的实现还需要通过它的子类完成,下面就介绍一下有它衍生出来的子类,以及这些子类的作用。
FileInputStream:把一个文件作为 InputStream ,实现对文件的读取操作。
PipedInputStream :实现了 pipe 的概念,主要在线程中使用 . 管道输入流是指一个通讯管道的接收端。一个线程通过管道输出流发送数据,而另一个线程通过管道输入流读取数据,这样可实现两个线程间的通讯。
ByteArrayInputStream:从内存中每次读取一个字节的数据,然后保存到内置的缓冲区中。维持一个计数器用来记录从数据源中读入的字节数目。
调用该输入流的close()方法不会产生任何实际的作用。因为它“关闭”的对象是---内存。而不是文件。不会抛出任何的IOException。
StringBufferInputStream: 把一个 String 对象作为 InputStream (已过时)。
注意:注释:不推荐使用 StringBufferInputStream 方法。 此类不能将字符正确的转换为字节。从一个串创建一个流的最佳方法是采用 StringReader 类。
SequenceInputStream :把多个 InputStream 合并为一个 InputStream . “序列输入流”类允许应用程序把几个输入流连续地合并起来,并且使它们像单个输入流一样出现。每个输入流依次被读取,直到到达该流的末尾。然后“序列输入流”类关闭这个流并自动地切换到下一个输入流。
DataInputStream:从底层的其它字节输入流中读取字节,然后转换成与机器无关的原始类型数据(boolean,byte,char)
BufferedInputStream:为底层的其它字节输入流增加一个“缓冲”的功能,除此之外还可以“标记”,“重置”输入流。当这个输出流的对象被创建时,一个内置的缓冲区也就被创建了。
随着底层的输入流的不断读入,缓冲区中的数据也在不同刷新。一次性地从底层的输入流读入多个字节,方便后续的转码工作
②OutputStream提供将字节流写入到文件的功能。我们先查看一下OutputStream可以提供的操作:
OutputStream也是一个抽象类,它功能的实现也是由其衍生子类完成,如下:
ByteArrayOutputStream : 该输出流能够将要写入内存的字节,先缓存到自身的缓冲区中。并且该缓冲区的大小可以自动增长。如果要从该输出流中提取字节,可以使用toByteArray,如果要还原为字符串,可以使用toString。
关闭该输出流并不会产生任何的IOException,因为它的输出端是---内存而非文件。
FileOutputStream: 该输出流以原始字节(raw bytes)的方式向底层文件系统中写数据。在某些系统下,有时候只允许同一个文件
打开一个输出流。所以如果该文件已经被打开了,则再次打开一个输出流会抛出异常。
PipedOutputStream: 管道输出流是指一个通讯管道的发送端。 一个线程通过管道输出流发送数据,而另一个线程通过管道输入流读取数据,这样可实现两个线程间的通讯。
PrintStream:为底层的输出流添加额外的功能,令到底层的输出流可以方便地输出各种经过“格式化”的数据。和其它输出流不同,该输出流并不会抛出IOException,但是可以通过checkError方法来检查是否有异常发生。
该输出流具备自动flush功能,但写完一个字节数组,或者碰到一个println方法的调用,或者当要写出的字符是换行符时。会自动清空flush。
默认情况下所有要写出的内存字符,都会被该输出流以平台默认编码方式,转换为字节流输出。
DataOutputStream:允许应用程序直接将基本类型数据(boolean, char, byte)直接写出到底层的输出流(内部转换为适当的字节)
BufferedOutputStream:为底层的输出流提供“缓冲”的功能,所有的写出请求和要写出的数据都会先缓冲到该输出流的缓冲区中,在适当的时机一次性写出。
注意该类的write方法被调用时并不一定立即将内存中的数据写出到数据源,而可能先将数据缓存起来。
上一篇: 《长城春色无限好》王含英
下一篇: 《桐庐行》柯灵