节点流:
理解流的概念:
.流是字节序列的抽象概念
.文件是数据的静态存储形式,而流是指数据传输时的形态。
文件只是流可操作的io设备之一,除了文件流还有网络流,内存流等等。
java提供了众多可操作流的类
.流类分为两个大类:节点流类和过滤流类(也叫处理流类)。
inputStream类
程序可以从中连续读取字节的对象叫输入流,在java中,用InputStream类来描述所有输入流的抽象概念。
InputStream类得方法:
int read()
结束返回-1
如果没有结束,通道没有关闭,read()就会发生阻塞。
read()只读取一个字节的内容
二进制形式为11111111的数据,以byte类型表示为-1,以int类型表示为255,返回int的好处是返回最大值是255,最小值是0,不可能有-1出现,这样就可以与表示流的结束的-1进行区别。
int read(byte[] b)
读取的数据以int的范围为准,一个都读不到会发生阻塞。
int read(byte[] b, int off, int len)
int skip(long n)
跳过n个字节再读取
int available()
在读取之前调用,检查流中是否有数据,如果有可以读取,以免发生阻塞。单独一个线程开一个read方法,这样减少cpu的开销。
void mark(int readlimit)
在输入流中建立一个标记
void reset()
和mark配合使用
boolean markSupported()
void close()
关闭流,释放与流相关的资源。
有了垃圾回收器,为什么还要调用close方法?
计算机内存中产生了两个事物,一个是java程序的类实例对象,一个是系统产生的某种资源,而java回收器只能管理java的类实例对象,而不会去管系统产生的资源,所以需要调用close来关闭系统的资源。
OutputStream类
程序可以向其中连续写入字节的对象叫输出流,在java中,用OutputStream类来描述所有输出流的抽象概念。
OutputStream类得方法:
void write(int b)
void write(byte[] b)
void write(byte[] b, int off, int len)
void flush()
read的数据先放入内存缓冲区,再从缓冲区输出到程序。
内存缓冲区中的内容清出内存,输出。
void close()
张老师一个关于io缓冲区的刻骨铭心的经历:
查看程序崩溃前执行动作的记录,然后重演,推算出程序崩溃的原因。曾经的一个web邮件系统,用这个方法没有找到程序崩溃的原因。后来用flush方法找到了原因。以后可以直接调用close关闭资源。
FileInputStream与FileOutputStream类
FileInoutStream和FileOutputStream类分别用来创建磁盘文件的输入流和输出流对象,通过它们的构造函数来指定文件路径和文件名。
创建FileInputStream实例对象时,指定的文件应当是存在和可读的。创建FileOutputStream实例对象时,如果指定的文件已经存在,这个文件中的原来内容将被覆盖清除。
对同一个磁盘文件创建FileInputStream对象的两种方式:
1.FileIputStream inOne = new FileInputStream("hello.test");
2.File f = new File("hello.test");
FileInputStream inTwo = new FileInputStream(f);
创建FileOutputStream实例对象时,可以指定还不存在的文件名,不能指定一个已被其他程序打开了的文件。
思考:要将A文件的内容写入B文件,在程序代码中,是用输出类对象,还是用输入类对象来连接A文件并完成对A文件的操作呢?
记住:输入和输出的概念是相对与程序而言的,而不是相对于文件而言的。所以,我们应该用一个输入类与A关联,输出类与B关联。
编程举例:用FileOutputStream类向文件中写入一个字符串,然后用一个FileInputStream读出写入的内容。
Reader与Writer类
Reader和Writer是所有字符流类得抽象基类,用于简化对字符串的输入输出编程,即用于读写文本数据。
二进制文件和文本文件的区别。
各种文件文件都是由一个或多个字节组成的。
文本文件只是二进制文件的一种特例。
如果一个文件专用于存储文本字符,而没有包含字符之外的其他数据就称之为文本文件,除此之外的文件就是二进制文件。Reader与Writer类主要用于读写文本格式的内容,而InputStream类和OutputStream类则主要用于读写二进制格式的内容。
FileOutputStream没有用close,也将数据写入了文件中。
他的write仅仅只写入一个字节,内部可能调用了flush()。