Java最新实用教程第七章 输入输出流
Java最新实用教程
2009年 7月 27日星期一 2
学习目的:
掌握流的概念,标准的输入 /输出流类,内存读写流类,
文件的输入输出类,管道流类,连接多个流的方法和过滤流类的常用功能
了解 java.io包中的其他流类
学习重点:
标准的输入输出流
内存读写流
管道流
文件输入输出流
过滤流
Java最新实用教程
2009年 7月 27日星期一 3
第 七 章 输入输出流本章提要:
1,流的概念
2,常见的 I/O流
标准输入输出流
内存读写流
管道流
文件输入输出流
连接多个流
过滤流
Java最新实用教程
2009年 7月 27日星期一 4
7.1 流的概念流是指在计算机的输入与输出之间流动的数据序列;是从数据源串行地流向数据目的地。
输入流是指从外设流入计算机的数据流。
输出流是指从计算机流向外设的数据流。
Java最新实用教程
2009年 7月 27日星期一 5
7.2常见的 I/O流
InputStream是表示字节输入流的所有类的超类。需要定义
InputStream的子类的应用程序必须始终提供返回下一个输入字节的方法,也就是以字节作为基本处理单位。直接已知子类,AudioInputStream,ByteArrayInputStream,
FileInputStream,FilterInputStream,InputStream,
ObjectInputStream,PipedInputStream,
SequenceInputStream,StringBufferInputStream
OutputStream是表示输出字节流的所有类的超类。输出流接受输出字节并将这些字节发送到某个接收器,需要定义
OutputStream 子类的应用程序必须始终提供至少一种可写入一个输出字节的方法。直接已知子类:
ByteArrayOutputStream,FileOutputStream,
FilterOutputStream,ObjectOutputStream,
OutputStream,PipedOutputStream
Java最新实用教程
2009年 7月 27日星期一 6
7.2常见的 I/O流
Reader用于读取字符流的抽象类。子类必须实现的方法只有 read( char[],int,int)和 close()。但是,
多数子类将重写此处定义的一些方法,以提供更高的效率和 /或其他功能。直接已知子类,BufferedReader,
CharArrayReader,FilterReader,
InputStreamReader,PipedReader,StringReader
Writer写入字符流的抽象类。子类必须实现的方法仅有
write(char[],int,int),flush() 和 close()。但是,多数子类将重写此处定义的一些方法,以提供更高的效率或其他功能。直接已知子类,BufferedWriter,
CharArrayWriter,FilterWriter,
OutputStreamWriter,PipedWriter,PrintWriter,
StringWriter
Java最新实用教程
2009年 7月 27日星期一 7
7.2.1标准输入 /输出流
Java的标准数据流是指在字符方式下(如 DOS),程序与系统进行交互的方式,分为三种:
System.in:“标准”输入流。此流已打开并准备提供输入数据。通常,此流使程序能够读取来自键盘输入或者由主机环境或用户指定的另一个输入源的输入。
System.out:“标准”输出流。此流已打开并准备接受输出数据。通常,
此流使程序能够向屏幕输出数据或者向主机环境或用户指定的另一个输出目标输出数据。通常,此流使程序能够在屏幕上显示出错信息。
System.err:“标准”错误输出流。此流已打开并准备接受输出数据。通常,此流使程序能够在屏幕上显示出错信息。按照惯例,此输出流用于显示错误消息,或者显示那些即使用户输出流(变量 out 的值)已经重定向到通常不被连续监视的某一文件或其他目标,也应该立刻引起用户注意的其他信息。
例 7-1
Java最新实用教程
2009年 7月 27日星期一 8
7.2.2内存读写
Java I/O流包括从内存中的字节数组中读取数据,以及向内存中的字节数组输出数据的功能。 ByteArrayInputStream从内存中的字节数组读入数据; ByteArrayOutputStream则向内存中的字节数组输出数据。
1,ByteArrayInputStream流 ByteArrayInputStream是把字节数组当成源的输入流。该类有两个构造函数,每个构造函数需要一个字节数组提供数据源:
ByteArrayInputStream(byte array[ ])
ByteArrayInputStream(byte array[ ],int start,int numBytes)
array是输入源。第二个构造函数创建了一个 InputStream类,该类从字节数组的子集生成,以 start指定索引的字符为起点,长度由 numBytes决定。下面以一个例子来说明 ByteArrayInputStream的用法。
例 7-2
Java最新实用教程
2009年 7月 27日星期一 9
7.2.2内存读写
2,ByteArrayOutputStream流
ByteArrayOutputStream是一个把字节数组当作输出流的实现。 ByteArrayOutputStream有两个构造函数
,如下:
ByteArrayOutputStream( )
ByteArrayOutputStream(int numBytes)
在第一种形式里,一个 32位字节的缓冲器被生成
。第二个构造函数生成一个跟指定 numBytes相同位数的缓冲器。缓冲器保存在 ByteArrayOutputStream的受保护的 buf成员里。缓冲器的大小在需要的情况下会自动增加。缓冲器保存的字节数是由
ByteArrayOutputStream的受保护的 count域保存的。
例 7-3
Java最新实用教程
2009年 7月 27日星期一 10
7.2.3管道流管道是线程或进程间的同步通信渠道。 Java流中也引入了管道的概念,它提供了 PipedInputStream流和
PipedOutputStream流来建立两个线程间的管道。一个线程通过 PipedOutputStream向另一线程发送数据。而目标线程则通过 PipeInputStream从管道读取信息。
//发送方源程序( Sender.java)
import java.io.*;import java.util.*;
public class Sender extends Thread
{ PipedOutputStream out = new PipedOutputStream();
public PipedOutputStream getOut(){return out;}
public void run()
{String str = "Hello,Receiver ! I`m sender\n";
try{out.write(str.getBytes()); //将 str中的内容写到当前管道中
out.close(); //关闭当前管道输出流 }
catch(Exception e){ e.printStackTrace();} }}
Java最新实用教程
2009年 7月 27日星期一 11
7.2.3管道流
//接收方源程序( Receiver.java)
import java.io.*;import java.util.*;
public class Receiver extends Thread
{PipedInputStream in = new PipedInputStream();
public PipedInputStream getIn(){return in;}
public void run()
{byte [] buf = new byte[1024];
try
{int len = in.read(buf); //将管道中的内容读入字节数组 buf中
System.out.println(“the following is from sender,\n”+new
String(buf,0,len));
in.close(); //关闭当前管道输入流
}catch(Exception e){e.printStackTrace();}}}}
Java最新实用教程
2009年 7月 27日星期一 12
7.2.3管道流
//测试管道源程序( Example7_4.java)
import java.io.*;
public class Example7_4 {
public static void main(String [] args){
Sender s = new Sender();
Receiver r = new Receiver();
PipedOutputStream out = s.getOut();
PipedInputStream in = r.getIn();
try
{ in.connect(out); //将当前管道输入流连接到一个发送者
s.start(); r.start(); }
catch(Exception e){e.printStackTrace();}}}
Java最新实用教程
2009年 7月 27日星期一 13
7.2.4文件输入输出流
1,File类
File类主要是完成文件夹管理、查询文件属性和处理目录等操作,
它不进行文件夹内容的读取操作。
File(String parent,String child)
File(File parent,String child)
File(URI uri)
File(String pathname)
其中前面两个可以在某个已知特定的目录下新建文件或者目录,后面两个可以通过 pathname或者 URI新建文件或者目录。有一点需要注意,
File虽然是一个系统无关的代表,但是 pathname的表示是和系统相关的
,比如 UNIX下,/” 表示 root目录,而 Windows下通常用盘符来表示。
File类再利用 canRead(),canWrite(),getParent(),getPath()等成员函数实现对文件的各个属性的操作,以实现文件与目录的管理功能。
例 7-5
Java最新实用教程
2009年 7月 27日星期一 14
7.2.4文件输入输出流
2、文件输入输出类
Java提供了 FileInputStream类,FileOutputStream类、
FileReader类和 FileWriter类来实现文件输入输出流。
FileInputStream类实现从文件读入基于字节的数据;
FileOutputStream实现向文件输出基于字节的数据;
FileReader实现从文件读入基于字符的数据; FileWriter实现向文件输出基于字符的数据。
FileInputStream
FileInputStream 类创建一个能从文件读取字节的输入流。
FileInputStream(String filepath)
FileInputStream(File fileObj)
filepath是文件的全称路径,fileObj是描述该文件的 File对象。这两个方法都能引发 FileNotFoundException异常。
Java最新实用教程
2009年 7月 27日星期一 15
7.2.4文件输入输出流
FileOutputStream
FileOutputStream 类可以创建一个向文件写入字节的输出流
FileOutputStream(String filePath)
FileOutputStream(File fileObj)
FileOutputStream(String filePath,boolean append)
filePath是文件的全称路径,fileObj是描述该文件的 File对象。如果 append为 true,文件以设置搜索路径模式打开。它们都可以引发 IOException或
SecurityException异常例 7-6
Java最新实用教程
2009年 7月 27日星期一 16
7.2.4文件输入输出流
3,随机访问文件随机访问文件则允许对文件内容进行随机读 /写。在 java
中,类 RandomAccessFile 提供了随机访问文件的方法。该类创建的流的指向既可以作为数据源,又可以作为目的地。
类 RandomAccessFile的声明为:
public class RandomAccessFile extends Object
implements DataInput,DataOutput
接口 DataInput 中定义的方法主要包括从流中读取基本类型的数据、
读取一行数据、或者读取指定长度的字节数。如,readBoolean( )、
readInt( ),readLine( ),readFully( ) 等。
接口 DataOutput 中定义的方法主要是向流中写入基本类型的数据、或者写入一定长度的字节数组。如,writeChar( ),writeDouble( )、
write( ) 等。
Java最新实用教程
2009年 7月 27日星期一 17
7.2.4文件输入输出流
类 RandomAccessFile的构造方法:
RandomAccessFile(String name,String mode)。
RandomAccessFile(File file,String mode)。
name为文件名,它既是流的源,也是流的目的地; mode
为打开方式,例如 "r"表示只读,"rw"表示可读写; file为一个文件对象,意义和 name类似。
类 RandomAccessFile的文件指针的操作:
在类 RandomAccessFile中,方法 getFilePointer( )用于得到当前文件的指针的位置;方法 seek( long pos )主要用于移动文件指针到指定的位置,pos为文件指针距离文件头的字节位置;方法 skipBytes( int n)主要用途是使文件指针向前移动指定的 n个字节。而类 RandomAccessFile对文件指针的操作主要就是利用这几个方法,实现文件的随机读取的。
例 7-7
Java最新实用教程
2009年 7月 27日星期一 18
7.2.5连接多个流在 Java中,SequenceInputStream类能实现连接多个流的功能,又称为序列输入流。它能使应用程序将多个流顺序地连接成一个流,并且使它们像单个输入流一样出现。每个输入流依次被读取,直接到达该流的末尾;然后“序列输入流
”类关闭这个流并自动地切换到下一个输入流,这样可以非常方便地将多个文件连接成一个文件。 SequenceInputStream
的构造不同于任何其他的 InputStream。
SequenceInputStream构造函数要么使用一对 InputStream,
要么用 InputStream的一个 Enumeration,显示如下:
SequenceInputStream(InputStream first,InputStream second)
SequenceInputStream(Enumeration streamEnum)
操作上来说,该类满足读取完第一个 InputStream后转去读取第二个流的读取要求。使用 Enumeration的情况下,它将继续读取所有 InputStream流直到最后一个被读完。
例 7-8
Java最新实用教程
2009年 7月 27日星期一 19
7.2.6过滤流
FilterInputStream流的各种类型见如表 7-1所示。 FilterInputStream流能两件差异极大的工作,DataInputStream可以读取各种基本类型的数据和 String对象,如果搭配相应的 DataOutputStream,就可以将基本类型的数据从某处移至另一处;其余的类则可在内部修改输入流的行为模式:可以进行缓冲或将单一字符放回输入流中。
类名 功能 构造函数的参数说明
DataInputStream
和 DataOutputStream相结合,以一种可携的方式,实现从流中读取基本类型数据
InputStream
通过输出流读取各种基本类型的数据
BufferInputStream
利用缓冲区,避免了每次读取数据的时候都必须要进行实际的读取动作
InputStream
申请一份可用的缓冲区,并指定缓冲区的大小
LineNumberInputSt
ream 能对输入流内的行数进行管理
InputStream
对数据行进行管理
PushbackInputStrea
m
将读到的最后一个字节回送回去。
InputStream
通常用于编译器上的扫描器上
Java最新实用教程
2009年 7月 27日星期一 20
7.2.6过滤流
FilterOutputStream类是将数据写入输出流,该流的各中类型见下表所示。其中,
DataOutputStream类可以将基本类型的数据和 String对象,格式化的输出到输出流
,其输出格式可以让任何
DataInputStream在任何机器上被顺利读取; PrintStream的用途是以各种格式打印所有基本类型的数据和 String对象;
BufferedOutputStream会对输出流的运行做一些改变,并对流执行缓冲动作,所以当将数据写入输出流时,并不是每次都会有实际的写入动作。
Java最新实用教程
2009年 7月 27日星期一 21
7.2.6过滤流类名 功能 构造函数的参数说明
DataOutputStream
和 DataInputStream协同使用,
可将各种基本类型数据以可移植形式写入 Stream
OutputStream:含有完整接口,可让你读取各种基本类型的数据
PrintStream
产生格式化输出结果。
PrintStream处理的是“数据的显示”
OutputStream:可依需要指定一个 Boolean值,决定是否在每次换行时将缓冲区清空
BufferOutputStream 使用缓冲区,避免每次写入时 都要执行实际的写入动作
OutputStream:本身不提供额外接口,只是满足缓冲需求,将它附接到其他接口对象身上
Java最新实用教程
2009年 7月 27日星期一 22
7.3 本章小结
学习了流的概念
详细学习了常见的输入输出流的功能
标准的输入输出流 System.in,System.out和 System.err;
用于内存读写的 ByteArrayInputStream流和
ByteArrayOutputStream流
实现管道流的 PipedInputStream类和 PipedOutputStream类
主要完成文件夹管理、查询文件属性和处理目录等操作,不进行文件夹内容的读取操作的 File类
实现文件输入输出流的 FileInputStream类,FileOutputStream
类,FileReader类和 FileWriter类
能实现连接多个流的 SequenceInputStream类
过滤流等。