一、 File类
1、 File类是IO包中唯一代表磁盘文件本身信息的类而不是文件中的内容。
2、 File类定义了一些与平台无关的方法来操纵文件,例如,创建、删除文件和重命名文件。
3、 Java中的目录被当做一种特殊的文件使用,list方法可以返回目录中的所有子目录和文件名。
4、 在Unix下地路径分隔符为(/),在Dos下的路径分隔符为(\),Java正确处理Unix和Dos的路径分隔符。
二、 RandomAccessFile类
1、 RandomAccessFile类提供了众多的文件访问方法。
2、 RandomAccessFile类支持“随机访问”方式------即可以跳转到文件的任意位置开始读写数据。
因为其实例对象中有个指示器,可以跳转到文件的任意位置。
应用:断点续传,多线程下载。
3、 RandomAccessFile类在随机(相对顺序而言)读写等长记录格式的文件时有很大的优势。
4、RandomAccessFile类仅限于操作文件,不能访问其他的IO设备,如网络,内存映像等。
5、两种构造方法:
new RandomAccessFile(f,”rw”);//读写方式
new RandomAccessFile(f,”r”);//只读方式
6、不管读还是写,都以指示器为标准。
三、 各节点流类
1、理解流的概念
1) 流是字节序列的抽象概念。
例如:文件、输入输出设备、网络、内存、内部进程通信管道、TCP/IP套接字等设备传输的数据序列 ,都可以理解为流。
2)流和文件的差异:
文件是数据的静态存储形式,而流是指数据传输时的形态。
3)流类分为两个大类:节点流类和过滤流类,其中过滤流类也叫处理流类。
4)用于直接操作目标设备所对应的类,叫节点流类。节点流类所对应的IO源或者目标称为流节点。
程序也可以通过一个间接地流类,去调用节点流类,以达到更加灵活的读写各种类型的数据。
2、 InputStream与OutputStream类(处理字节)
InputStream:
1) 程序可以从中连续读取字节的对象叫输入流,在java中,
用InputStream类来描述所有输入流的抽象概念。
2)InputStream类的方法
int read() ------读取管道结束时,返回-1
返回值为什么是int?------因为二进制形式为11111111的数据,以byte类型表示为-1,
以int类型表示为255。返回值为byte的话,此时的-1与读取到结束时返回的-1就无法区分了。
而int的取值范围为0到255,就没有这种冲突。
int read(byte[] b)-----读取到byte数组中
int read(byte[]b,int off,int len)
long skip(long n)
int available()
void mark(inr readlimit)------建立标记
void reset()-------与mark()方法配合使用,当调用reset()方法时,再次回到标记处
boolean markSupported()
void close()-----思考:有了垃圾回收器,为什么还要调用close方法?
因为创建流的时候,实际上在计算机的内存中产生了两个事物,一个是java程序的类实例对象,
一个是系统本身产生的某种资源。而java垃圾回收器只能管理类实例对象,不回管理系统产生的资源。
所以我们需要调用close()方法去告诉系统释放系统中产生的流资源。
3)InputStream是一个抽象类
OutputStream:
1) 程序可以向其中连续写入字节的对象叫输出流,
在java中, 用OutputStream类来描述所有输出流的抽象概念。
2) OutpurStream类的方法
void write(int b)
void write(byte[] b)
void write(byte[]b,int off,int len)
void flush()
void close()
3) OutputStream是一个抽象类。
3、FileInputStream与FileOutputStream类
1) FileInputStream 和FileOutputStream类分别用来创建磁盘文件的输入流和输出流对象,
通过它们的构造函数来指定文件路径和文件名。
2) 创建FileInputStream实例对象时,指定的文件应当是存在和可读的。
创建FileOutputStream实例对象时,如果指定的文件已经存在,这个文件中的原来内容将被覆盖清除。
3) 对同一个磁盘文件创建FileInputStream对象的两种方式:
(1) FileInpurStreaninOne = new FileInputStream(“hello.test”);
(2) File f= new File(“hello.test”);
FileInpurStream inTwo = newFilwInputStream(f);
4)创建FileOutputStream实例对象时,可以指定还不存在的文件名,
不能指定一个已被其他程序打开了的文件。
4、Reader与Writer类(处理字符)
1) Reader和Writer是所有字符流类的抽象基类,
用于简化对字符串的输入输出编程,即用于读写文本数据。
2) 二进制文件和文本文件的区别,可以简单的认为:如果一个文件专用于存储文本字符,
这个文件就是文本文件,除了文本文件以外的文件都是二进制文件。文本文件时二进制文件的一种特例。
3)FileOuputStream向文件中写数据时,不必要显示刷新缓冲区,而FileWriter就需要显示刷新缓冲区了。
5、PipedInputStream与PipedOutputStream类
1)PipedInputStream与PipedOutputStream类用于在应用程序中的创建管道通信
2)要用in.connect(out);方法相连
3) PipedWriter和PipedReader类与上类似
4)使用管道流类,可以实现各个程序模块之间的松耦合通信。用于线程之间的通信。
6、ByteArrayInputStream与ByteArrayOutputStream类
1)ByteArrayInputStream和ByteArrayOutputStream,用于以IO流的方式来完成对字节数组内容的读写,
来支 持类似内存虚拟文件或者内存映像文件的功能。
2)ByteArrayInputStream有两个构造函数:
ByteArrayInputStream(Byte[] b);
ByteArrayInputStream(Byte[] b,int offset,int length);
ByteArrayOutputStream有两个构造函数:
ByteArrayOutputStream();
ByteArrayOutputStream(int); //根据int数据的大小创建缓冲区,
创建缓冲区以后,就可以像虚拟文件一样,向其中写入内容。
3)StringReader类和StringWriter类来以字符IO流的方式处理字符串。
7、重视IO程序代码的复用性
可从以下几个方面考虑:
1) System.in连接到键盘,是InputStream类型的实例对象。
System.out连接到显示器,是PrintStream类的实例对象。
2) 不管各种底层物理设备用什么方式实现数据的终止点,
InputStream的read方法总是返回-1来表示输入流的结束。
3) 在Windows下,按下Ctrl+Z组合键可以产生键盘输入流的结束标记,
在linux下,则是按下Ctrl+D组合键来产生键盘输入流的结束标记。
使用-1来作为键盘输入的结束点。在该函数中编写的程序代码不应直接使用System.in读取数据,
而是用一个InputStream类型的形式参数对象来读取数据,
然后将System.in作为实参传递给InputStream类型的形式参数来调用该函数。