张孝祥java视频学习笔记(六)

时间:2022-11-22 20:20:01

第七讲 IO/输入输出

l File

File类是IO包中唯一代表磁盘文件本身信息的类,而不是文件中的内容。

File类定义了一些与平台无关的方法来操纵文件,例如创建、删除文件和重命名文件。

Java可以正确处理UnixDos的路径分隔符,可以混淆表示文件目录的正斜杠和反斜杠。

delete方法由File对象的路径所表示的磁盘文件或目录,如果删除的对象是目录,则该目录中的内容必须为空。

l RandomAccessFile

RandomAccessFile类支持“随机”访问,但该类仅限于操作文件,不能访问其他的IO设备如网络、内存映像等。

RandomAccessFile类在随机读写等长记录格式的文件时有很大的优势。

l 各种节点流类

流是字节序列的抽象概念。

文件是数据的静态存储形式,而流是指数据传输时的形态。

程序可以从中连续读取字节的对象叫输入流,在Java中,用InputStream类来描述所有输入流的抽象概念。

创建FileInputStream实例对象时,指定文件应当是存在和可读的。创建FileOutputStream实例对象时,如果指定文件已经存在,这个文件中原来的内容将被覆盖清除。

对于同一个磁盘文件创建FileInputStream对象的两种方式:

1FileInputSteam inOne = new FileInputStream(“hello.test”);

2File f = new File(“hello.test”);

   FileInputStream inTwo = new FileInputStream(f);

创建FileOutputStream实例对象时,可以指定还不存在的文件名,不能指定一个已被其他程序打开了的文件。

计算机访问外部设备,要比直接访问内存慢得多。使用内存缓冲区有两个好处,一是有效地提高了CPU的使用率,而是write并没有马上真正写到外设,我们还有机会回滚部分写入的数据。C语言默认情况下都会使用缓冲区,在Java语言中,有的类使用缓冲区,有的不使用。

FileWriter创建实例对象后,该对象使用write方法后要先再使用close方法才会真正把内容写到磁盘文件中,因为使用close()方法关闭文件前会先调用flush方法,flush方法就是用于在缓冲区还没有满的情况下,也将缓冲区的内容强制写入到外部设备包括磁盘文件中,习惯上称这个过程为刷新。而FileOutputStream则不需使用close方法(),说明FileOutputStream没有使用缓冲区。

缓冲区是堆内存中一个连续的块?

如果程序要在运行过程中产生一些临时的文件,采用程序虚拟文件,这样程序就不用访问硬盘,而是直接访问内存,程序运行的效率会极大的提高。

要在内存中产生临时文件,就需要使用字节数组来模拟输入和输出流。

内存虚拟文件或内存映像文件是把一块内存虚拟成一个硬盘上的文件,原来该写到硬盘文件上的内容会被写到这块内存中,原来该从一个硬盘文件上读取内容可以改为从内存中直接读取。

经验:要编程从键盘上连续读取一大段数据时,应尽量将读取数据的过程放在函数中完成,使用-1来作为键盘输入的结束点。在该函数中编写的程序代码不应直接使用system.in读取数据,而是用一个InputStream类型的形式参数对象来读取数据,然后将system.in作为实参传递给InputStream类型的形式参数来调用该函数。

Windows下,按下Ctrl+z组合键可以产生键盘输入流的结束标记,在linux下,则是按下ctrl+D组合键来产生键盘输入流的结束标记。

l 字符编码

ASCII的最高bit位都为0,也就是说ASCII能表示128个字符。

*将每一个中文字符都用两个字节的数字来表示,中文字符的每个字节的最高位bit都为1,*为每个中文字符指定的编码规则称为GB2312(国标码)

GB2312的基础上,对更多的中文字符(包括繁体)进行了编码,新的编码规则称为GBK

在*使用的计算机系统上,GBKGB2312就被称为该系统的本地字符集。

“中国”的“中”字,在*的编码是十六进制的D6D0,而在中国*的编码是十六进制的A4A4,*地区对中文字符集的编码规则称为BIG5(大五码)

l Unicode编码

ISO(国际标准化组织)将全世界的符号进行了统一编码,称之为Unicode编码。

“中”字这个符号,在全世界的任何角落始终对应的都是一个十六进制的数字4e2d

Unicode编码的字符都占用两个字节大小,对于ASCII码所表示的字符,只是简单地在ASCII码原来占用的一个字节前面,增加一个所有bits0的字节。Unicode在全世界范围所表示的字符个数不会超过216次方。

Java中的字符使用的都是Unicode编码,Java在通过Unicode保证跨平台特性的前提下,也支持本地平台字符集。

UTF-8编码的优点:不出现内容为0x00字节;便于应用程序检测数据在传输过程中是否发生了错误;直接处理使用ASCII码的英文文档。缺点:对于某些字符,需要用3个字节来表示。

UTF-16编码在Unicode基础上进行了一些细节上的扩充,增加了对Unicode编码包括的那些字符的表示方式。UTF-16Unicode的扩充并没有影响Unicode编码所包括的那些字符。UTF-16比起UTF-8,好处在于大部分字符都以固定长度的字节 (2字节储存,但UTF-16却无法兼容于ASCII编码。如果文件以0xFE 0xFF这两个字节开头,则表明文本的其余部分是Big EndianUTF-16编码;如果文件以0xFF 0xFE这两个字节开头,则表明文本的其余部分是Little EndianUTF-16编码。

length函数:对于String类实例对象,要写成length();对于byte数组,只需写成length

write:写字节时不会刷新缓冲区,但是写字节数组时会刷新缓冲区。