第10章输入输出_第1页
第10章输入输出_第2页
第10章输入输出_第3页
第10章输入输出_第4页
第10章输入输出_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 输入输入/ /输出处理是程序设计中重要的一个部分,比如从键盘读取数据、从输出处理是程序设计中重要的一个部分,比如从键盘读取数据、从文件中读取数据或向文件中写数据等等。文件中读取数据或向文件中写数据等等。javajava把这些不同类型的输入、把这些不同类型的输入、输出源抽象为流(输出源抽象为流(streamstream),用统一接口来表示,从而使程序简单明了。),用统一接口来表示,从而使程序简单明了。本章主要介绍本章主要介绍javajava程序输入输出的实现和文件与目录的管理。程序输入输出的实现和文件与目录的管理。 本章要点本章要点l10.1 输入与输出基础输入与输出基础l10.2 文件输入文

2、件输入/输出输出l思考与练习思考与练习10java的输入输出功能必须使用类库java.io来实现,这个类库中的类大部分是用来完成流式输入输出的类。java applet程序的特点如下。10.1.1 流的概念流的概念流式输入输出是一种很常见的输入输出方式。流是指在计算机的输入与输出之间运动的数据序列。流序列中的数据既可以是未经加工的原始的二进制数据,也可以是经一定编码处理后符合某种格式规定的特定数据。java程序通过流来完成输入/输出。流通过java的输入/输出系统与物理设备链接。尽管与它们链接的物理设备不尽相同,所有流的行为具有同样的方式。这样,相同的输入/输出类和方法适用于所有类型的外部设备

3、。这意味着一个输入流能够抽象多种不同类型的输入:磁盘文件,键盘或网络套接字。同样,一个输出流可以输出到控制台,磁盘文件或相连的网络。java中流的实现是在java.io包定义的类层次结构内部的。在java中,把不同类型的输入、输出源(键盘、文件、网络等)抽象为流(stream),而其中输入或输出的数据则称为数据流(data stream),用统一的方式来表示,从而使程序设计简单明了。输入流只能从中读取数据,而不能向其写出数据;输出流只能向其写出数据,而不能从中读取数据。10.1.2 字节流与字符流字节流与字符流java定义了两种类型的流:字节类和字符类。它们属于基本输入/输出流类,是其他输入/

4、输出流类的父类。字节流(byte stream)为处理字节的输入和输出提供了方便的方法,例如,使用字节流读取或书写二进制数据。字符流(character stream)为字符的输入和输出处理提供了方便。它们采用了统一的编码标准,因而可以国际化。当然,在某些场合,字符流比字节流更有效。需要声明:在最底层,所有的输入/输出都是字节形式的。基于字符的流只为处理字符提供方便有效的方法。下面是对字节流和字符流的介绍。字节流类字节流由两个类层次结构定义。在顶层有两个抽象类:inputstream 和 outputstream。每个抽象类都有多个具体的子类,这些子类对不同的外设进行处理,例如磁盘文件,网络连

5、接,甚至是内存缓冲区。需要说明的是,要使用流类,必须导入java.io包。书中表10-1显示了字节流类。 10.1.2 字节流与字符流字节流与字符流抽象类inputstream 和 outputstream定义了实现其他流类的关键方法。最重要的两种方法是read()和write(),它们分别对数据的字节进行读写。两种方法都在inputstream 和outputstream中被定义为抽象方法,它们被派生的流类重载。inputstream类中的常用方法有:int read():从输入流中读一个字节,形成一个0255之间的整数返回(是一个抽象方法)。int read(byte b):读多个字节到数

6、组中。int read(byte b, int off, int len):从输入流中读取长度为len的数据,写入数组b中从索引off开始的位置,并返回读取的字节数。对于这三个方法,若返回1,表明流结束。10.1.2 字节流与字符流字节流与字符流skip():跳过流中若干字节数available():返回流中可用字节数mark():在流中标记一个位置reset():返回标记过得位置marksupport():是否支持标记和复位操作close():关闭流outputstream类的常用方法有:write(int b):将一个整数输出到流中(只输出低位字节,抽象方法)nwrite(byte b):

7、将字节数组中的数据输出到流中nwrite(byte b, int off, int len):将数组b中从off指定的位置开始,长度为len的数据输出到流中flush():刷空输出流,并将缓冲区中的数据强制送出close():关闭流10.1.2 字节流与字符流字节流与字符流字符流类字符流类由两个类层次结构定义。顶层有两个抽象类:reader和writer。这些抽象类处理统一编码的字符流。java中这些类含有多个具体的子类。字符流类如书中表10-2所示。 抽象类reader和writer定义了几个实现其他流类的关键方法。其中两个最重要的是read()和write(),它们分别进行字符数据的读和写

8、。这些方法被派生流类重载。java的输入/输出类库中包含的流类很多,这里只作了一个简要的介绍。更详细的内容可以参看类库手册。 10.1.3 标准输入标准输入/输出输出java程序使用字符界面与系统标准输入输出间进行数据通信,即从键盘读入数据,或向屏幕输出数据,是十分常见的操作。为此而频频创建输入输出流类对象将很不方便。因此,java系统事先定义好三个流对象,分别与系统的标准输入、标准输出和标准错误输出相联系。所有的java程序自动导入java.lang包。该包定义了一个名为system的类,该类封装了运行时环境的多个方面。例如,使用它的某些方法,你能获得当前时间和与系统有关的不同属性。syst

9、em 同时包含三个预定义的流变量:in,out和err。这些成员在system中是被定义成public和static型的,这意味着它们可以不引用特定的system对象而被用于程序的其他部分。10.1.3 标准输入标准输入/输出输出system.out是标准的输出流,默认情况下,它指的是显示设备。system.in是标准输入,默认情况下,它指的是键盘。system.err指的是标准错误流,它默认是显示设备。这些流也可以重定向到任何兼容的输入/输出设备。system.in 是inputstream的对象;system.out和system.err是printstream的对象。尽管它们用来读写外设

10、的字符,但它们都是字节流。(1)标准输入java的标准输入system.in是inputstream类的对象,当程序中需要从键盘读入数据的时候,只需调用system.in的read()方法即可。如下面的语句将从键盘读入一个字节的数据:char ch = system.in.read();10.1.3 标准输入标准输入/输出输出在使用system.in.read()方法读入数据时,需要注意如下几点:system.in.read()语句必须包含在try块中,且try块后面应该有一个可接收ioexception异常的catch块。如下例所示:try ch = system.in.read(); ca

11、tch(ioexception e) 执行system.in.read()方法将从键盘缓冲区读入一个字节的数据,然而返回的却是16比特的整型量的低位字节是真正输入的数据,其高位字节是全零。10.1.3 标准输入标准输入/输出输出另外,作为inputstream类的对象,system.in只能从键盘读取二进制的数据,而不能把这些比特信息转换为整数、字符、浮点数或字符串等复杂数据类型的量。当键盘缓冲区中没有未被读取的数据时,执行system.in.read()将导致系统转入阻塞(block)状态。在阻塞状态下,当前流程将停留在上述语句位置且整个程序被挂起,等待用户输入一个键盘数据后,才能继续运行下

12、去;所以程序中有时利用system.in.read()语句来达到暂时保留屏幕的目的。例如,下面的语句段:system.out.println(press any key to finish the program);try char test=(char)system.in.read( );catch(ioexception e) 10.1.3 标准输入标准输入/输出输出(2) 标准输出java的标准输出system.out是打印输出流printstream类的对象。printstream是过滤输出类流filteroutputstream的一个子类,其中定义了向屏幕输送不同类型数据的方法pri

13、nt()和println()。println()方法有多种形式,概括起来可表述为:public void println ( 类型 变量或对象 );println()的作用是向屏幕输出其参数指定的变量或对象,然后再换行,使光标停留在屏幕下一行第一个字符的位置。如果println()方法的参数为空,则将输出一个空行。println()方法可输出多种不同类型的变量或对象,包括boolean,double,float,int,long类型的变量以及object类的对象。print()方法的使用情况与println()方法完全相同,也可以实现在屏幕上输出不同类型的变量和对象的操作。不同的是,print

14、()方法输出对象后并不附带一个回车,下一次输出时,将输出在同一行中。java提供了一系列的读写文件的类和方法。在java中,所有文件都是字节形式的。java提供从文件读写字节的方法,而且允许在字符形式的对象中使用字节文件流。10.2.1 java文件和目录管理文件和目录管理文件是用来保存数据的,目录是管理文件的特殊机制,同类文件保存在同一个目录下可以简化文件管理。因此,掌握文件和目录的操作对于编程人员是十分必须的。java支持文件管理和目录管理,它们都是由专门的java.io.file类来实现。file类也属于javaio包中,但它不是inputstream或者outputstream的子类。

15、每个file类的对象表示一个磁盘文件或目录,其对象属性中包含了文件或目录的相关信息,如名称、长度、所含文件个数等,调用它的方法则可以完成对文件或目录的常用管理操作,如创建、删除等。10.2.1 java文件和目录管理文件和目录管理1创建创建file类的对象类的对象每个file类的对象都对应了系统的一个磁盘文件或目录,所以创建file类对象时需指明它所对应的文件或目录名。file类共提供了三个不同的构造方法,以不同的参数形式灵活地接收文件和目录名信息。(1)file(string path):字符串参数path指明了新创建的file对象对应的磁盘文件或目录名及其路径名。path参数也可以对应磁盘

16、上的某个目录,如“c:javatemp”或“javatemp”。(2)file(string path,string name):第一个参数path表示所对应的文件或目录的绝对或相对路径,第二个参数name表示文件或目录名。这里将路径与名称分开的好处是相同路径的文件或目录可共享同一个路径字符串,管理、修改都较方便。(3)file(file dir,string name):这个构造方法使用另一个已经存在的代表某磁盘目录的file对象作为第一个参数,表示文件或目录的路径,第二个字符串参数表述文件或目录名。10.2.1 java文件和目录管理文件和目录管理2获取文件或目录属性获取文件或目录属性一个

17、对应于某磁盘文件或目录的file对象一经创建,就可以通过调用它的方法来获得该文件或目录的属性。其中,较常用的方法如下:(1)判断文件或目录是否存在:pub1ic boo1ean exists();若文件或目录存在,则返回true;否则返回false(2)判断是文件还是目录:public boolean isfile();若对象代表有效文件,则返回truepub1ic boolean isdirectory();若对象代表有效目录,则返回true10.2.1 java文件和目录管理文件和目录管理2获取文件或目录属性获取文件或目录属性(3)获取文件或目录名称与路径:public string ge

18、tname();返回文件名或目录名public string getpath();返回文件或目录的路径(4)获取文件的长度:public long length();返回文件的字节数(5)获取文件读写属性public boolean canread();若文件为可读文件,则返回true,否则返回falsepublic boolean canwrite();若文件为可写文件,返回true,否则返回false 10.2.1 java文件和目录管理文件和目录管理2获取文件或目录属性获取文件或目录属性(6)列出目录中的文件:public strins list();将目录中所有文件名保存在字符串数组中

19、返回(7)比较两个文件或目录public boolean equals(file f);若两个file对象相同,则返回true10.2.1 java文件和目录管理文件和目录管理3文件或目录操作文件或目录操作file类中还定义了一些对文件或目录进行管理、操作的方法,常用的有如下几种:(1)重命名文件:pub1ic boolean renameto(filenewfile);将文件重命名成newfile对应的文件名(2)删除文件:public void delete();将当前文件删除(3)创建目录:public boolean mkdir();创建当前目录的子目录 10.2.2 文件输入文件输入

20、/输出流输出流使用file类,可以方便地建立与某磁盘文件的连接,但是,如果希望从磁盘文件读取数据,或者将数据写入文件,还需要使用文件输入/输出流类fileinputstream和fileoutputstream。下面是它们的形式:fileinputstream(string filename) throws filenotfoundexceptionfileoutputstream(string filename) throws filenotfoundexception这里,filename指定需要打开的文件名。当你创建了一个输入流而文件不存在时,引发filenotfoundexceptio

21、n异常。对于输出流,如果文件不能生成,则引发filenotfound exception异常。如果一个输出文件被打开,所有原先存在的同名的文件被破坏。10.2.2 文件输入文件输入/输出流输出流当你对文件的操作结束后,需要调用close( )来关闭文件。该方法在fileinputstream和fileoutputstream中都有定义。例如:void close( ) throws ioexception为读文件,可以使用在fileinputstream中定义的read( )方法。例如:int read( ) throws ioexception该方法每次被调用,它仅从文件中读取一个字节并将该

22、字节以整数形式返回。当读到文件尾时,read( )返回-1。该方法可以引发ioexception异常。向文件中写数据,需用fileoutputstream定义的write()方法。它的最简单形式如下:void write(int byteval) throws ioexception该方法按照byteval指定的数向文件写入字节。尽管byteval作为整数声明,但仅低8位字节可以写入文件。如果在写的过程中出现问题,一个ioexception异常被引发。10.2.2 文件输入文件输入/输出流输出流利用文件输入、输出流完成磁盘文件的读写一般应遵循如下的步骤:1 1利用文件名字符串或利用文件名字符串

23、或filefile对象创建输入输出流对象对象创建输入输出流对象fileinputstream有两个常用的构造方法:(1)fileinputstream(string filename);利用文件名(包括路径名)字符串创建从该文件读入数据的输入流。(2)fileinputstream(file f);利用已存在的file对象创建从该对象对应的磁盘文件中读入数据的文件输入流。需要注意的是:无论哪个构造方法,在创建文件输入或输出流时都可能因给出的文件名不对或路径不对,或文件的属性不对等,不能读出文件而造成错误,此时系统会抛出异常filenotfoundexception。所以创建文件输入、输出流并调

24、用构造方法的语句应该被包括在try块中,并有相应的catch块来处理它们可能产生的异常。10.2.2 文件输入文件输入/输出流输出流2 2从文件输入从文件输入/ /输出流中读写数据输出流中读写数据从文件输入、输出流中读写数据有两种方式,一是直接利用fileinputstream和fileoutputstream自身的读写功能;一是以fileinputstream和fileoutputstream为原始数据源,再套接上其他功能较强大的输入、输出流完成文件的读写操作。为了能更方便地从文件中读写不同类型的数据,一般都采用第二种方式,即以fileinputstream和fileoutputstream

25、为数据源完成与磁盘文件的映射连接后,再创建其他流类的对象从fileinputstream和fileoutputstream对象中读写数据。一般较常用的是过滤流的两个子类datainputstream和dataoutputstream,甚至还可以进一步简化为如下写法:fi1e myfi1e= new file (mytextfile );datainputstream din =new datainputstream(new fileinputstream (myeile);dataoutputstream dour=new dataoutputstream(new fileoutputstre

26、am(myfi1e);10.2.3 随机存取文件随机存取文件fileinputstream和fileoutputstream实现的是对磁盘文件的顺序读写,而且读和写要分别创建不同的对象。相比之下,java中还定义了另一个功能更强大,使用更方便的类randomaccessfile,它可以实现对文件的随机读写操作。1 1创建创建randomaccessfilerandomaccessfile对象对象randomaccessfile类有两个构造方法:randomaccessfile(string name, string mode);randomaccessfile(file f, string m

27、ode);无论使用哪个创建randomaccessfile对象,都要求提供两种信息:一个作为数据源的文件,以文件名字符串或文件对象的方式表述;另一个是访问模式字符串,它规定了randomaccessfile对象可以用何种方式打开和访问指定的文件。10.2.3 随机存取文件随机存取文件访问模式字符串mode有两种取值:“r”代表了以只读方式打开文件;“rw”代表以读写方式打开文件,这时用一个对象就可以同时实现读写两种操作。创建randomaccessfile对象时,可能产生两种异常:当指定的文件不存在时,系统将抛出filenotfoundexception;若试图用读写方式打开只读属性的文件或出现了其他输入、输出错误,则会抛出ioexception异常。下面是创建randomaccessfile对象例子:file file1=new file (file1.txt );randomaccessfile myra=new randomaccessfile (file1, rw );10.2.3 随机存取文件随机存取文件2 2对文件位置指针的操作对文件位置指针的操作randomaccessfile实现的是随机读写,即可以在文件的任意位置执行数据读写,而不一定要从前向后操作。要实现这样的功能,必须定义文件位置指针和移动这个指针的方法。randomaccessfile对象的文件位置指针遵

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论