




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第20讲Java的输入与输出流(上)/教学目标理解Java中流的概念掌握字节流InputStream和OutputStream及其子类的使用掌握字符流Reader和Writer及其子类的使用掌握随机读写文件流RandomAccessFile的使用
引例importjava.io.*;publicclassEx11_1{publicstaticvoidmain(Stringargs[]){try{
System.out.println("创建文件输入流对象……");
FileInputStream
fis=newFileInputStream("input.txt");
System.out.println("指定输入文件对象……");bytedata[]=newbyte[100];
System.out.println("读入文件数据到指定数组中……");
fis.read(data);Stringstr=data.toString();
System.out.println("创建文件输出流对象……");
FileOutputStream
fos=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成员方法主要功能publicabstractintread()throwsIOException自输入流中读取一个字节publicintread(byteb[])throwsIOException将输入的数据存放在指定的字节数组publicintread(byteb[],intoffset,intlen)throwsIOException自输入流中的offset位置开始读取len个字节并存放在指定的数组b中publicvoidreset()throwsIOException将读取位置移至输入流标记之处publiclongskip(longn)throwsIOException从输入流中跳过n个字节publicintavailable()throwsIOException返回输入流中的可用字节个数publicvoidmark(intreadlimit)在输入流当前位置加上标记publicbooleanmarkSupported()测试输入流是否支持标记(mark)用的所有资源publicvoidclose()throwsIOException关闭输入流,
并释放占用的所有资源字节输出流OutputStream类成员方法主要功能publicabstractvoidwrite(intb)throwsIOException写一个字节publicvoidwrite(byteb[])throwsIOException写一个字节数组publicvoidwrite(byteb[],int
offset,int
len)throwsIOException将字节数组b中从offset位置开始的、长度为len个字节的数据写到输出流中publicvoidflush()throwsIOException写缓冲区内的所有数据publicvoidclose()throwsIOException关闭输出流,并释放占用的所有资源标准输入流标准输入:InputStreamis=System.in;
它是一个标准输入流,一般接收键盘的响应,得到键盘所传递来的信息。例11.2下面程序可以从键盘输入字符到程序中,并在屏幕上重新打印出来。importjava.io.*;classEx11_2{publicstaticvoidmain(Stringargs[])throwsIOException{
bytebuf[]=newbyte[255];
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_3{publicstaticvoidmain(Stringargs[])throwsIOException{
intb;while((b=System.in.read())!=-1){
System.out.print((char)b);}
System.out.println();}}文件字节输入流类FileInputStreamInputStream类和OutputStream类都是抽象类,不能实例化,因此在实际应用中并不使用这两个类,而是使用一些基本数据流类,如FileInputStream和FileOutputStream,它们分别是InputStream类和OutputStream类的子类,用于进行文件输入和输出的处理,其数据源和目标都是文件。FileInputStream用于顺序访问本地文件。它从超类InputStream中继承了read、close等方法对本机上的文件进行操作,但不支持mark方法和reset方法。
FileInputStream类构造方法FileInputStream类主要有三个构造方法:FileInputStream(Stringname)FileInputStream(Filefile)FileInputStream(FileDescriptor
fd)第一个构造方法使用给定的文件名name创建一个FileInputStream对象,用来打开一个到达该文件的输入流,这个文件就是源。第二个构造方法使用File对象FileInputStream对象,用来指定要打开哪个文件。FileDescriptor也是java.io包中的类,主要用于关联到已打开的文件,或已打开的网络链接,或者其他I/O连接,在机器底层发挥作用,可以强制系统缓冲区与底层设备保持同步,从而为输入输出流提供一个与底层设备同步的系统缓冲区,但是这个类不大常用,大家只要了解就可以了。FileInputStream类读取字节的方法在创建文件输入流对象之后,可以调用read方法从流中读取字节,read方法有三种格式:publicintread()throwsIOExceptionpublicintread(byte[]b,int
off,int
len)throwsIOException
publicintread(byte[]b)throwsIOExceptionread()方法将返回一个整数,它包含了流中的下一个字节。如果返回的是-1,则表示到达了文件输入流的末尾。这种方法每次只能从文件输入流中读取一个字节,为了能从流中读入多个数据字节,可以调用read(byteb[],int
off,int
len)方法,该方法从输入流当前字节处起读取长度为len字节的数据,从位置off处起存入数组b中,b中位置在off之前和在off+len之后的数据将保持不变,返回读取的数据长度,并将第len个字节设为当前字节。
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中。
try{
FileInputStream
fis=newFileInputStream("java7.txt");......}catch(IOExceptione){
System.out.println("FileException:"+e);}FileInputStream举例在使用FileInputStream类时要注意:若关联的目录或者文件不存在,Java就会抛出一个IOException异常。程序可以使用try-catch块检测和处理捕捉到的异常。例如,为了把一个文件输入流对象与一个文件关联起来,可以使用下列的代码段来处理Java产生的IOEception异常。关闭输入流
publicvoidclose()
throwsIOException
虽然Java在程序结束时会自动关闭所有打开的流,但还是建议大家养成一个良好的习惯,在使用完流后,调用close()方法显式地关闭任何打开的流,以防止一个被打开的流用完系统资源。文件字节输出流类FileOutputStreamFileOutputStream类用于向一个文本文件写数据,它从其超类OutputStream中继承了write、close等方法。
构造方法publicFileOutputStream(Stringname)throwsFileNotFoundExceptionpublicFileOutputStream(Filefile)throwsFileNotFoundExceptionpublicFileOutputStream(String
name,booleanappend)throwsFileNotFoundExceptionappend表示文件是否为添加的写入方式。当append值false时,为重写方式,即从头写入;当append值为true时,为添加方式,即从尾写入。append默认值为false。例如:
FileOutputStream
fos=newFileOutputStream("OutputFile.txt",true);FileOutputStream类写入字节的方法使用write方法将指定的字节写入文件输出流。Write方法有3种格式:publicvoidwrite(intb)throwsIOExceptionpublicvoidwrite(byte[]b)throwsIOExceptionpublicvoidwrite(byte[]b,int
off,int
len)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异常。用FileOutputStream对象写入时,如果文件不存在,则会创建一个新文件,如果文件已存在,使用重写方式
则会覆盖原有数据。
例11.4
编写程序,应用FileInputStream类实现从"c:\file.dat"中读出第5个字节到变量c中,并输出。
importjava.io.*;publicclassEx11_4{publicstaticvoidmain(Stringargs[]){try{
FileInputStream
fis=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(byte
b[],int
off,int
len)第一个构造方法以一个字节数组作为参数,数据源完全复制到内部缓冲区。第二个构造方法的参数包括一个字节数组、一个整型偏移量和一个整型长度,与第一个构造方法不同的是,此构造方法生成的内部缓冲区将以指定偏移量位置为起始位置,并且能读取的最大数据长度为指定的长度。这个字节数组就是该输入流的数据源。内存缓冲区保持一个标记,指向当前字节。ByteArrayInputStream类ByteArrayInputStream可从字节数组中读取数据,它重写了其父类InputStream的部分方法,如:publicintread();publicintread(byteb[],int
off,int
len);publiclongskip(longn)publicintavailable();publicboolean
markSupported();publicvoidmark(inttag);publicvoidreset();publicvoidclose()throwsIOExceptionByteArrayOutputStream
类与ByteArrayInputStream对应,ByteArrayOutputStream
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 人工建筑劳务合同范本
- 入园合同范例
- 个人陶瓷采购合同范本
- 劳务派遣补充合同范本
- 切砖清工合同范本
- 光明果蔬配送合同范本
- 借款合同范本网上查询
- 转租饭店合同范本
- 净化车间改造工程合同范本
- 会所会籍合同范本
- 教科版小学科学六年级上册期末考试试卷(含答案)
- 父母买房在子女名下协议书范本
- 项目投资计算分析表系统(共有17张表格)excel格式
- DBJ15 31-2016建筑地基基础设计规范(广东省标准)
- 高危新生儿管理专家共识解读
- 广东省深圳市2024年重点中学小升初数学入学考试卷含解析
- 2023北师大版新教材高中数学必修第一册考前必背
- 《纺织服装材料》课件-0绪论
- 盘扣式卸料平台施工方案
- 绘本故事在小学道德与法治课堂中的有效教学策略分析
- JB-T 14426-2023 往复式气液混输泵装置
评论
0/150
提交评论