Java面向对象程序设计 赵生慧 21476-0011_第1页
Java面向对象程序设计 赵生慧 21476-0011_第2页
Java面向对象程序设计 赵生慧 21476-0011_第3页
Java面向对象程序设计 赵生慧 21476-0011_第4页
Java面向对象程序设计 赵生慧 21476-0011_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

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

文档简介

第11章Java的输入与输出流,Java教材编写组,教学目标,理解Java中流的概念掌握字节流InputStream和OutputStream及其子类的使用掌握字符流Reader和Writer及其子类的使用掌握随机读写文件流RandomAccessFile的使用,引例,/Ex11_1.javaimportjava.io.*;publicclassEx11_1publicstaticvoidmain(Stringargs)trySystem.out.println(创建文件输入流对象);FileInputStreamfis=newFileInputStream(input.txt);System.out.println(指定输入文件对象);bytedata=newbyte100;System.out.println(读入文件数据到指定数组中);fis.read(data);Stringstr=data.toString();System.out.println(创建文件输出流对象);FileOutputStreamfos=newFileOutputStream(output.txt);System.out.println(将指定数组的内容读入文件中);fos.write(str.getBytes();System.out.println(关闭所有文件);fis.close();fos.close();catch(Exceptione),本实例中主要应用Java的输入输出流实现文件的复制。,概述,输入流,输出流,在JavaAPI中,I/O包提供了大量的流类来实现数据的输入和输出,主要分为两类:一种是字节流,另一种是字符流,分别由四个抽象类来表示:InputStream、OutputStream、Reader和Writer.所有输入流类都是InputStream类或者Reader类的子类,它们都继承了read()方法用于读取数据。而所有输出流类都是OutputStream类或者Writer类的子类,它们都继承了write()方法用于写入数据。,InputStream/OutputStream和Reader/Writer都直接继承自Java的根类Object,它们各自形成一个独立的继承体系。,字节流,字节流用来读写8位的数据。由于在读写中不会对数据作任何转换,所以可以用来直接处理二进制的数据。字节流分为输入流InputStream和输出流OutputStream,所有其他的字节流都是它们的子类。,InputStream和OutputStream类,字节输入流InputStream类.所有的字节输入流都是InputStream类及其子类,用于从外部设备获取数据到计算机内存中,通过定义其子类以及方法来实现字节输入功能。右表给出了其主要方法.,字节输出流OutputStream类.所有的字节输出流都是OutputStream类及其子类,用于将计算机内存的数据输出到外部设备.通过定义其子类以及方法来实现字节输出功能。右表给出了其主要方法,标准输入流,标准输入:InputStreamis=System.in;它是一个标准输入流,一般接收键盘的响应,得到键盘所传递来的信息。,例11.2下面程序可以从键盘输入字符到程序中,并在屏幕上重新打印出来。,importjava.io.*;classEx11_2publicstaticvoidmain(Stringargs)throwsIOExceptionbytebuf=newbyte255;System.out.println(enter:);System.in.read(buf,0,255);System.out.println(Got:);Stringstr=newString(buf);System.out.println(str);,例11.3编程实现从键盘读入若干字符,然后显示出来。,importjava.io.*;publicclassEx11_3publicstaticvoidmain(Stringargs)throwsIOExceptionintb;while(b=System.in.read()!=-1)System.out.print(char)b);System.out.println();,文件字节输入流类FileInputStream,InputStream类和OutputStream类都是抽象类,不能实例化,因此在实际应用中并不使用这两个类,而是使用一些基本数据流类,如FileInputStream和FileOutputStream,它们分别是InputStream类和OutputStream类的子类,用于进行文件输入和输出的处理,其数据源和目标都是文件。FileInputStream用于顺序访问本地文件。它从超类InputStream中继承了read、close等方法对本机上的文件进行操作,但不支持mark方法和reset方法。,FileInputStream类构造方法,FileInputStream类主要有三个构造方法:FileInputStream(Stringname)FileInputStream(Filefile)FileInputStream(FileDescriptorfd)第一个构造方法使用给定的文件名name创建一个FileInputStream对象,用来打开一个到达该文件的输入流,这个文件就是源。第二个构造方法使用File对象FileInputStream对象,用来指定要打开哪个文件。第三个构造方法比较特别,是以FileDescriptor对象为参数的。FileDescriptor也是java.io包中的类,主要用于关联到已打开的文件,或已打开的网络链接,或者其他I/O连接,在机器底层发挥作用,可以强制系统缓冲区与底层设备保持同步,从而为输入输出流提供一个与底层设备同步的系统缓冲区,但是这个类不大常用,大家只要了解就可以了。,FileInputStream类读取字节的方法,在创建文件输入流对象之后,可以调用read方法从流中读取字节,read方法有三种格式:publicintread()throwsIOExceptionpublicintread(byteb,intoff,intlen)throwsIOExceptionpublicintread(byteb)throwsIOExceptionread()方法将返回一个整数,它包含了流中的下一个字节。如果返回的是-1,则表示到达了文件输入流的末尾。这种方法每次只能从文件输入流中读取一个字节,为了能从流中读入多个数据字节,可以调用read(byteb,intoff,intlen)方法,该方法从输入流当前字节处起读取长度为len字节的数据,从位置off处起存入数组b中,b中位置在off之前和在off+len之后的数据将保持不变,返回读取的数据长度,并将第len个字节设为当前字节。,FileInputStream举例,Stringstr=;FileInputStreamfin=newFileInputStream(c:Ex11_3.java);for(inti=fin.read();i!=-1;i=fin.read()str+=(char)i;,上述程序段的功能是应用read()方法将c:Ex11_3.java的内容输出到字符串str中。,在使用FileInputStream类时要注意:若关联的目录或者文件不存在,Java就会抛出一个IOException异常。程序可以使用try-catch块检测和处理捕捉到的异常。例如,为了把一个文件输入流对象与一个文件关联起来,可以使用下列的代码段来处理Java产生的IOEception异常。,tryFileInputStreamfis=newFileInputStream(java7.txt);.catch(IOExceptione)System.out.println(FileException:+e);,关闭输入流,publicvoidclose()throwsIOException虽然Java在程序结束时会自动关闭所有打开的流,但还是建议大家养成一个良好的习惯,在使用完流后,调用close()方法显式地关闭任何打开的流,以防止一个被打开的流用完系统资源。,文件字节输出流类FileOutputStream,FileOutputStream类用于向一个文本文件写数据,它从其超类OutputStream中继承了write、close等方法。构造方法publicFileOutputStream(Stringname)throwsFileNotFoundExceptionpublicFileOutputStream(Filefile)throwsFileNotFoundExceptionpublicFileOutputStream(Stringname,booleanappend)throwsFileNotFoundException,其中,name为文件名,file为文件类File对象,append表示文件是否为添加的写入方式。当append值false时,为重写方式,即从头写入;当append值为true时,为添加方式,即从尾写入。append默认值为false。例如,下面语句以文件名OutputFile.txt构造文件数据输出流对象fos,并设置添加的写入方式:FileOutputStreamfos=newFileOutputStream(OutputFile.txt,true);,文件字节输出流类FileOutputStream(续),FileOutputStream类写入字节的方法,使用write方法将指定的字节写入文件输出流。Write方法有3种格式:publicvoidwrite(intb)throwsIOExceptionpublicvoidwrite(byteb)throwsIOExceptionpublicvoidwrite(byteb,intoff,intlen)throwsIOExceptionwrite方法可以向文件写入一个字节、一个字节数组或一个字节数组的一部分。当b是int类型时,b占用4个字节32位,通常是把b的低8位写入输出流,忽略其余高24位。当b是字节数组时,可以写入从off位置开始的len个字节,如果没有off和len参数,则写入所有字节,相当于write(b,0,b.length)。,关闭输出流,publicvoidclose()throwsIOExceptionclose方法关闭输出流,并释放相关的系统资源。发生I/O错或文件关闭时,抛出IOException异常。如果off或len为负数或off+len大于数组b的长度length,则抛出IndexOutOfBoundsException异常;如果b是空数组,则抛出NullPointerException异常。用OutputStream是否为FileOutputStream对象写入时,如果文件不存在,则会创建一个新文件,如果文件已存在,使用重写方式则会覆盖原有数据。,例11.4编写程序,应用FileInputStream类实现从c:file.dat中读出第5个字节到变量c中,并输出。,importjava.io.*;publicclassEx11_4publicstaticvoidmain(Stringargs)tryFileInputStreamfis=newFileInputStream(c:file.dat);fis.skip(4);intc=fis.read();System.out.println(char)c);fis.close();catch(Exceptione)e.printStackTrace();,内存的读写,在java.io中,还提供了ByteArrayInputStream和ByteArrayOutputStream类来直接访问内存,它们分别是InputStream和OutputStream的子类。类ByteArrayInputStream有两个构造方法:publicByteArrayInputStream(byteb)publicByteArrayInputStream(byteb,intoff,intlen)第一个构造方法以一个字节数组作为参数,数据源完全复制到内部缓冲区。第二个构造方法的参数包括一个字节数组、一个整型偏移量和一个整型长度,与第一个构造方法不同的是,此构造方法生成的内部缓冲区将以指定偏移量位置为起始位置,并且能读取的最大数据长度为指定的长度。这个字节数组就是该输入流的数据源。内存缓冲区保持一个标记,指向当前字节。,ByteArrayInputStream类,ByteArrayInputStream可从字节数组中读取数据,它重写了其父类InputStream的部分方法,如:publicintread();publicintread(byteb,intoff,intlen);publiclongskip(longn)publicintavailable();publicbooleanmarkSupported();publicvoidmark(inttag);publicvoidreset();publicvoidclose()throwsIOException,ByteArrayOutputStream类,与ByteArrayInputStream对应,ByteArrayOutputStream对象中同样有一个字节数组类型的属性,作为内部缓冲区,同时也是该输出流的接收端。类ByteArrayOutputStream有两个构造方法:publicByteArrayOutputStream()publicByteArrayOutputStream(intlen)第一个构造方法没有参数,生成的内部缓冲区的默认大小为32个字节。第二个构造方法有一个整型参数,指定生成的内部缓冲区的初始大小,内部缓冲区大小将随数据的写入自动更改。,ByteArrayOutputStream类(续),ByteArrayOutputStream可向字节数组写入数据,它重写了其父类OutputStream的方法,如:publicvoidwrite(intb);publicvoidwrite(byteb,intoff,intlen);publicvoidwtiteTo(OutputStreamout)throwsIOException;publicvoidreset();publicvoidclose()throwsIOException;ByteArrayOutputStream除了重写父类OutputStream以上的方法外,还自包含了以下四个方法:publicbytetoByteArray():建立一个新的数组,将缓冲区的数据复制到该数组中,并返回存放当前输出流内容的数组。publicintsize():返回缓冲区的大小。publicStringtoString():根据操作系统默认的编码格式,将内部缓冲区的数据转换为一个字符串返回。publicStringtoString(Stringenc):根据编码格式enc,将内部缓冲区的数据转换为一个字符返回。,字符流,用户程序有时需要读取其他格式的数据,如Unicode格式的文字内容,Java提供了相应的输入输出流:字符流。字符流中的大多数的类都能在字节流中找到相应的类。字符流分为Reader和Writer两个类,分别实现字符的输入与输出。,Reader类和Writer类,字符流提供了处理字符的输入/输出的方法,包括两个抽象类Reader和Writer。字符流Reader指字符流的输入流,用于输入,而Writer指字符流的输出流,用于输出。Reader和Writer使用的是Unicode,可以对不同格式的流进行操作。从Reader和Writer派生出的子类的对象都能对Unicode字符流进行操作,由这些对象来实现与外设的连接。,Reader类常用方法,Writer类常用方法,字符文件流FileReader和FileWriter类,FileReader、FileWriter类用于字符文件的输入输出处理,与文件数据流FileInputStream、FileOutputStream的功能相似。其构造方法如下:publicFileReader(Filefile)throwsFileNotFoundExceptionpublicFileReader(Stringfilename)throwsFileNotFoundExceptionpublicFileWriter(Filefile)throwsIOExceptionpublicFileWriter(StringfileName,booleanappend)throwsIOExceptionFileReader从超类中继承了read、close等方法,FileWriter从超类中继承了write、close等方法。下面是一段创建FileReader对象的代码,可以使用该对象读取名为java11.txt的文件。FileReaderin=newFileReader(java11.txt);,importjava.io.*;publicclassEx11_5publicstaticvoidmain(Stringargs)FileReaderfr;intch;tryfr=newFileReader(c:Ex11_5.java);while(ch=fr.read()!=-1)System.out.print(char)ch);catch(Exceptione)e.printStackTrace();,例11.5用FileReader一个字符一个字符地读取整个文件。,字符文件流FileReader和FileWriter类(续),字符缓冲流BufferedReader类和BufferedWriter类,FileReader和FileWriter类以字符为单位进行输入输出,无法进行整行输入与输出,数据的传输效率很低。Java提供BufferedReader和BufferedWriter类以缓冲区方式进行输入输出,其构造方法如下:publicBufferedReader(Readerin)publicBufferedReader(Readerin,intsz)publicBufferedWriter(Writerout)publicBufferedWriter(Writerout,intsz)BufferedReader流能够读取文本行,方法是readLine()。通过向BufferedReader传递一个Reader对象或者Reader子类对象来创建一个BufferedReader对象,如:BufferedReaderbr=BufferedReader(newFileReader(java11.txt));然后再从流br中读取java11.txt中的内容。类似的,可以将BufferedWriter流与FileWriter流连接起来,然后通过BufferedWriter流将数据写到目的地,例如:FileWriterfw=newFileWriter(java11.in);BufferedWriterbw=newBufferedWriter(fw);,importjava.io.*;publicclassEx11_6publicstaticvoidmain(Stringargs)FileReaderfr;BufferedReaderbr;intch;tryfr=newFileReader(c:Ex11_6.java);br=newBufferedReader(fr);while(ch=br.read()!=-1)System.out.print(char)ch);catch(Exceptione)e.printStackTrace();,然后使用BufferedReader类的成员方法write(Stringsintoff,intlen)把字符串s写到java11.in中,参数off是字符串s开始处的偏移量,len是写入的字符长度。例11.6在例11.5中按字符一个一个的读取,效率比较低,现在应用BufferedWriter类来优化它,每次读取若干个字符。,字符缓冲流BufferedReader类和BufferedWriter类(续),随机读写文件,RandomAccessFile类创建的流与前面的输入输出流不同,RandomAccessFile类独立于字节流和字符流体系之外,不具有字节流和字符流的任何特性,它直接继承自Java的基类Object。RandomAccessFile类有两个构造方法。RandomAccessFile(Stringname,Stringmode):参数name用来确定一个文件名,给出创建的流的源,也可以是目的地。参数mode用来决定创建流对文件的访问权限,其值可以取r(只读)或者rw(可读写)。注意没有只写方式(w)。RandomAccessFile(Filefile,Stringmode):参数file是一个File对象,给出创建流的源,也可以是目的地。参数mode与前面的含义是一致的。,RandomAccessFile类常用方法,例11.7应用类RandomAccessFile编写程序,实现将两个磁盘文件input1.txt和input2.txt中的内容合并,并显示在屏幕上。,importjava.io.*;publicclassEx11_7publicstaticvoidmain(Stringargs)Strings=;tryRandomAccessFilef1=newRandomAccessFile(c:/input1.txt,rw);RandomAccessFilef2=newRandomAccessFile(c:/input2.txt,rw);s=f1.readLine()+f2.readLine();charc=s.toCharArray();for(inti=0;is.length();i+)System.out.print(ci);System.out.println();catch(Exceptione),importjava.awt.*;importjava.awt.event.*;importjava.io.*;publicclassEx11_8extendsWindowAdapterimplementsActionListenerFramef;Buttonbtn;TextAreata;StringfileName;publicstaticvoidmain(Stringargv)newEx11_8(output.txt);publicEx11_8(StringfileName)this.fileName=fileName;f=newFrame(fileName);f.addWindowListener(this);btn=newButton(保存文件);btn.addActionListener(this);ta=newTextArea(10,40);f.add(ta,BorderLayout.CENTER);f.add(btn,BorderLayout.SOUTH);f.pack();f.setVisible(true);,实例1,publicvoidactionPerformed(ActionEvente)tryFileOutputStreamfout=newFileOutputStream(fileName);bytebuf=ta.getText().getBytes();fout.write(buf);fout.close()

温馨提示

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

评论

0/150

提交评论