Java语言程序设计案例教程第10章

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第10章输入与输出输入/输出处理是程序设计中重要的一个部分,比如从键盘读取数据、从文件中读取数据或向文件中写数据等等。Java把这些不同类型的输入、输出源抽象为流(stream),用统一接口来表示,从而使程序简单明了。本章主要介绍Java程序输入输出的实现和文件与目录的管理。本章要点10.1输入与输出基础10.2文件输入/输出思考与练习1010.1输入与输出基础Java的输入输出功能必须使用类库java.io来实现,这个类库中的类大部分是用来完成流式输入输出的类。JavaApplet程序的特点如下。10.1.1流的概念流式输入输出是一种很常见的输入输出方式。流是指在计算机的输入与输出之间运动的数据序列。流序列中的数据既可以是未经加工的原始的二进制数据,也可以是经一定编码处理后符合某种格式规定的特定数据。Java程序通过流来完成输入/输出。流通过Java的输入/输出系统与物理设备链接。尽管与它们链接的物理设备不尽相同,所有流的行为具有同样的方式。这样,相同的输入/输出类和方法适用于所有类型的外部设备。这意味着一个输入流能够抽象多种不同类型的输入:磁盘文件,键盘或网络套接字。同样,一个输出流可以输出到控制台,磁盘文件或相连的网络。Java中流的实现是在java.io包定义的类层次结构内部的。在Java中,把不同类型的输入、输出源(键盘、文件、网络等)抽象为流(Stream),而其中输入或输出的数据则称为数据流(DataStream),用统一的方式来表示,从而使程序设计简单明了。输入流只能从中读取数据,而不能向其写出数据;输出流只能向其写出数据,而不能从中读取数据。10.1输入与输出基础10.1.2字节流与字符流Java定义了两种类型的流:字节类和字符类。它们属于基本输入/输出流类,是其他输入/输出流类的父类。字节流(bytestream)为处理字节的输入和输出提供了方便的方法,例如,使用字节流读取或书写二进制数据。字符流(characterstream)为字符的输入和输出处理提供了方便。它们采用了统一的编码标准,因而可以国际化。当然,在某些场合,字符流比字节流更有效。需要声明:在最底层,所有的输入/输出都是字节形式的。基于字符的流只为处理字符提供方便有效的方法。下面是对字节流和字符流的介绍。字节流类字节流由两个类层次结构定义。在顶层有两个抽象类:InputStream和OutputStream。每个抽象类都有多个具体的子类,这些子类对不同的外设进行处理,例如磁盘文件,网络连接,甚至是内存缓冲区。需要说明的是,要使用流类,必须导入java.io包。书中表10-1显示了字节流类。10.1输入与输出基础10.1.2字节流与字符流抽象类InputStream和OutputStream定义了实现其他流类的关键方法。最重要的两种方法是read()和write(),它们分别对数据的字节进行读写。两种方法都在InputStream和OutputStream中被定义为抽象方法,它们被派生的流类重载。InputStream类中的常用方法有:intread():从输入流中读一个字节,形成一个0~255之间的整数返回(是一个抽象方法)。intread(byteb[]):读多个字节到数组中。intread(byteb[],intoff,intlen):从输入流中读取长度为len的数据,写入数组b中从索引off开始的位置,并返回读取的字节数。对于这三个方法,若返回-1,表明流结束。10.1输入与输出基础10.1.2字节流与字符流skip():跳过流中若干字节数available():返回流中可用字节数mark():在流中标记一个位置reset():返回标记过得位置markSupport():是否支持标记和复位操作close():关闭流OutputStream类的常用方法有:write(intb):将一个整数输出到流中(只输出低位字节,抽象方法)nwrite(byteb[]):将字节数组中的数据输出到流中nwrite(byteb[],intoff,intlen):将数组b中从off指定的位置开始,长度为len的数据输出到流中flush():刷空输出流,并将缓冲区中的数据强制送出close():关闭流10.1输入与输出基础10.1.2字节流与字符流字符流类字符流类由两个类层次结构定义。顶层有两个抽象类:Reader和Writer。这些抽象类处理统一编码的字符流。Java中这些类含有多个具体的子类。字符流类如书中表10-2所示。抽象类Reader和Writer定义了几个实现其他流类的关键方法。其中两个最重要的是read()和write(),它们分别进行字符数据的读和写。这些方法被派生流类重载。Java的输入/输出类库中包含的流类很多,这里只作了一个简要的介绍。更详细的内容可以参看类库手册。10.1输入与输出基础10.1.3标准输入/输出Java程序使用字符界面与系统标准输入输出间进行数据通信,即从键盘读入数据,或向屏幕输出数据,是十分常见的操作。为此而频频创建输入输出流类对象将很不方便。因此,Java系统事先定义好三个流对象,分别与系统的标准输入、标准输出和标准错误输出相联系。所有的Java程序自动导入java.lang包。该包定义了一个名为System的类,该类封装了运行时环境的多个方面。例如,使用它的某些方法,你能获得当前时间和与系统有关的不同属性。System同时包含三个预定义的流变量:in,out和err。这些成员在System中是被定义成public和static型的,这意味着它们可以不引用特定的System对象而被用于程序的其他部分。10.1输入与输出基础10.1.3标准输入/输出System.out是标准的输出流,默认情况下,它指的是显示设备。System.in是标准输入,默认情况下,它指的是键盘。System.err指的是标准错误流,它默认是显示设备。这些流也可以重定向到任何兼容的输入/输出设备。System.in是InputStream的对象;System.out和System.err是PrintStream的对象。尽管它们用来读写外设的字符,但它们都是字节流。(1)标准输入Java的标准输入System.in是InputStream类的对象,当程序中需要从键盘读入数据的时候,只需调用System.in的read()方法即可。如下面的语句将从键盘读入一个字节的数据:charch=System.in.read();10.1输入与输出基础10.1.3标准输入/输出在使用System.in.read()方法读入数据时,需要注意如下几点:System.in.read()语句必须包含在try块中,且try块后面应该有一个可接收IOException异常的catch块。如下例所示:try{ch=System.in.read();}catch(IOExceptione){…}执行System.in.read()方法将从键盘缓冲区读入一个字节的数据,然而返回的却是16比特的整型量的低位字节是真正输入的数据,其高位字节是全零。10.1输入与输出基础10.1.3标准输入/输出另外,作为InputStream类的对象,System.in只能从键盘读取二进制的数据,而不能把这些比特信息转换为整数、字符、浮点数或字符串等复杂数据类型的量。当键盘缓冲区中没有未被读取的数据时,执行System.in.read()将导致系统转入阻塞(block)状态。在阻塞状态下,当前流程将停留在上述语句位置且整个程序被挂起,等待用户输入一个键盘数据后,才能继续运行下去;所以程序中有时利用System.in.read()语句来达到暂时保留屏幕的目的。例如,下面的语句段:System.out.println(Pressanykeytofinishtheprogram);try{chartest=(char)System.in.read();}catch(IOExceptione){…}10.1输入与输出基础10.1.3标准输入/输出(2)标准输出Java的标准输出System.out是打印输出流PrintStream类的对象。PrintStream是过滤输出类流FilterOutputStream的一个子类,其中定义了向屏幕输送不同类型数据的方法print()和println()。println()方法有多种形式,概括起来可表述为:publicvoidprintln(类型变量或对象);println()的作用是向屏幕输出其参数指定的变量或对象,然后再换行,使光标停留在屏幕下一行第一个字符的位置。如果println()方法的参数为空,则将输出一个空行。println()方法可输出多种不同类型的变量或对象,包括boolean,double,float,int,long类型的变量以及Object类的对象。print()方法的使用情况与println()方法完全相同,也可以实现在屏幕上输出不同类型的变量和对象的操作。不同的是,print()方法输出对象后并不附带一个回车,下一次输出时,将输出在同一行中。10.2文件输入/输出Java提供了一系列的读写文件的类和方法。在Java中,所有文件都是字节形式的。Java提供从文件读写字节的方法,而且允许在字符形式的对象中使用字节文件流。10.2.1Java文件和目录管理文件是用来保存数据的,目录是管理文件的特殊机制,同类文件保存在同一个目录下可以简化文件管理。因此,掌握文件和目录的操作对于编程人员是十分必须的。Java支持文件管理和目录管理,它们都是由专门的java.io.File类来实现。File类也属于java.io包中,但它不是InputStream或者OutputStream的子类。每个File类的对象表示一个磁盘文件或目录,其对象属性中包含了文件或目录的相关信息,如名称、长度、所含文件个数等,调用它的方法则可以完成对文件或目录的常用管理操作,如创建、删除等。10.2文件输入/输出10.2.1Java文件和目录管理1.创建File类的对象每个File类的对象都对应了系统的一个磁盘文件或目录,所以创建File类对象时需指明它所对应的文件或目录名。File类共提供了三个不同的构造方法,以不同的参数形式灵活地接收文件和目录名信息。(1)File(Stringpath):字符串参数path指明了新创建的File对象对应的磁盘文件或目录名及其路径名。path参数也可以对应磁盘上的某个目录,如“c:\java\temp”或“java\temp”。(2)File(Stringpath,Stringname):第一个参数path表示所对应的文件或目录的绝对或相对路径,第二个参数name表示文件或目录名。这里将路径与名称分开的好处是相同路径的文件或目录可共享同一个路径字符串,管理、修改都较方便。(3)File(Filedir,Stringname):这个构造方法使用另一个已经存在的代表某磁盘目录的File对象作为第一个参数,表示文件或目录的路径,第二个字符串参数表述文件或目录名。10.2文件输入/输出10.2.1Java文件和目录管理2.获取文件或目录属性一个对应于某磁盘文件或目录的File对象一经创建,就可以通过调用它的方法来获得该文件或目录的属性。其中,较常用的方法如下:(1)判断文件或目录是否存在:pub1icboo1eanexists();若文件或目录存在,则返回true;否则返回false(2)判断是文件还是目录:publicbooleanisFile();若对象代表有效文件,则返回truepub1icbooleanisDirectory();若对象代表有效目录,则返回true10.2文件输入/输出10.2.1Java文件和目录管理2.获取文件或目录属性(3)获取文件或目录名称与路径:publicStringgetName();返回文件名或目录名publicStringgetPath();返回文件或目录的路径(4)获取文件的长度:publ

1 / 26
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功