|
Java程序设计辅导资料十四主 题:第九章 文件和流的概念以及字节输入/输出流类(课件)
“不忘初心、牢记使命”主题理论学习:
每周文摘:我们党要始终成为时代先锋、民族脊梁,始终成为马克思主义执政党,自身必须始终过硬。全党要更加自觉地坚定党性原则,勇于直面问题,敢于刮骨疗毒,消除一切损害党的先进性和纯洁性的因素,清除一切侵蚀党的健康肌体的病毒,不断增强党的政治领导力、思想引领力、群众组织力、社会号召力,确保我们党永葆旺盛生命力和强大战斗力。
摘选自《决胜全面建成小康社会,夺取新时代中国特色社会主义伟大胜利》
内 容:
我们这周主要学习《Java程序设计》这门课程的第9章前两节关于文件和流的概念以及字节输入/输出流类的相关内容。希望通过下面的内容能使同学们对此方面的知识有进一步的了解。
知识要点:
文件和文件系统的概念
文件的分类
文件的结构
流的概念和分类
文件流
字符输入/输出流类
字节输入/输出流类
重点与难点:
重点:文件和流的概念、分类
难点:字节输入/输出流类、字符输入/输出流类文件和文件系统
计算机文件属于文件的一种,与普通文件载体不同,计算机文件是以计算机硬盘为载体存储在计算机上的信息集合。文件可以是文本文档、图片、程序等等。文件通常具有三个字母的文件扩展名,用于指示文件类型(例如,图片文件常常以 JPEG 格式保存并且文件扩展名为 .jpg)。
1、系统文件的定义
文件是具有符号名的,在逻辑上具有完整意义的一组相关信息项的有序序列。
信息项是构成文件内容的基本单位。
读指针用来记录文件当前文件之前的读取位置,它指向下一个将要读取的信息项。
写指针用来记录文件当前的写入位置,下一个将要写入的信息项被写到该处。
2、文件的分类
按性质和用途分类:系统文件。用户文件。
按文件的逻辑结构分为:流式文件。记录式文件。
按信息的保存期限分类:临时文件。永久性文件。档案文件。
按文件的物理结构分类:顺序文件。链接文件。索引文件。HASH文件。索引顺序文件。
按文件的存取方式:顺序存取文件。随机存取文件。
UNIX系统中文件分类:普通文件。目录文件。特殊文件。
3、文件的存取方式
文件的存取方式是由文件的性质和用户使用文件的情况决定。
1、顺序存取。
2、随机存取。
磁带是顺序存取。磁盘是随机存取。
4、文件的物理结构
1 顺序结构。
2 链接结构。
3 索引结构。
如果是三级索引,文件长度最大为:256*256*256+256*256+256+10
文件系统最大的一个特点是“按名存取”
文件目录是文件控制块的有序集合。
5、文件系统
文件系统是操作系统用于明确磁盘或分区上的文件的方法和数据结构;即在磁盘上组织文件的方法。也指用于存储文件的磁盘或分区,或文件系统种类。因此,可以说"我有2个文件系统"意思是他有2个分区,一个存文件,或他用 "扩展文件系统",意思是文件系统的种类。
磁盘或分区和它所包括的文件系统的不同是很重要的。少数程序(包括最有理由的产生文件系统的程序)直接对磁盘或分区的原始扇区进行操作;这可能破坏一个存在的文件系统。大部分程序基于文件系统进行操作,在不同种文件系统上不能工作。
一个分区或磁盘能作为文件系统使用前,需要初始化,并将记录数据结构写到磁盘上。这个过程就叫建立文件系统。二、 流
1、流的概念
在计算机编程中,流就是一个类的对象,很多文件的输入输出操作都以类的成员函数的方式来提供。
计算机中的流其实是一种信息的转换。它是一种有序流,因此相对于某一对象,通常我们把对象接收外界的信息输入(Input)称为输入流,相应地从对象向外输出(Output)信息为输出流,合称为输入/输出流(I/O Streams)。对象间进行信息或者数据的交换时总是先将对象或数据转换为某种形式的流,再通过流的传输,到达目的对象后再将流转换为对象数据。所以,可以把流看作是一种数据的载体,通过它可以实现数据交换和传输。
流的分类
输入流:在java中,可从中读出一系列字节的对象称为“输入流”。
输出流:能向其中写入一系列字节的对象称为“输出流”。
我们将向输出流写入数据信息的叫数据源;我们将从输入流读取数据信息的叫目的地。
数据源和目的地可以是(而且经常)文件,但它们也可能是一个网络连接(),
甚至一个内存块。所有数据最终都要保存为一系列字节。
java中以抽象类InputStream 和OutputStreaml来实现单字节的字符。
以抽象类Reader和Writer(它们的子类)来实现来专门处理采用Unicode(每个字符都使用了双字节)格式保存的信息。
流的抽象类分析
InputStream类
InputStream类提供了一个抽象方法:
public abstract int read() throws IOException
方法说明:返回可读取一个字节,并将它返回;假如它遇到输入源的结尾,就会返回一个-1。
通常覆盖这个方法,以便提供更有用的功能。例如:在FileInputStream类中,这个方法会从一个文件中读入一个字节。System.in是InputStream的一个字类预先定义好的对象,允许我们从键盘读取信息。
InputStream类也提供了非抽象方法,用于读取一个字节数组,或者跳过一定数量的字节。这些方法会调用抽象的read方法,所以子类只需覆盖一个方法。
OutputStream类
OutputStream类定义了下述抽象方法:
public abstract void write(int b) throws IOException
方法说明:它可将一个字节写到指定的输出位置。
无论read还是write方法都可能造成一个线程的延误,直到字节被实际读出或写入为止。换言之,假如字节不能马上读出或写入(通常是由于繁忙的网络连接),java就会暂停(挂起)包含了此次调用的那个线程。这样一来,其它线程就有机会在方法等待期间,做一些更有用的事情。
完成了对数据流的读取或写入操作,请记住用恰当的close方法将其关闭,这是由于流会占用操作系统有限的资源。特别指出的是,假如你没有关闭一个文件,最后一个字节包便可能永远都不会投递出去。也可用flush方法来人工刷新(清空)输出缓冲。
由于程序很少需要读写字节流,更多的是对数字、字串以及对象等等。JAVA为我们提供了多种流类,均是从基本的InputStream和OutputStream类衍生出来的。利用这些类,便可直接对常见格式的数据进行操作;而不必操作那些原始的字节流。
2、文件流
1、定义:FileInputStream和FileOutputStream(文件输入/输出流)是我们能对一个磁盘文件涉及的数据以流的形式流进行输入及输出处理。
2、构造一个文件流:
构造方式一:在构件器中指定文件名,或者完整的路径名。
FileInputStream fin=new FileInputStream("employee.dat");
构造方式二:也可以使用一个File对象构造文件流。
File f=new File("employee");
FileInputStream fin=new FileInputStream(f);
1)、File类的功能:用于访问文件和目录对象。它使用主操作系统的文件命名惯例。通过File类的方法可删除、重命名文件。这些方法检查文件的读和写权限。通过File类的目录
方法来创建、删除、重命名和列出目录。
2)、构造File类
File(String pathname) //通过将给定的路径名字转换成一个抽象的路径名来创建File类对象;
File(String parent,String child) //由父路径名和子路径名的字符串创建出File类的对象;
File(File parent,String child) //由父File类的对象和子路径创建出File类的对象
演示代码:
File file;
file=new File("javaFile") //路径名;
file=new File("\\","javaFile") //父和子路径名;
File dir=new File("\\");
file=new File(dir,"javaFile"); //File对象和路径名;
3、过滤流
抽象的InputStream和OutputStream类允许我们对字串及数字进行读写。为达到这个目的,还需要功能更多的子类。例如:DateInputStream和DataOutputStream允许我们对所有基本的java类型进行读写。
文件流类与抽象的InputStream和OutputStream类相似,这些类也只支持字节级的读写操作。换言之,只能从fin对象中读取字符和字节数组。byte b=fin.read(),他们没有提供专门的数值类型,所以DataInputStream没有办法从一个文件中获取数字。
解决方案:java给流职责分工,某些流(FileInputStream)负责从文件或另一些更特殊的地方读入字节数据。而另一些流
(DataInputStream、PrintWriter)负责将字节“组装”成更有用的数据类型。必须综合运用这两种流,将其合并成所谓的"过滤流(FilteredStreams)",方法是将一个现成的流传递给另一个流的构建器。
4、随机存取文件
上述演示中,对文件的读写,总是从头开始,当向文件中存取信息,会产生原文信息被覆盖的情况。同时希望可从文件的任意位置读取。
RandomAccessFile(随机存取文件)是一种特殊的流类,可用它查找或写入文件的任何地方的数据。它同时实现了DataInput和DataOutput两个接口。磁盘文件采用的是随机存取方式,但来自一个网络的数据流却不是这样。打开一个随机文件后,要么只对其进行读操作。要么需要同时进行读写。
构造一个随机存取文件类
RandomAccessFile(String name,String mode) //name:系统专用文件名
mode:"r"代表只读;"rw"代表可读写
RandomAccessFile(File file ,String mode) //file:封装了特殊系统专用文件名的一个File对象
mode:"r"代表只读;"rw"代表可读写三、 字节输入/输出流类
字节流包括字节输入流和字节输出流,这两大类别都是由多个类组成的,InputStream类及其子类实现多种字节输入流,OutStream类及其子类实现多种字节输出流。
在Java SE中有两个类用来作流的抽象表示:java.io.InputStream与java.io.OutputStream。
InputStream 是所有表示位输入流的类之父类,它是一个抽象类,继承它的子类要重新定义其中所定义的抽象方法。InputStream是从装置来源地读取数据的抽象表示,例如System中的标准输入流in对象就是一个InputStream类型的实例。在Java程序开始之后,in流对象就会开启,目的是从标准输入装置中读取数据,这个装置通常是键盘或是用户定义的输入装置。
OutputStream 是所有表示位输出流的类之父类,它是一个抽象类。子类要重新定义其中所定义的抽象方法,OutputStream是用于将数据写入目的地的抽象表示。例如 System中的标准输出流对象out其类型是java.io.PrintStream,这个类是OutputStream的子类 (java.io.FilterOutputStream继承OutputStream, PrintStream再继承FilterOutputStream)。在程序开始之后,out流对象就会开启,可以通过out来将数据写至目的地装置,这个装置通常是屏幕显示或用户定义的输出装置。
一般来说,很少直接实现InputStream或OutputStream上的方法,因为这些方法比较低级,通常会实现它们的子类。这些子类上所定义的方法在进行输入/输出时更为方便。
1、FileInputStream和FileOutputStream
java.io.FileInputStream 是InputStream的子类。从开头File名称上就可以知道,FileInputStream与从指定的文件中读取数据至目的地有关。而 java.io.FileOutputStream是OutputStream的子类,顾名思义,FileOutputStream主要与从来源地写入数据至指定的文件中有关。
当建立一个FileInputStream或FileOutputStream的实例时,必须指定文件位置及文件名称,实例被建立时文件的流就会开启;而不使用流时,必须关闭文件流,以释放与流相依的系统资源,完成文件读/写的动作。
FileInputStream可以使用 read()方法一次读入一个字节,并以int类型返回,或者是使用read()方法时读入至一个byte数组,byte数组的元素有多少个,就读入多少个字节。在将整个文件读取完成或写入完毕的过程中,这么一个byte数组通常被当作缓冲区,因为这么一个byte数组通常扮演承接数据的中间角色。
2、BufferedInputStream和BufferedOutputStream
在介绍FileInputStream和 FileOutputStream的例子中,使用了一个byte数组来作为数据读入的缓冲区,以文件存取为例,硬盘存取的速度远低于内存中的数据存取速度。为了减少对硬盘的存取,通常从文件中一次读入一定长度的数据,而写入时也是一次写入一定长度的数据,这可以增加文件存取的效率。
java.io.BufferedInputStream 与java.io.BufferedOutputStream可以为InputStream、OutputStream类的对象增加缓冲区功能。构建 BufferedInputStream实例时,需要给定一个InputStream类型的实例,实现BufferedInputStream时,实际上最后是实现InputStream实例。同样地,在构建BufferedOutputStream时,也需要给定一个OutputStream实例,实现 BufferedOutputStream时,实际上最后是实现OutputStream实例。
BufferedInputStream的数据成员buf是一个位数组,默认为2048字节。当读取数据来源时,例如文件,BufferedInputStream会尽量将buf填满。当使用read ()方法时,实际上是先读取buf中的数据,而不是直接对数据来源作读取。当buf中的数据不足时,BufferedInputStream才会再实现给定的InputStream对象的read()方法,从指定的装置中提取数据。例题
一、填空题
1、在操作系统中,对设备的访问是基于()进行的。
2、()是文件系统组织和管理文件的基本单位。
3、按照文件的逻辑结构,文件可被划分为两大类:()和()。
4、流是指一组有顺序的、有起点和终点的()集合。
5、文件的存取方法主要有()、()和()等。
6、java.io.FileInputStream 是()的子类。例题答案
一、填空题
1、文件
2、目录
3、流式文件、记录式文件
4、字节
5、顺序存储、随机存取、索引存取
6、InputStream本内容由易百教育整理发布
网址www.openhelp100.com
QQ 515224986
|
|