第十周课程总结

第十周课程总结

一、RandomAccessFile

用途:File类只是针对文件本身进行操作,而如果想对文件内容进行操作,则可以使用RandomAccessFile类,此类属于随机读取类,可以随机的读取一个文件中指定位置的数据。

RandomAccessFile类的常用操作方法:

注意:如果使用了rw的方式声明RandomAccessFile对象时,要写入的文件不存在,系统将会自动进行创建。

二、字节流与字符流

流:在程序中所有的数据都是以 流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成。如下图所示:

定义:在java.io包中流的操作主要有字节流和字符流两大类,两类都有输入和输出操作。在字节流中输出数据主要使用OutputStream类完成,输入使用的是InputStream类,在字符流中输出的主要是Writer类完成,输入主要是使用Reader类完成。

操作流程:在JavaIO操作也是有相应步骤的,以文件的操作为例,主要的操作流程如下:

(1)使用File类打开一个文件。

(2)通过字节流或字符流的子类指定输出的位置。

(3)进行读/写操作。

(4)关闭输入/输出。

字节流

字节流主要是操作byte类型数据,以byte数组为准,主要的操作就是OutputStream类和InputStream类。

字节输出流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,则表示在文件的末尾追加内容。

字节输入流InputStream

定义:程序可以通过InputStream类从文件中把内容读取进来。定义如下:

public abstract class InputStream
extends Object
implements Closeable

OutputStream类一样,InputStream本身也是一个抽象类,必须依靠其子类,如果从文件中读取,子类肯定是FileInputStream

InputStream类的常用方法:

FileInputStream类的构造方法如下:

public FileInputStream(File file)throws FileNotFoundException

字符流

在程序中一个字符等于两个字节,Java提供了ReaderWriter两个专门操作字符流的类。

字符输出流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

五、字节流与字符流的区别

字节流在操作的时候本身不会用到缓冲区,是于文件本身直接操作,而字符流在操作的时候使用到了缓冲区,通过缓冲区再操作文件,如下图所示:

六、缓冲区

定义:缓冲区可以简单的理解为一段内存区域,在某些情况下,如果一个程序频繁的操作一个资源,则性能会很低,此时为了提升性能,就可以将一部分数据暂时读入到内存的一块区域之中,之后直接从此区域中读取数据即可,因为读取内存的速度会比较快,这样就可以提升程序的性能。

七、字节流与字符流的选择

所有的文件在硬盘存储或在传输的时候都是以字节的方式进行的,包括图片等都是按照字节的方式存储的,而字符是只有在内存中才会形成,所以在开发中,字节流使用较为广泛。

八、转换流——OutputStreamWriter类与InputStreamReader

定义:在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在一组字节流——字符流的转换类。

(1)OutputStreamWriter:是Writer的子类,将输出的字符流变为字节流,即将一个字符流的输出对象变为字节流的输出对象。

(2)InputStreamReader:是Reader的子类,将输入的字节流变成字符流,即将一个字节流的输入对象变为字符流的输入对象。

九、转换步骤

以文件操作为例,则在内存中的字符数据需要通过OutputStreamWriter变为字节流才能保存在文件中,读取时需要将读入的字节流通过InputStreamReader变为字符流,如下图所示:

十、FileWriterFileReader的说明

JDK文档中可以知道FileOutoutStreamOutputStream的直接子类,FileInputStream也是InputStream的直接子类,但是在字符流文件的两个操作类却有点特殊,FileWriter并不直接是Writer的子类,而是OutputStreamWriter的子类,而FileReader也不直接是Reader的子类,而是InputStreamReader的子类,中间都需要进行转换操作,从这两个类的继承关系就可以清楚的发现,不管是使用字节流还是字符流最终都是以字节的形式操作输入/输出流的。

十一、内存操作流

在流的操作中除了进行文件的输入与输出操作之外,也可以针对内存进行同样的操作。

(1)字节内存流:ByteArrayInputStream(内存字节输入流)、ByteArrayOutputStream(内存字节输出流)。

(2)字符内存流:CharArrayReader(内存字符输入流)、CharArrayWriter(内存字符输出流)。

操作步骤:

ByteArrayInputStream类的主要方法:

ByteArrayOutputStream类的主要方法:

ByteArrayInputStream主要是使用构造方法将全部的内容读取到内存中的,如果想要把内容从内存中取出,则可以使用ByteArrayOutputStream类。

十二、管道流

管道流的主要作用是可以进行两个线程间的通信,分为管道输出流(PipedOutputStream)、管道输入流(PipedInputStream)。如果想进行管道输出,则必须把输出流连接在输入流上,在PipedOutputSream类上有如下方法用于连接管道。

public void connect(PipedInputStream snk)throws IOException

十三、打印流

在整个IO包中,打印流是输出信息最方便的类,主要包含字节打印流(PrintStream)和字符打印流(PrintWriter)。打印流提供了非常方便的打印功能,可以打印任何的数据类型,如小数、整数、字符串等。

PrintStream类的常用方法:

十四、格式化输出

JDK1.5之后,Java又对PrintStream类进行了扩充,增加了格式化的输出方式,直接使用printf()方法就可以完成操作。但是在进行格式化输出的时候需要指定其输出的数据类型。

格式化输出:

十五、System类的常量

System表示系统类,对IO给予了一定的支持。

System类的常量:

十六、System.out

System.outPrintStream的对象,在PrintStream中定义了一系列的print()println()方法,所以之前使用的System.out.print()System.out.println()语句调用的实际上就是PrintStream类的方法。

既然此对象表示的是向显示器上输出,而PrintStream又是OutputStream的子类,所以,可以直接利用此对象向屏幕上输出信息。

使用OutputStream向屏幕上输出:

十七、System.err

System.err表示的是错误信息输出,如果程序出现错误,则可以直接使用System.err进行打印。

打印错误信息:

十八、System.in

System.in实际上是一个键盘的输入流,其本身是InputStream类型的对象。那么此时就可以利用此方法完成从键盘上读取数据的功能。

十九、System.outSystem.err的区别

System.outSystem.err都是PrintStream的实例化对象,而且通过实例化代码可以发现,两者都可以输出错误信息,但是System.out一般是将信息显示给用户看,是正常的信息显示,而System.err的信息正好相反,是不希望用户看到的,会直接在后台打印,是专门显示错误的。如下图所示:

如果想输出错误信息最好不要使用System.out而是直接使用System.err,这一点只能从概念上划分,在Eclipse上使用System.err打印的异常信息是红色的,而使用System.out打印的异常信息是普通颜色的。

二十、最好的输入方式

最好的输入方式是将全部输入的数据暂时放到一块内存中,然后一次性从内存中读取出数据,如下图所示:

这样所有的数据只读一次,则不会造成乱码,而且也不会受长度的限制,如果要完成这样的操作则可以使用BufferedReader类完成。

二十一、输入/输出重定向

通过System类也可以改变System.in的输入来源以及System.outSystem.err两个输出流的输出位置。

System类的重定向方法:

posted @ 2019-10-29 22:55  代码不是我的菜  Views(277)  Comments(2Edit  收藏  举报