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

下载本文档

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

文档简介

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

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

3、a.io 包。Java 2 定义了两种类型的流:字节类和字符类。字节流( byte stream)为处理字节的输入和输出提供了方便的方法。例如使用字节流读取或书写二进制数据。字符流(character stream)为字符的输入和输出处理提供了方便。它们采用了统一的编码标准,因而可以国际化。在某些场合,字符流比字节流更有效。在最底层,所有的输入 /输出都是字节形式的。基于字符的流只为处理字符提供方便有效的方法。下面是对字节流和字符流的概述。1.2.1 字节流类字节流由两个类层次结构定义。在顶层有两个抽象类:InputStream 和 OutputStream。每个抽象类都有多个具体的子类,这些

4、子类对不同的外设进行处理,例如磁盘文件,网络连接,甚至是内存缓冲区。字节流类显示于表1-1 中。表 1-1 字节流类流类 含义BufferedInputStream 缓冲输入流BufferedOutputStream 缓冲输出流ByteArrayInputStream 从字节数组读取的输入流ByteArrayOutputStream 向字节数组写入的输出流DataInputStream 包含读取 Java 标准数据类型方法的输入流DataOutputStream 包含编写 Java 标准数据类型方法的输出流FileInputStream 读取文件的输入流FileOutputStream 写文件

5、的输出流FilterInputStream 实现 InputStreamFilterOutputStream 实现 OutputStreamInputStream 描述流输入的抽象类OutputStream 描述流输出的抽象类PipedInputStream 输入管道PipedOutputStream 输出管道PrintStream 包含 print() 和 println() 的输出流PushbackInputStream 支持向输入流返回一个字节的单字节的“unget” 的输入流RandomAccessFile 支持随机文件输入/输出Sequence

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

7、r 和 Writer 定义了几个实现其他流类的关键方法。其中两个最重要的是 read()和 write() ,它们分别进行字符数据的读和写。这些方法被派生流类重载。1.3 预定义流所有的 Java 程序自动导入java.lang 包。该包定义了一个名为System的类,该类封装了运行时环境的多个方面。System同时包含三个预定义的流变量,in, out和err。这些成员在System 中是被定义成public 和 static 型的,这意味着它们可以不引用特定的System 对象而被用于程序的其他部分。System.out 是标准的输出流。默认情况下, 它是一个控制台。System.in 是

8、标准输入,默认情况下,它指的是键盘。 System.err指的是标准错误流,它默认是控制台。然而,这些流可以重定向到任何兼容的输入/输出设备。 System.in 是 inputStream的对象; System.out 和 System.err 是 PrintStream 的对象。它们都是字节流,尽管它们用来读写外设的字符。但可以用基于字符的流来包装它们。二、读取控制台输入在 Java 1.0 中,完成控制台输入的惟一途径是字节流,使用该方法的老代码依然存在。今天,运用字节流读取控制台输入在技术上仍是可行的,但这样做需要用到不被赞成的方法,这种做法不值得推荐。 Java 2 中读取控制台输入

9、的首选方法是字符流,它使程序容易符合国际标准并且易于维护。Java 没有像标准C 的函数 scanf()或 C+ 输入操作符那样的统一的控制台输入方法。Java 中,控制台输入由从System.in读取数据来完成。为获得属于控制台的字符流,在BufferedReader 对象中包装System.in。 BufferedReader 支持缓冲输入流。它最常见的构造函数如下:BufferedReader(Reader inputReader)这里,inputReader 是链接被创建的BufferedReader 实例的流。Reader 是一个抽象类。它的一个具体的子类是InputStreamRe

10、ader,该子类把字节转换成字符。为获得链接System.in 的一个 InputStreamReader 的对象,用下面的构造函数:InputStreamReader(InputStream inputStream)因为 System .in 引用了 InputStream 类型的对象,它可以用于inputStream。综上所述,下面的一行代码创建了与键盘相连的 BufferedReader 对象。BufferedReader br = new BufferedReader(newInputStreamReader(System.in);当该语句执行后,br 是通过 System.in 生成

11、的链接控制台的字符流。2.1 读取字符从 BufferedReader 读取字符,用 read()。这里所用的 read()版本如下:int read( ) throws IOException该方法每次执行都从输入流读取一个字符然后以整型返回。当遇到流的末尾时它返回-1。可以看到,它要引发一个IOException 异常。下面的例程演示了read()方法,从控制台读取字符直到用户键入“q” :/ Use a BufferedReader to read characters from the console. import java.io.*;clas

12、s BRRead public static void main(String args) throws IOExceptionchar c;BufferedReader br = newBufferedReader(new InputStreamReader(System.in); System.out.println("Enter characters, 'q' to quit."); / read charactersdo c = (char) br.read();System.out.println(c); while(c != 'q'

13、;);下面是程序运行:Enter characters, 'q' to quit.123abcq123abcq2.2 读取字符串从键盘读取字符串, 使用 readLine() 。它是 BufferedReader 类的成员。它的通常形式如下:String readLine( ) throws IOException它返回一个String 对象。下面的例子阐述了BufferedReader类和 readLine() 方法;程序读取和显示文本的行直到键入“stop” :/ Read a string from console using a

14、BufferedReader. import java.io.*;class BRReadLines public static void main(String args) throws IOException/ create a BufferedReader using System.in BufferedReader br = new BufferedReader(new InputStreamReader(System.in);String str;System.out.println("Enter lines of text."); System.out.prin

15、tln("Enter 'stop' to quit."); do str = br.readLine(); System.out.println(str); while(!str.equals("stop");下面的例程生成了一个小文本编辑器。它创建了一个String对象的数组,然后依行读取文本,把文本每一行存入数组。它将读取到100 行或直到按 “stop” 才停止。该例运用一个BufferedReader 类来从控制台读取数据。/ A tiny editor. import java.io.*;

16、 class TinyEdit public static void main(String args) throws IOException/ create a BufferedReader using System.in BufferedReader br = new BufferedReader(new InputStreamReader(System.in);String str = new String100; System.out.println("Enter lines of text."); System.out.println("Enter &#

17、39;stop' to quit."); for(int i=0; i<100; i+) stri = br.readLine(); if(stri.equals("stop") break;System.out.println("nHere is your file:");/ display the linesfor(int i=0; i<100; i+) if(stri.equals("stop") break;System.out.println(stri);下面是输出部分:Ente

18、r lines of text.Enter ‘stop’ to quit.This is line one.This is line two.Java makes working with strings easy.Just create String objects.stopHere is your file:This is line one.This is line two.Java makes working with strings easy.Just create String objects.三、向控制台写输出控制台输出由print( )和

19、println( ) 来完成最为简单。这两种方法由 PrintStream(System.out 引用的对象类型)定义。尽管System.out 是一个字节流,用它作为简单程序的输出是可行的。因为 PrintStream 是从 OutputStream 派生的输出流, 它同样实现低级方法write() ,write() 可用来向控制台写数据。PrintStream 定义的 write( ) 的最简单的形式如下:void write(int byteval)该方法按照byteval 指定的数目向文件写字节。尽管byteval定义成整数,但只有低位的8 个字节被写入。下面的短例用write() 向

20、屏幕输出字符“A” ,然后是新的行。/ Demonstrate System.out.write(). class WriteDemo public static void main(String args) int b;b = 'A' System.out.write(b); System.out.write('n');一般不常用write() 来完成向控制台的输出(尽管这样做在某些场合非常有用) ,因为 print() 和 println()更容易用。四、 PrintWriter 类尽管 Java 允许用 System

21、.out 向控制台写数据, 但建议仅用在调试程序时或在例程中。对于实际的程序, Java 推荐的向控制台写数据的方法是用 PrintWriter 流。 PrintWriter 是基于字符的类。用基于字符类向控制台写数据使程序更为国际化。PrintWriter 定义了多个构造函数,这里所用到的一个如下:PrintWriter(OutputStream outputStream, booleanflushOnNewline)outputStream 是 OutputStream 类的对象, flushOnNewline 控制 Java 是否在 println() 方法被调用时刷新输出流。如果 fl

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

23、 true);下面的应用程序说明了用PrintWriter 处理控制台输出的方法:/ Demonstrate PrintWriterimport java.io.*;public class PrintWriterDemo public static void main(String args) PrintWriter pw = new PrintWriter(System.out, true); pw.println("This is a string"); int i = -7;pw.println(i);double d = 4.5e-7;pw.println(d);

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

25、owsFileNotFoundExceptionFileOutputStream(String fileName) throwsFileNotFoundExceptionfileName 指定需要打开的文件名。当创建了一个输入流而文件不存在时, 引发 FileNotFoundException 异常。对于输出流,如果文件不能生成,则引发FileNotFoundException 异常。如果一个输出文件被打开,所有原先存在的同名的文件被破坏。注意:在早期的Java 版本中,当输出文件不能创建时FileOutputStream() 引发一个 IOException 异常。这在Java 2中有所修改

26、。 当对文件的操作结束后,需要调用 close( )来关闭文件。该方法在FileInputStream 和 FileOutputStream 中都有定义。如下:void close( ) throws IOException为读文件,可以使用在FileInputStream 中定义的read( )方法。这里用到的如下:int read( ) throws IOException该方法每次被调用,它仅从文件中读取一个字节并将该字节以整数形式返回。当读到文件尾时,read( )返回 -1。该方法可以引发 IOException 异常。下面的程序用read()来输入和显示文本文件的内容,该文件名以命

27、令行形式指定。注意try/catch 块处理程序运行时可能发生的两个错误未找到指定的文件或用户忘记包括文件名了。import java.io.*;class ShowFile public static void main(String args)throws IOExceptionint i;FileInputStream fin;try fin = new FileInputStream(args0); catch(FileNotFoundException e) System.out.println("File Not Found"); return; catch(A

28、rrayIndexOutOfBoundsException e) System.out.println("Usage: ShowFile File"); return;/ read characters until EOF is encountered do i = fin.read();if(i != -1) System.out.print(char) i); while(i != -1); fin.close();向文件中写数据, 需用 FileOutputStream 定义的 write() 方法。它的最简单形式如下:void write(int byteval) throws IOException该方法按照byteval 指定的数目向文件写入字节。尽管 byteval作为整数声明,但仅低8 位字节可以写入文件。如果在写的过程中出现问题,一个IOException 被引发。下面的例子用write() 拷贝一个文本文件:import java.io.*;class CopyFile public static void main(String args)throws IOExceptionint i;Fi

温馨提示

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

评论

0/150

提交评论