第十周课程总结
一、RandomAccessFile
类
用途:File
类只是针对文件本身进行操作,而如果想对文件内容进行操作,则可以使用RandomAccessFile
类,此类属于随机读取类,可以随机的读取一个文件中指定位置的数据。
RandomAccessFile
类的常用操作方法:
注意:如果使用了rw
的方式声明RandomAccessFile
对象时,要写入的文件不存在,系统将会自动进行创建。
二、字节流与字符流
流:在程序中所有的数据都是以 流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成。如下图所示:
操作流程:在Java
中IO
操作也是有相应步骤的,以文件的操作为例,主要的操作流程如下:
(1)使用File
类打开一个文件。
(2)通过字节流或字符流的子类指定输出的位置。
(3)进行读/写操作。
(4)关闭输入/输出。
字节流
字节输出流OutputStream
类
OutputStream
是整个IO
包中字节输出流的最大父类,此类的定义如下:
public abstract class OutputStream
extends Object
implements Closeale,Flushable
三、如果要操作一个文件,则可以使用FileOutputStream
类,通过向上转型后,可以为OutputStream
实例化。
OutputStream
类的常用方法:
要想使用上述方法,必须使用子类实例化,此时可以使用FileOutputStream
子类,此类的构造方法如下:
public FileOutputStream(File file)throws FileNotFoundException
操作时必须接受File
类的实例,指明要输出的文件路径。
四、追加新内容
定义:之前的所有操作中,如果重新执行程序,则肯定会覆盖文件中的已有内容,那么此时可以通过FileOutputStream
类中的另一种构造方法进行实例化,向文件中追加内容,此构造方法如下所示:
public FileOutputStream(File file,boolean append)throws FileNotFoundException
在构造方法中如果将append
的值设置为true
,则表示在文件的末尾追加内容。
public abstract class InputStream
extends Object
implements Closeable
public FileInputStream(File file)throws FileNotFoundException
字符流
在程序中一个字符等于两个字节,Java
提供了Reader
和Writer
两个专门操作字符流的类。
字符输出流Writer
Writer
本身是一个字符流的输出类,此类的定义如下:
public abstract class Writer
extends Object
implements Appendable,Closeable,Flushable
此类本身也是一个抽象类,如果要想使用此类,则肯定要使用其子类,此时如果是向文件中写入内容,应该使用FileWriter
的子类。
Writer
类的常用方法:
使用FileWriter
追加文件的内容
定义:在使用字符流操作的时候,也可以实现文件的追加功能,直接使用FileWriter
类中的以下构造方法实现追加
public FileWriter(File file,boolean append)throws IOException
将append
的值设置成true
,就表示追加。
字符输入流
定义:Reader
类是使用字符的方式从文件之中取出数据,Reader
类的定义如下:
public abstract class Reader
extends Object
imp;ements Readable,Closeable
Reader
类本身也是抽象类,如果现在要从文件中读取内容,则可以直接使用FileReader
子类。
Reader
类常用方法:
FileReader
的构造方法定义如下:
public FileReader(File file)throws FileNotFoundException
五、字节流与字符流的区别
字节流在操作的时候本身不会用到缓冲区,是于文件本身直接操作,而字符流在操作的时候使用到了缓冲区,通过缓冲区再操作文件,如下图所示:
六、缓冲区
定义:缓冲区可以简单的理解为一段内存区域,在某些情况下,如果一个程序频繁的操作一个资源,则性能会很低,此时为了提升性能,就可以将一部分数据暂时读入到内存的一块区域之中,之后直接从此区域中读取数据即可,因为读取内存的速度会比较快,这样就可以提升程序的性能。
七、字节流与字符流的选择
所有的文件在硬盘存储或在传输的时候都是以字节的方式进行的,包括图片等都是按照字节的方式存储的,而字符是只有在内存中才会形成,所以在开发中,字节流使用较为广泛。
定义:在整个IO
包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在一组字节流——字符流的转换类。
(1)OutputStreamWriter
:是Writer
的子类,将输出的字符流变为字节流,即将一个字符流的输出对象变为字节流的输出对象。
九、转换步骤
十、FileWriter
和FileReader
的说明
十一、内存操作流
在流的操作中除了进行文件的输入与输出操作之外,也可以针对内存进行同样的操作。
(2)字符内存流:CharArrayReader
(内存字符输入流)、CharArrayWriter
(内存字符输出流)。
操作步骤:
ByteArrayOutputStream
类的主要方法:
十二、管道流
public void connect(PipedInputStream snk)throws IOException
十三、打印流
在整个IO
包中,打印流是输出信息最方便的类,主要包含字节打印流(PrintStream
)和字符打印流(PrintWriter
)。打印流提供了非常方便的打印功能,可以打印任何的数据类型,如小数、整数、字符串等。
PrintStream
类的常用方法:
十四、格式化输出
在JDK1.5
之后,Java
又对PrintStream
类进行了扩充,增加了格式化的输出方式,直接使用printf()
方法就可以完成操作。但是在进行格式化输出的时候需要指定其输出的数据类型。
格式化输出:
十五、System
类的常量
System
表示系统类,对IO
给予了一定的支持。
System
类的常量:
十六、System.out
System.out
是PrintStream
的对象,在PrintStream
中定义了一系列的print()
和println()
方法,所以之前使用的System.out.print()
或System.out.println()
语句调用的实际上就是PrintStream
类的方法。
既然此对象表示的是向显示器上输出,而PrintStream
又是OutputStream
的子类,所以,可以直接利用此对象向屏幕上输出信息。
使用OutputStream
向屏幕上输出:
十七、System.err
System.err
表示的是错误信息输出,如果程序出现错误,则可以直接使用System.err
进行打印。
打印错误信息:
十八、System.in
十九、System.out
和System.err
的区别
System.out
和System.err
都是PrintStream
的实例化对象,而且通过实例化代码可以发现,两者都可以输出错误信息,但是System.out
一般是将信息显示给用户看,是正常的信息显示,而System.err
的信息正好相反,是不希望用户看到的,会直接在后台打印,是专门显示错误的。如下图所示:
如果想输出错误信息最好不要使用System.out
而是直接使用System.err
,这一点只能从概念上划分,在Eclipse
上使用System.err
打印的异常信息是红色的,而使用System.out
打印的异常信息是普通颜色的。
二十、最好的输入方式
最好的输入方式是将全部输入的数据暂时放到一块内存中,然后一次性从内存中读取出数据,如下图所示:
这样所有的数据只读一次,则不会造成乱码,而且也不会受长度的限制,如果要完成这样的操作则可以使用BufferedReader
类完成。
二十一、输入/输出重定向
通过System
类也可以改变System.in
的输入来源以及System.out
和System.err
两个输出流的输出位置。
System
类的重定向方法: