Java基础输入输出io包支持Java的基本I/O(输入/输出)系统,包括文件的输入/输出。
对输入/输出的支持是来源于Java的内核API 库,而不是语言关键字。
一、输入/输出基础很多实际的Java应用程序不是基于文本的控制台程序。
尽管基于文本的程序作为教学实例是很出色的,它们无法胜任JA V A在实际中的重要应用。
Java对外设输入/输出的支持也是有限的,并且用起来有些笨拙——甚至是在简单的例子程序中。
基于文本的控制台输入/输出对于Java程序并不是十分重要。
Java 提供了与文件和网络相关的强大的和灵活的输入/输出支持,Java的输入/输出系统是紧密相连并且是具有一致性的。
1.1 流的概念Java程序通过流来完成输入/输出。
流是生产或消费信息的抽象。
流通过Java的输入/输出系统与物理设备链接。
尽管与它们链接的物理设备不尽相同,所有流的行为具有同样的方式。
这样,相同的输入/输出类和方法适用于所有类型的外部设备。
这意味着一个输入流能够抽象多种不同类型的输入:从磁盘文件,从键盘或从网络套接字。
同样,一个输出流可以输出到控制台,磁盘文件或相连的网络。
流是处理输入/输出的一个洁净的方法,例如它不需要代码理解键盘和网络的不同。
Java中流的实现是在java.io包定义的类层次结构内部的。
1.2 字节流和字符流要使用流类,必须导入Java.io包。
Java 2 定义了两种类型的流:字节类和字符类。
字节流(byte stream)为处理字节的输入和输出提供了方便的方法。
例如使用字节流读取或书写二进制数据。
字符流(character stream)为字符的输入和输出处理提供了方便。
它们采用了统一的编码标准,因而可以国际化。
在某些场合,字符流比字节流更有效。
在最底层,所有的输入/输出都是字节形式的。
基于字符的流只为处理字符提供方便有效的方法。
下面是对字节流和字符流的概述。
1.2.1 字节流类字节流由两个类层次结构定义。
在顶层有两个抽象类:InputStream 和OutputStream。
每个抽象类都有多个具体的子类,这些子类对不同的外设进行处理,例如磁盘文件,网络连接,甚至是内存缓冲区。
字节流类显示于表1-1中。
表1-1 字节流类流类含义BufferedInputStream缓冲输入流BufferedOutputStream缓冲输出流ByteArrayInputStream从字节数组读取的输入流ByteArrayOutputStream向字节数组写入的输出流DataInputStream包含读取Java标准数据类型方法的输入流DataOutputStream包含编写Java标准数据类型方法的输出流FileInputStream读取文件的输入流FileOutputStream写文件的输出流FilterInputStream实现InputStreamFilterOutputStream实现OutputStreamInputStream描述流输入的抽象类OutputStream描述流输出的抽象类PipedInputStream输入管道PipedOutputStream输出管道PrintStream包含print()和println()的输出流PushbackInputStream 支持向输入流返回一个字节的单字节的“unget”的输入流RandomAccessFile支持随机文件输入/输出SequenceInputStream两个或两个以上顺序读取的输入流组成的输入流抽象类InputStream 和OutputStream定义了实现其他流类的关键方法。
最重要的两种方法是read()和write(),它们分别对数据的字节进行读写。
两种方法都在InputStream 和OutputStream中被定义为抽象方法。
它们被派生的流类重载。
1.2.2 字符流类字符流类由两个类层次结构定义。
顶层有两个抽象类:Reader 和Writer。
这些抽象类处理统一编码的字符流。
Java中这些类含有多个具体的子类。
字符流类如表1-2所示。
表1-2 字符流的输入/输出类抽象类Reader和Writer定义了几个实现其他流类的关键方法。
其中两个最重要的是read()和write(),它们分别进行字符数据的读和写。
这些方法被派生流类重载。
1.3 预定义流所有的Java程序自动导入ng包。
该包定义了一个名为System的类,该类封装了运行时环境的多个方面。
System 同时包含三个预定义的流变量,in,out和err。
这些成员在System中是被定义成public 和static型的,这意味着它们可以不引用特定的System对象而被用于程序的其他部分。
System.out是标准的输出流。
默认情况下,它是一个控制台。
System.in是标准输入,默认情况下,它指的是键盘。
System.err 指的是标准错误流,它默认是控制台。
然而,这些流可以重定向到任何兼容的输入/输出设备。
System.in 是inputStream 的对象;System.out和System.err是PrintStream的对象。
它们都是字节流,尽管它们用来读写外设的字符。
但可以用基于字符的流来包装它们。
二、读取控制台输入在Java 1.0中,完成控制台输入的惟一途径是字节流,使用该方法的老代码依然存在。
今天,运用字节流读取控制台输入在技术上仍是可行的,但这样做需要用到不被赞成的方法,这种做法不值得推荐。
Java 2中读取控制台输入的首选方法是字符流,它使程序容易符合国际标准并且易于维护。
Java没有像标准C的函数scanf()或C++输入操作符那样的统一的控制台输入方法。
Java中,控制台输入由从System.in读取数据来完成。
为获得属于控制台的字符流,在BufferedReader对象中包装System.in。
BufferedReader 支持缓冲输入流。
它最常见的构造函数如下:BufferedReader(Reader inputReader)这里,inputReader是链接被创建的BufferedReader实例的流。
Reader是一个抽象类。
它的一个具体的子类是InputStreamReader,该子类把字节转换成字符。
为获得链接System.in的一个InputStreamReader的对象,用下面的构造函数:InputStreamReader(InputStream inputStream)因为System .in引用了InputStream 类型的对象,它可以用于inputStream。
综上所述,下面的一行代码创建了与键盘相连的BufferedReader对象。
BufferedReader br = new BufferedReader(newInputStreamReader(System.in));当该语句执行后,br是通过System.in生成的链接控制台的字符流。
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.*;class BRRead {public static void main(String args[])throws IOException{char 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');}}下面是程序运行:Enter characters, 'q' to quit.123abcq123abcq2.2 读取字符串从键盘读取字符串,使用readLine()。
它是BufferedReader 类的成员。
它的通常形式如下:String readLine( ) throws IOException它返回一个String对象。
下面的例子阐述了BufferedReader 类和readLine()方法;程序读取和显示文本的行直到键入“stop”:// Read a string from console using a BufferedReader.import java.io.*;class BRReadLines {public static void main(String args[])throws IOException{// create a BufferedReader using System.inBufferedReader br = new BufferedReader(new InputStreamReader(System.in));String str;System.out.println("Enter lines of text.");System.out.println("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.*;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 String[100];System.out.println("Enter lines of text.");System.out.println("Enter 'stop' to quit.");for(int i=0; i<100; i++) {str[i] = br.readLine();if(str[i].equals("stop")) break;}System.out.println("\nHere is your file:");// display the linesfor(int i=0; i<100; i++) {if(str[i].equals("stop")) break;System.out.println(str[i]);}}}下面是输出部分:Enter 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( ) 和println( )来完成最为简单。