Java基础输入输出_第1页
Java基础输入输出_第2页
Java基础输入输出_第3页
Java基础输入输出_第4页
Java基础输入输出_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

1、Java基础输入输出io包支持Java的基本I/O(输入/输出)系统,包括文件的输入/输出。对输入/输出的支持是来源于Java的内核API库,而不是语言关键字。一、输入/输出基础很多实际的Java应用程序不是基于文本的控制台程序。尽管基于文本的程序作为教学实例是很出色的,它们无法胜任JAVA在实际中的重要应用。Java对外设输入/输出的支持也是有限的,并且用起来有些笨拙甚至是在简单的例子程序中。基于文本的控制台输入/输出对于Java程序并不是十分重要。Java提供了与文件和网络相关的强大的和灵活的输入/输出支持,Java的输入/输出系统是紧密相连并且是具有一致性的。流的概念Java程序通过流来

2、完成输入/输出。流是生产或消费信息的抽象。流通过Java的输入/输出系统与物理设备链接。尽管与它们链接的物理设备不尽相同,所有流的行为具有同样的方式。这样,相同的输入/输出类和方法适用于所有类型的外部设备。这意味着一个输入流能够抽象多种不同类型的输入:从磁盘文件,从键盘或从网络套接字。同样,一个输出流可以输出到控制台,磁盘文件或相连的网络。流是处理输入/输出的一个洁净的方法,例如它不需要代码理解键盘和网络的不同。Java中流的实现是在java.io包定义的类层次结构内部的。字节流和字符流要使用流类,必须导入Java.io包。Java2定义了两种类型的流:字节类和字符类。字节流(bytestre

3、am)为处理字节的输入和输出提供了方便的方法。例如使用字节流读取或书写二进制数据。字符流(characterstream)为字符的输入和输出处理提供了方便。它们采用了统一的编码标准,因而可以国际化。在某些场合,字符流比字节流更有效。在最底层,所有的输入/输出都是字节形式的。基于字符的流只为处理字符提供方便有效的方法。下面是对字节流和字符流的概述。1.2.1字节流类字节流由两个类层次结构定义。在顶层有两个抽象类:InputStream和OutputStream。每个抽象类都有多个具体的子类,这些子类对不同的外设进行处理,例如磁盘文件,网络连接,甚至是内存缓冲区。字节流类显示于表1-1中。表1-1

4、字节流类流类含义BufferedInputStream缓冲输入流BufferedOutputStream缓冲输出流ByteArrayInputStream从字节数组读取的输入流ByteArrayOutputStream向字节数组写入的输出流DataInputStream包含读取Java标准数据类型方法的输入流DataOutputStream包含编写Java标准数据类型方法的输出流FileInputStream读取文件的输入流FileOutputStream写文件的输出流FilterInputStream实现InputStreamFilterOutputStream实现OutputStreamI

5、nputStream描述流输入的抽象类OutputStream描述流输出的抽象类PipedInputStream输入管道PipedOutputStream输出管道PrintStream包含print()和println()的输出流PushbackInputStream支持向输入流返回一个字节的单字节0“unget”的输入流RandomAccessFile支持随机文件输入/输出SequenceInputStream两个或两个以上顺序读取的输入流组成的输入流抽象类InputStream和OutputStream定义了实现其他流类的关键方法。最重要的两种方法是read()和write(),它们分另U

6、对数据的字节进行读写。两种方法都在InputStream和OutputStream中被定义为抽象方法。它们被派生的流类重载。1.2.2字符流类字符流类由两个类层次结构定义。顶层有两个抽象类:Reader和Writer。这些抽象类处理统一编码的字符流。Java中这些类含有多个具体的子类。字符流类如表1-2所示。表1-2字符流的输入/输出类抽象类Reader和Writer定义了几个实现其他流类的关键方法。其中两个最重要的是read()和write(),它们分别进行字符数据的读和写。这些方法被派生流类重载。预定义流所有的Java程序自动导入java.lang包。该包定义了一个名为System的类,该

7、类封装了运行时环境的多个方面。System同时包含三个预定义的流变量,in,out和err。这些成员在System中是被定义成public和static型的,这意味着它们可以不引用特定的System对象而被用于程序的其他部分。System.out是标准的输出流。默认情况下,它是一个控制台。System.in是标准输入,默认情况下,它指的是键盘。System.err指的是标准错误流,它默认是控制台。然而,这些流可以重定向到任何兼容的输入/输出设备。System.in是inputStream的对象;System.out和System.err是PrintStream的对象。它们都是字节流,尽管它们用

8、来读写外设的字符。但可以用基于字符的流来包装它们。二、读取控制台输入在Java1.0中,完成控制台输入的惟一途径是字节流,使用该方法的老代码依然存在。今天,运用字节流读取控制台输入在技术上仍是可行的,但这样做需要用到不被赞成的方法,这种做法不值得推荐。Java2中读取控制台输入的首选方法是字符流,它使程序容易符合国际标准并且易于维护。Java没有像标准C的函数scanf()或C+输入操作符那样的统一的控制台输入方法。Java中,控制台输入由从System.in读取数据来完成。为获得属于控制台的字符流,在BufferedReader对象中包装System.in。BufferedReader支持缓

9、冲输入流。它最常见的构造函数如下:BufferedReader(ReaderinputReader)这里,inputReader是链接被创建的BufferedReader实例的流。Reader是一个抽象类。它的一个具体的子类是InputStreamReader,该子类把字节转换成字符。为获得链接System.in的一个InputStreamReader的对象,用下面的构造函数:InputStreamReader(InputStreaminputStream)因为System.in引用了InputStream类型的对象,它可以用于inputStream。综上所述,下面的一行代码创建了与键盘相连的

10、BufferedReader对象。BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in);当该语句执行后,br是通过System.in生成的链接控制台的字符流。2.1读取字符从BufferedReader读取字符,用read()。这里所用的read()版本如下:intread()throwsIOException该方法每次执行都从输入流读取一个字符然后以整型返回。当遇到流的末尾时它返回-1。可以看到,它要引发一个lOException异常。下面的例程演示了read()方法,从控制台读取字符直到用户键入classBRR

11、eadpublicstaticvoidmain(Stringargs)throwsIOExceptioncharc;BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in);System.out.println(Entercharacters,qtoquit.);/readcharactersdoc=(char)br.read();System.out.println(c);while(c!=q);下面是程序运行:Entercharacters,qtoquit.123abcq123abcq2.2读取字符串从键盘读取字符

12、串,使用readLine()。它是BufferedReader类的成员。它的通常形式如下:StringreadLine()throwsIOException它返回一个String对象。下面的例子阐述了BufferedReader类和readLine()方法;程序读取和显示文本的行直到键入“stop”:/ReadastringfromconsoleusingaBufferedReader.importjava.io.*;classBRReadLinespublicstaticvoidmain(Stringargs)throwsIOException/createaBufferedReaderus

13、ingSystem.inBufferedReaderbr=newBufferedReader(newInputStreamReader(System.in);Stringstr;System.out.println(Enterlinesoftext.);System.out.println(Enterstoptoquit.);dostr=br.readLine();System.out.println(str);while(!str.equals(stop);下面的例程生成了一个小文本编辑器。它创建了一个String对象的数组,然后依行读取文本,把文本每一行存入数组。它将读取到100行或直到按

14、“stop”才停止。该例运用一个BufferedReader类来从控制台读取数据。/Atinyeditor.importjava.io.*;classTinyEditpublicstaticvoidmain(Stringargs)throwsIOException/createaBufferedReaderusingSystem.inBufferedReaderbr=newBufferedReader(newInputStreamReader(System.in);Stringstr=newString100;System.out.println(Enterlinesoftext.);Syst

15、em.out.println(Enterstoptoquit.);for(inti=0;i100;i+)stri=br.readLine();if(stri.equals(stop)break;System.out.println(nHereisyourfile:);/displaythelinesfor(inti=0;i100;i+)if(stri.equals(stop)break;System.out.println(stri);下面是输出部分:Enterlinesoftext.Enterstoptoquit.Thisislineone.Thisislinetwo.Javamakeswo

16、rkingwithstringseasy.JustcreateStringobjects.stopHereisyourfile:Thisislineone.Thisislinetwo.Javamakesworkingwithstringseasy.JustcreateStringobjects.三、向控制台写输出控制台输出由print()和println()来完成最为简单。这两种方法由PrintStream(System.out引用的对象类型)定义。尽管System.out是一个字节流,用它作为简单程序的输出是可行的。因为PrintStream是从OutputStream派生的输出流,它同样实

17、现低级方法write(),write()可用来向控制台写数据。PrintStream定义的write()的最简单的形式如下:voidwrite(intbyteval)该方法按照byteval指定的数目向文件写字节。尽管byteval定义成整数,但只有低位的8个字节被写入。下面的短例用write()向屏幕输出字符“A”,然后是新的行。/DemonstrateSystem.out.write().classWriteDemopublicstaticvoidmain(Stringargs)intb;b=A;System.out.write(b);System.out.write(n);一般不常用wr

18、ite()来完成向控制台的输出(尽管这样做在某些场合非常有用),因为print(Dprintln()更容易用。四、PrintWriter类尽管Java允许用System.out向控制台写数据,但建议仅用在调试程序时或在例程中。对于实际的程序,J丫2推荐的向控制台写数据的方法是用PrintWriter流。PrintWriter是基于字符的类。用基于字符类向控制台写数据使程序更为国际化。PrintWriter定义了多个构造函数,这里所用到的一个如下:PrintWriter(OutputStreamoutputStream,booleanflushOnNewline)outputStream是Out

19、putStream类的对象,flushOnNewline控制Java是否在println()方法被调用时刷新输出流。如果flushOnNewline为仃及,刷新自动发生,若为false,则不发生。PrintWriter支持所有类型(包括Object)的print()和println()方法,这样,就可以像用System.out那样用这些方法。如果遇到不同类型的情况,PrintWriter方法调用对象的toString()方法并打印结果。用PrintWriter向外设写数据,指定输出流为System.out并在每一新行后刷新流。例如这行代码创建了与控制台输出相连的PrintWriter类。Pri

20、ntWriterpw=newPrintWriter(System.out,true);下面的应用程序说明了用PrintWriter处理控制台输出的方法:/DemonstratePrintWriterimportjava.io.*;publicclassPrintWriterDemopublicstaticvoidmain(Stringargs)PrintWriterpw=newPrintWriter(System.out,true);pw.println(Thisisastring);inti=-7;pw.println(i);doubled=4.5e-7;pw.println(d);该程序的

21、输出如下:Thisisastring-74.5E-7五、文件的读写Java提供了一系列的读写文件的类和方法。在Java中,所有的文件都是字节形式的。Java提供从文件读写字节的方法。而且,Java允许在字符形式的对象中使用字节文件流。两个最常用的流类是FileInputStream和FileOutputStream,它们生成与文件链接的字节流。为打开文件,只需创建这些类中某一个类的一个对象,在构造函数中以参数形式指定文件的名称。这两个类都支持其他形式的重载构造函数。下面是这里将要用到的形式:FileInputStream(StringfileName)throwsFileNotFoundExc

22、eptionFileOutputStream(StringfileName)throwsFileNotFoundExceptionfileName指定需要打开的文件名。当创建了一个输入流而文件不存在时,引发FileNotFoundException异常。对于输出流,如果文件不能生成,则引发FileNotFoundException异常。如果一个输出文件被打开,所有原先存在的同名的文件被破坏。注意:在早期的Java版本中,当输出文件不能创建时FileOutputStream(月|发一个lOException异常。这在Java2中有所修改。当对文件的操作结束后,需要调用close()来关闭文件。该

23、方法在FileInputStream和FileOutputStream中都有定义。如下:voidclose()throwsIOException为读文件,可以使用在FileInputStream中定义的read()方法。这里用到的如下:intread()throwsIOException该方法每次被调用,它仅从文件中读取一个字节并将该字节以整数形式返回。当读到文件尾时,read()返回-1。该方法可以引发IOException异常。下面的程序用read()来输入和显示文本文件的内容,该文件名以命令行形式指定。注意try/catch块处理程序运行时可能发生的两个错误一一未找到指定的文件或用户忘记

24、包括文件名了。importjava.io.*;classShowFilepublicstaticvoidmain(Stringargs)throwsIOExceptioninti;FileInputStreamfin;tryfin=newFileInputStream(args0);catch(FileNotFoundExceptione)System.out.println(FileNotFound);return;catch(ArrayIndexOutOfBoundsExceptione)System.out.println(Usage:ShowFileFile);return;/read

25、charactersuntilEOFisencountereddoi=fin.read();if(i!=-1)System.out.print(char)i);while(i!=-1);fin.close();向文件中写数据,需用FileOutputStream定义的write()方法。它的最简单形式如下:voidwrite(intbyteval)throwsIOException该方法按照byteval指定的数目向文件写入字节。尽管byteval作为整数声明,但仅低8位字节可以写入文件。如果在写的过程中出现问题,一个lOException被引发。下面的例子用write()拷贝一个文本文件:importjava.io.*;classCopyFilepublicstaticvoidmain(Stringargs)throwsIOExceptioninti;FileInputStreamfin;FileOutputStreamfout;try/openinputfiletryfin=new

温馨提示

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

评论

0/150

提交评论