第9章输入流与输出流_第1页
第9章输入流与输出流_第2页
第9章输入流与输出流_第3页
第9章输入流与输出流_第4页
第9章输入流与输出流_第5页
已阅读5页,还剩62页未读 继续免费阅读

下载本文档

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

文档简介

第九章输入、输出流

本章导读1.文件2.文件字节流3.文件字符流4.从键盘读取数据5.缓冲流6.数组流7.字符串流8.数据流9.管道流10.对象流11.序列化与对象克隆12.随机读写流13.文件锁输入/输出流(

简称I/O流)I/O流中的输入流的指向称做源,输出流的指向称做目的地。程序从指向源的输入流中读取源中的数据,通过向输出流中写入数据把信息传递到目的地。程序的源和目的地常常是磁盘文件,也可以是键盘、鼠标、显示器等。java.io包中提供大量关于流的类,例如下列重要的abstract类等:1.InputStream(字节输入流)2.Reader(字符输入流)3.OutputStream(字节输出流)4.Writer(字符输出流)InputStream、Reader类提供读取数据的read()方法;OutputStream、Writer类提供写入数据的write()方法。用于从源中按照字节或字符方式读取数据或将数据传递到目的地。9.1

文件文件类(File类)File类的构造方法:File(Stringfilename);

创建当前路径下的指定文件File(StringdirectoryPath,Stringfilename);

创建指定路径下的指定文件File(StringdirectoryPath);创建指定路径下的文件对象File(Filef,Stringfilename);

创建指定目录的指定文件,f是一个目录。1.文件的属性经常使用File类的下列方法获取文件本身的一些信息:publicStringgetName()获取文件的名字。publicbooleancanRead()判断文件是否是可读的。publicbooleancanWrite()判断文件是否可被写入。publicbooleanexits()判断文件是否存在。publiclonglength()获取文件的长度(单位是字节)。publicStringgetAbsolutePath()获取文件的绝对路径。publicStringgetParent()获取文件的父目录。publicbooleanisFile()判断文件是否是一个正常文件,而不是目录。publicbooleanisDirectroy()判断文件是否是一个目录。publicbooleanisHidden()判断文件是否是隐藏文件。publiclonglastModified()获取文件最后修改的时间(时间是从1970年午夜至文件最后修改时刻的毫秒数2.目录(1)创建目录publicbooleanmkdir():创建一个目录,如果创建成功返回true,否则返回false。(2)列出目录中的文件publicString[]list()用字符串形式返回目录下的全部文件。

publicFile[]listFiles()用File对象形式返回目录下的全部文件。publicString[]list(FilenameFilterobj)该方法用字符串形式返回目录下的指定类型的所有文件。publicFile[]listFiles(FilenameFilterobj)

该方法用File对象返回目录下的指定类型所有文件。

3.文件的创建与删除使用File类创建一个文件对象,例如

Filef=newFile("c:\\myletter","letter.txt");如果c:\myletter目录中没有名字为letter.txt文件,文件对象f调用方法:

publicbooleancreateNewFile()可以在c:\myletter目录中建立一个名字为letter.txt的文件。文件对象调用方法

publicbooleandelete()可以删除当前文件,例如:

f.delete();importjava.io.*;publicclassExample{publicstaticvoidmain(Stringargs[]){

Filedir=newFile("E:/lx");//不可写成D:\lx,可以写成D:\\lx或D:/lx

Filef=newFile(dir,"test.txt");try{

f.createNewFile();

}

catch(IOExceptione){ System.out.println(e);}System.out.println("文件名称:"+f.getName());System.out.println("文件"+f.getName()+"是否可读:"+f.canRead());

System.out.println("文件"+f.getName()+"是否可写:"+f.canWrite());

System.out.println("文件"+f.getName()+"的长度:"+f.length());System.out.println("文件"+f.getName()+"的最后修改的时间:"+f.lastModified());

}}

4.运行可执行文件首先使用Runtime

类声明一个对象,如:Runtimeec;然后使用静态getRuntime()方法创建这个对象:ec=Runtime.getRuntime();ec可以调用exec(Stringcommand)方法打开本地机的可执行文件或执行一个操作。importjava.io.*;publicclassExample{publicstaticvoidmain(Stringargs[]){try{Runtimece=Runtime.getRuntime();Filefile=newFile("C:\\windows\\system32","calc.exe");ce.exec(file.getAbsolutePath());}

catch(Exceptione){System.out.println(e);}}}Runtime对象运行windows平台上的计算器程序。9.2

文件字节流FileInputStream(文件字节输入流)类是InputStream类的子类FileInputStream类构造方法:

FileInputStream(Stringname)

创建指定文件名的字节输入流方式文件。FileInputStream(Filefile)

创建指定文件名(File对象)的字节输入流方式文件。1.FileInputStream类FileInputStream类的read方法:输入流的唯一目的是提供通往数据的通道,程序可以通过这个通道读取数据,read方法给程序提供一个从输入流中读取数据的基本方法。intread();read方法从输入流中顺序读取单个字节的数据。该方法返回字节值(0~255之间的一个整数),读取位置到达文件末尾,则返回-1。read方法还有其它一些形式。这些形式能使程序把多个字节读到一个字节数组中:intread(byteb[]);intread(byteb[],intoff,intlen);其中,off参数指定read方法把数据存放在字节数组b中的什么地方样,len参数指定该方法将读取的最大字节数。上面所示的这两个read方法都返回实际读取的字节个数,如果它们到达输入流的末尾,则返回-1。

FileInputStream类的read方法:2.FileOutputStream类FileOutputStream(文件字节输出流)类是OutputStream类的子类FileOutputStream类的构造方法:

FileOutputStream(Stringname)

FileOutputStream(Filefile)输出流通过使用write()方法把数据写入输出流到达目的地。write()方法publicvoidwrite(byteb[])写b.length个字节到输出流。publicvoidwrite(byteb[],intoff,intlen)从给定字节数组中起始于偏移量off处写len个字节到输出流,参数b是存放了数据的字节数组。例:将“欢迎Welcome”写入到“Test.txt”中。importjava.io.*;publicclassExample{publicstaticvoidmain(Stringargs[]){

Filefile=newFile("E:\\lx","test.txt");byteb[]="欢迎welcome".getBytes();

try{FileOutputStreamout=newFileOutputStream(file);

out.write(b);

out.close();}catch(IOExceptione){System.out.println(e);}}}9.3

文件字符流FileReader(文件字符输入流)类是Reader的子类FileReader构造方法:FileReader(Stringname)FileReader(Filefile)

1.FileReader类intread()输入流调用该方法从源中读取一个字符,该方法返回一个整数(0~65535之间的一个整数,Unicode字符值),如果未读出字符就返回-1。intread(charb[])输入流调用该方法从源中读取b.length个字符到字符数组b中,返回实际读取的字符数目。如果到达文件的末尾,则返回-1。intread(charb[],intoff,intlen)输入流调用该方法从源中读取len个字符并存放到字符数组b中,返回实际读取的字符数目。如果到达文件的末尾,则返回-1。其中,off参数指定read方法从符数组b中的什么地方存放数据read()方法

2.FileWriter类FileWriter(文件字符输出流)类是Writer的子类FileWriter构造方法FileWriter(Stringname)FileWriter(Filefile)创建FileWriter对象,输出流通过使用write()方法把字符数据写入输出流到达目的地。publicvoidwrite(charb[])写b.length个字符到输出流。publicvoid.write(charb[],intoff,intlen)从给定字符数组中起始于偏移量off处写len个字符到输出流,参数b是存放了数据的字符数组。voidwrite(Stringstr)把字符串中的全部字符写入到输出流。voidwrite(Stringstr,intoff,intlen)从字符串str中起始于偏移量off处写len个字符到输出流。writer()方法例子:首先用字符输出流向一个文件写入若干个字符,然后再用字符输入流读出文件中的内容。importjava.io.*;publicclassExample{publicstaticvoidmain(Stringargs[]){

Filefile=newFile("E:\\lx","test.txt");charb[]="欢迎您".toCharArray();

try{FileWriterout=newFileWriter(file);out.write(b);

out.write("来到山东科技大学!");out.close();FileReaderin=newFileReader(file);intn=0;

while((n=in.read(b,0,2))!=-1){Stringstr=newString(b,0,n);System.out.println(str);

}in.close();

}catch(IOExceptione){System.out.println(e);}}}9.4从键盘读取数据java.lang包中的System类有两个重要的类成员:in和out,分别是输入流和输出流类型的对象。in的源是键盘,in可以读取用户从键盘键入的数据。

Scanner类可以使用in初始化一个对象:Scannerreader=newScanner(System.in);

然后reader对象调用方法,读取用户在命令行输入的各种数据类型。

out流的目的地是命令行窗口,out调用方法可以将数据送到命令行窗口。返回9.5缓冲流BufferedReader

类创建的对象称为缓冲输入流,该输入流的指向必须是一个Reader流,称为BufferedReader流的底层流,底层流负责将数据读入缓冲区。如果在读取文件时,每次准备读取一行,采用FileReader较难实现。为解决按行读取,可将BufferedReader与FileReader链接,此时BufferedReader可以按行读取FileReader指向的文件数据。

1.BufferedReader类BufferedReader(Readerin)BufferedReader流能够通过方法readLine()按行读取文本。BufferedReader类构造方法通过向BufferedReader传递一个Reader对象(如FileReader的实例),来创建一个BufferedReader对象,如:FileReaderinOne=newFileReader(“Person.txt”);BufferedReaderinTwo=newBufferedReader(inOne);然后inTwo调用readLine()顺序读取文件“Person.txt”的一行。2.BufferedWriter类类似地,可以将BufferedWriter流和FileWriter流连接在一起,然后使用BufferedWriter流将数据写到目的地,例如:FileWritertofile=newFileWriter("hello.txt");BufferedWriterout=newBufferedWriter(tofile);BufferedReader流调用方法:write(Stringstr)write(Strings,intoff,intlen)把字符串s或s的一部分写入到目的地。例子:我们将文件“Person.txt”中的内容按行读出,并写入到另一个文件“Student.txt”中,且给每一行加上行号。importjava.io.*;publicclassExample{publicstaticvoidmain(Stringargs[]){

FilereadFile=newFile("E:\\lx","Person.txt"),

writeFile=newFile("E:\\lx","Student.txt");try{FileReaderinOne=newFileReader(readFile);BufferedReaderinTwo=newBufferedReader(inOne);FileWritertofile=newFileWriter(writeFile);BufferedWriterout=newBufferedWriter(tofile);Strings=null;inti=0;

while((s=inTwo.readLine())!=null){i++;out.write(i+""+s);out.newLine();}out.flush();out.close();tofile.close();}catch(IOExceptione){System.out.println(e);}}}9.6数组流字节输入流:ByteArrayInputStream和字节输出流:ByteArrayOutputStream分别使用字节数组作为流的源和目标。使用下列ByteArrayInputStream流的两个构造方法构造字节数组输入流对象:

ByteArrayInputStream(byte[]buf)

ByteArrayInputStream(byte[]buf,intoffset,intlength)第一个构造方法构造的数组字节流的源是参数buf指定的数组的全部字节单元,第二个构造方法构造的数组字节流的源是参数buf指定的数组从offset处取的length个字节单元。使用下列ByteArrayOutputStream流的两个构造方法构造字节数组输出流对象:

ByteArrayOutputStream()

ByteArrayOutputStream(intsize)第一个构造方法构造的数组字节输出流指向一个默认大小为32字节的缓冲区,如果输出流向缓冲区写入的字节个数大于缓冲区时,缓冲区的容量会自动增加。第二个构造方法构造的数组字节输出流指向的缓冲区的初始大小由参数size指定,如果输出流向缓冲区写入的字节个数大于缓冲区时,缓冲区的容量会自动增加。数组字节输出流调用

publicbyte[]toByteArray()方法,可以返回输出流写入到缓冲区的全部字节。数组字节流读写操作不会发生IOException异常。例:我们向内存(输出流的缓冲区)写入ASCII表,然后再读出这些字节和字节对应的字符。importjava.io.*;publicclassExample{publicstaticvoidmain(Stringargs[]){intn=-1;

ByteArrayOutputStreamout=newByteArrayOutputStream();for(inti=1;i<=127;i++){out.write(i);}

ByteArrayInputStreamin=newByteArrayInputStream(out.toByteArray());while((n=in.read())!=-1){if(n%2==0){System.out.printf("\n");}System.out.printf("\t字节%d,对应字符\'%c\'",n,(char)n);}}}与数组字节流对应的是数组字符流:CharArrayReader与CharArrayWriter类,数组字符流分别使用字符数组作为流的源和目标。与数组字节流不同的是,数组字符流的读操作可能发生IOException异常。例:将Unicode表中的一些字符写入内存,然后再读出。importjava.io.*;publicclassExample{publicstaticvoidmain(Stringargs[]){intn=-1;CharArrayWriterout=newCharArrayWriter();for(inti=20320;i<=20380;i++){out.write(i);}CharArrayReaderin=newCharArrayReader(out.toCharArray());

try{

while((n=in.read())!=-1){if(n%2==0){System.out.printf("\n");}System.out.printf("\t位置%d,字符\'%c\'",n,(char)n);}}catch(IOExceptione){}}}9.7字符串流StringReader使用字符串作为流的源。使用下列构造方法构造字符串输入流对象:

publicStringReader(Strings)该构造方法构造的输入流指向参数s指定的字符串,字符串输入流调用

publicintread()方法顺序读出源中的一个字符,并返回字符在Unicode表中的位置;调用

publicintread(char[]buf,intoff,intlen)方法可以顺序地从源中读出参数len指定的字符个数,并将读出的字符存放到参数b指定的数组中,参数off指定数组b存放读出字符的起始位置,该方法返回实际读出的字符个数。字符串输出流调用下列方法向缓冲区写入字符: publicvoidwrite(intb) publicvoidwrite(char[]b,intoff,intlen) publicvoidwrite(Stringstr) publicvoidwrite(Stringstr,intoff,intlen)字符串输出流调用toString()方法,可以返回输出流写入到缓冲区的全部字符: publicStringtoString()字符串输出流调用flush()方法可以刷新缓冲区。 publicvoidflush()返回9.8数据流1.DataInputStream类和DataOutputStream类

DataInputStream

类和DataOutputStream类创建的对象称为数据输入流和数据输出流。2.DataInputStream类和DataOutputStream的构造方法(1)DataInputStream(InputStreamin)将创建的数据输入流指向一个由参数in指定的输入流,以便从后者读取数据(按着机器无关的风格读取)。(2)DataOutputStream(OutnputStreamout)将创建的数据输出流指向一个由参数out指定的输出流,然后通过这个数据输出流把Java数据类型的数据写到输出流out。DataInputStream类和DataOutputStream类的常用方法方法描述readBoolean()读取一个布尔值readByte()读取一个字节readChar()读取一个字符readDouble()读取一个双精度浮点值…………writeBoolean(booleanv)把一个布尔值作为单字节值写入writeBytes(Strings)写入一个字符串writeChars(Strings)写入字符串writeDouble(doublev)写入一个双精度浮点值…………

例:完成写几个Java类型的数据到一个文件,并再读出来。importjava.io.*;publicclassExample{publicstaticvoidmain(Stringargs[]){try{ Filef=newFile("E:\\lx","jerry.dat"); FileOutputStreamfos=newFileOutputStream(f);DataOutputStreamout_data=newDataOutputStream(fos);out_data.writeInt(100);out_data.writeInt(10012);out_data.writeLong(123456);out_data.writeFloat(3.1415926f);out_data.writeFloat(2.789f);out_data.writeDouble(987654321.1234);out_data.writeBoolean(true);out_data.writeBoolean(false);out_data.writeChars("Iamok");fos.close();}catch(IOExceptione){}try{ Filef=newFile("E:\\lx","jerry.dat"); FileInputStreamfis=newFileInputStream(f);DataInputStreamin_data=newDataInputStream(fis);System.out.println(":"+in_data.readInt());//读取第1个int整数

System.out.println(":"+in_data.readInt());//读取第2个int整数

System.out.println(":"+in_data.readLong());//读取long整数

System.out.println(":"+in_data.readFloat());//读取第1个float数

System.out.println(":"+in_data.readFloat());//读取第2个float数

System.out.println(":"+in_data.readDouble());System.out.println(":"+in_data.readBoolean());//读取第1个boolean值

System.out.println(":"+in_data.readBoolean());//读取第2个boolean值

charc;while((c=in_data.readChar())!='\0')//'\0'表示空字符

System.out.print(c);in_data.close();}catch(IOExceptione){}}}9.9对象流

1.ObjectInputStream类和ObjectOutputStream类

ObjectInputStream类和ObjectOutputStream类创建的对象被称为对象输入流和对象输出流。对象输出流使用writeObject(Objectobj)方法将一个对象obj写入输出流送往目的地,对象输入流使用readObject()从源中读取一个对象到程序中。

ObjectInputStream类和ObjectOutputStream类的构造方法分别是:

ObjectInputStream(InputStreamin)ObjectOutputStream(OutputStreamout)

作业P1921、2、4Java提供给我们的绝大多数对象都是所谓序列化的,比如组件等。一个类如果实现了Serializable接口,那么这个类创建的对象就是所谓序列化的对象。Serializable接口中的方法对程序是不可见的,因此实现该接口的类不需要实现额外的方法,当把一个序列化的对象写入到对象输出流时,JVM就会实现Serializable接口中的方法,按着一定格式的文本将对象写入到目的地。在下面的例子9中有一个实现接口Serializable的Goods类。返回9.11序列化与对象克隆使用对象流很容易得获取一个序列化对象的克隆。我们只需将该对象写入到对象输出流,然后用对象输入流读回的对象就是原对象的一个克隆。在下面的例子10中,我们将对象写入到内存,然后读回该对象的一个克隆。返回9.12随机读写流RandomAccessFile类的两个构造方法:(1)RandomAccessFile(Stringname,Stringmode)参数name用来确定一个文件名,给出创建的流的源,也是流目的地。参数mode取r(只读)或rw(可读写),决定创建的流对文件的访问权利。(2)RandomAccessFile(Filefile,Stringmode):参数file

是一个File对象,给出创建的流的源,也是流目的地。参数mode取r(只读)或rw(可读写),决定创建的流对文件的访问权利。RandomAccessFile类的常用方法方法描述close()关闭文件getFilePointer()获取文件指针的位置length()获取文件的长度read()从文件中读取一个字节的数据readBoolean()从文件中读取一个布尔值readByte()从文件中读取一个字节readChar()读取一个字符readDouble()从文件中读取一个双精度浮点值…………seek()定位文件指针在文件中的位置setLength(longnewlength)设置文件的长度skipBytes(intn)在文件中跳过给定数量的字节write(byteb[])写b.length个字节到文件writeBoolean(booleanv)把一个布尔值作为单字节值写入文件writeByte(intv)向文件写入一个字节writeBytes(Strings)向文件写入一个字符串writeChar(charc)向文件写入一个字符writeChars(Strings)向文件写入一个作为字符数据的字符串writeDouble(doublev)向文件写入一个双精度浮点值…………

例子:把几个int型整数写入到一个名字为E:\test\a.dat文件中,然后按相反顺序读出这些数据。

返回importjava.io.*;publicclassExample{publicstaticvoidmain(Stringargs[]){

Filef=newFile("E:\\test","a.dat");

RandomAccessFileinAndOut=null;intdata[]={20,30,40,50,60};try{

inAndOut=newRandomAccessFile(f,"rw");

}catch(Exceptione){}try{

for(inti=0;i<data.length;i++)

inAndOut.writeInt(data[i]);

for(longi=data.length-1;i>=0;i--){

inAndOut.seek(i*4);

System.out.printf("\t%d",inAndOut.readInt());

}System.out.print("\n");

inAndOut.close();

}

catch(IOExceptione){}}}例子中RondomAccessFile流使用readLine()读取一个文件

返回importjava.io.*;publicclassExample{publicstaticvoidmain(Stringargs[]){

Filef=newFile("E:\\test","Example.java");

RandomAccessFilein=null;try{

in=newRandomAccessFile(f,"rw");

longlength=in.length();//获取文件的长度

longposition=0;

in.seek(position);//将读取位置定位到文件的头

while(position<length){

Stringstr=in.readLi

温馨提示

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

评论

0/150

提交评论