第9章 输入输出流.docx
- 文档编号:5429312
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:17
- 大小:31.29KB
第9章 输入输出流.docx
《第9章 输入输出流.docx》由会员分享,可在线阅读,更多相关《第9章 输入输出流.docx(17页珍藏版)》请在冰豆网上搜索。
第9章输入输出流
第9章输入输出流WORD文档使用说明:
第9章输入输出流来源于PDFWORD
本WOED文件是采用在线转换功能下载而来,因此在排版和显示效果方面可能不能满足您的应用需求。
如果需要查看原版WOED文件,请访问这里
第9章输入输出流文件原版地址:
第9章输入输出流|PDF转换成WROD_PDF阅读器下载
第9章输入输出流
本章知识框图
学习重点:
掌握基本输入输出流。
掌握按数据类型操作输入输出流。
掌握输入输出对象。
掌握文件/目录操作。
Java采用“流”(Stream)来完数据的输入(Input)和输出(Output),输入输出简称I/O。
从外部数据源将数据读入程序的流称为输入流,从程序中将数据写入外部数据源的流称为输出流。
外部数据源可以是磁盘文件、程序、内存或硬件设备。
可以按字节、字符或类型化的数据进行输入输出。
也可以将对象写入文件,或从文件中读出对象。
本章将详细介绍各种常用的输入输出流操作。
基本输入输出流
基本的输入输出流包括字节流、字符流和缓冲流。
在输入时,可使用Scanner对象从流读取特定类型的数据。
在输出时,可以对输出格式进行控制。
字节流
字节流按字节(8位二进制)输入和输出数据。
Java定义了很多字节流类,这些类都是两个抽象类InputStream和OutputStream.的派生类。
本节主要讲解两个基本的字节流类:
FileInputStream(文件输入流)和FileOutputStream(文件输出流)。
1、创建FileInputStream对象
可用下列方法创建文件输入流对象:
(1)FileInputStream(Filefile)用File对象创建一个FileInputStream对象,File对象指定实际访问的磁盘文件。
例如:
FileInputStreamdatain=newFileInputStream(newFile(""));文件没有指定路径,默认与应用程序在相同目录中。
如果未找到指定文件,则抛出FileNotFoundException异常。
(2)FileInputStream(FileDescriptorfdObj)用FileDescriptor对象创建一个FileInputStream对象。
例如:
FileInputStreamdatain=newFileInputStream();FileDescriptor定义了3个静态对象,等价于,等价于,等价于。
创建FileInputStream对象时,只能使用。
采用这种方式创建的FileInputStream对象可以从键盘读取数据。
(3)FileInputStream(Stringname)用指定的文件名创建一个FileInputStream对象。
例如:
FileInputStreamdatain=newFileInputStream("");Windows环境中的路径分隔符号为“\”,可用“\\”或“/”作为路径分隔符。
例如:
FileInputStreamdatain=newFileInputStream("d:
\\javatemp\\chapter09\\");
2、FileInputStream对象操作
FileInputStream对象常用操作如下:
available():
返回可读的字节数。
若没有可读数据,返回值为0。
close():
关闭文件输入流。
read():
从输入流读取一个字节,返回值类型为int。
若没有可读数据,返回-1。
read(byte[]b):
从输入流读取数据,按顺序放入b的各个数组元素中。
返方法回值类型为int,表示从流中读取的总的字节数。
若没有可读数据,返回值为-1。
read(byte[]b,intbindex,intcount):
最多从输入流读取count个字节,按顺序放入b数组中下标从bindex开始的元素中。
返方法回值类型为int,表示从流中读取的总的字节数。
若没有可读数据,返回值为-1。
skip(longn):
在流中跳过n个字节。
n不能为负数,否则产生错误。
FileInputStream对象的各个方法在出现错误时,会抛出IOException异常。
IOException异常属于检查异常,必须在代码中捕捉或声明方法抛出
【例】
使用FileInputStream对象读取文件数据。
(源文件位置:
光盘:
\chapter09\.,光盘:
\chapter09\)useFileInputStream从文本文件中读取数据,并显示在命令提示符窗口中。
文件内容如下:
1:
firstline2:
secondline3:
thirdline
程序代码如下:
import.*;publicclassuseFileInputStream{publicstaticvoidmain(String[]args)throwsIOException{FileInputStreamin=null;try{in=newFileInputStream("");("文件总字节数:
"+());("****文件内容如下****");intc;
while(()!
=0)//如果还有可读数据则循环{c=();//读一个字节//read方法返回的是int型数据,要按字符输出,//所以用char强制转换数据类型。
//如果不转换,输出为字符ASCII码的十进制值((char)c);//输出}("****文件内容结束****");();//关闭流in=newFileInputStream("");//重新建立文件输入流intcount=0;byteb[]=newbyte[5];(16);//跳过16个字节
if(()!
=0)count=(b);//从流读取数据到字节数组("用数组读出的数据:
");for(inti=0;i ");for(inti=0;i =null)();//关闭流}}} 代码中使用了FileInputStream的各种方法,这些方法可能产生IOException异常。 代码中没有使用catch处理IOException异常,所以在main方法的参数表之后使用throws关键字声明方法可能抛出IOException异常。 程序在finally代码块中关闭文件输入流。 如果没有在程序中调用close方法关闭流,系统可自动将其关闭。 close方法在关闭流的同时,释放维护流使用的相同资源,所以建议读者在代码中显式调用close方法关闭流,以便提供相同效率。 程序将关闭流操作放在finally代码块中,这是因为不管程序运行是否有错,finally代码都会执行,从而保证关闭流。 说明: 说明: 本例中文件内容为ASCII码字符。 如果文件中包含非ASCII码字符,比如汉字,按字节读取会导致非ASCII码字符不能读取和显示。 3、创建FileOutputStream对象 可用下列方法创建FileOutputStream对象: (1)FileOutputStream(Filefile)用指定File对象创建文件输出流,向File对象指定的文件输出数据。 该方法始终创建一个新文件。 如果已存在同名文件,原文件被覆盖。 File对象指定的是一个文件夹或者文件路径错误,则会产生FileNotFoundException异常。 例如: FileOutputStreamdataout=newFileOutputStream(newFile("")); (2)FileOutputStream(Filefile,booleanappend)参数append为false时,与FileOutputStream(Filefile)相同。 参数append为true时,表示向文件添加数据。 例如: FileOutputStreamdataout=newFileOutputStream(newFile(""),true);(3)FileOutputStream(FileDescriptorfdObj)用FileDescriptor对象创建文件输出流。 例如: FileOutputStreamdataout=newFileOutputStream();(4)FileOutputStream(Stringname)用指定文件名创建文件输出流,向文件输出数据,与FileOutputStream(Filefile)方法类似。 例如: FileOutputStreamdataout=newFileOutputStream("");(5)FileOutputStream(Stringname,booleanappend)参数append为false时,与FileOutputStream(Stringname)相同。 参数append为true时,表示向文件添加数据。 例如: FileOutputStreamdataout=newFileOutputStream("",true); 4、FileOutputStream对象操作 FileOutputStream对象常用操作如下: close(): 关闭文件输出流。 flush(): 刷新流,即向流中的数据全部写入文件。 write(intn): 向文件写入一个字节。 如果n大于255,即多余一个字节,则将n的最后一个字节写入文件。 写入文件的字节n视为字符的ASCII码。 例如,write(65)写入文件的是字符AASCIIwrite(65)A(其ASCII码为65)。 write(byte[]b): 将字节数组b中的数据按顺序写入文件。 write(byte[]b,intbindex,intcount): 将字节数组b中下标从bindex开始的count个元素写入文件。 FileOutputStream对象的各个方法在出现错误时,会抛出IOException异常。 【例】 使用FileOutputStream对象向文件写数据。 (源文件位置: 光盘: \chapter09\.,光盘: \chapter09\,光盘: \chapter09\)useFileOutputStream首先将文本文件中的数据复制到新文件中,再为文件添加部分数据。 文件内容如下: 春晓春眠不觉晓处处闻啼鸟夜来风雨声花落知多少 程序代码如下: //将文件中的数据复制到文件中,并添加部分数据import.*;publicclassuseFileOutputStream{publicstaticvoidmain(String[]args)throwsIOException{FileInputStreamin=null;FileOutputStreamout=null;try{in=newFileInputStream("");out=newFileOutputStream(""); //复制文件while(()! =0)//如果还有可读数据则循环(());();//关闭输出流//重新打开文件,添加数据out=newFileOutputStream("",true);('\n');//写入一个换行符//24897的二进制为110000101000001,第二个字节为字符A的//ASCII码,所以下面的语句实际写入的是字符A(24897);('\n');//写入一个换行符byteb[]=newbyte[10];for(bytei=0;i<;i++)b[i]=(byte)(97+i);(b);//将输入写入文件,实际写入abcdefghij("文件操作结束! ");}finally{if(in! =null)();if(out! =null)();}}}//关闭流//关闭流 字符流 字符流按字符读取和写入数据。 Java采用Unicode字符,在读写文件时,字符流可以自动将文件中的本地字符转换为Unicode字符。 本节介绍两个字符流类: FileReader(读文件)和FileWriter(写文件)。 FileReader和FileWriter类的基类分别为InputStreamReader和OutputStreamWriter类,InputStreamReader和OutputStreamWriter类分别继承抽象类Reader和Writer。 InputStreamReader和OutputStreamWriter类可以按本地字符集和指定字符集读写文件。 文件中的数据仍按字节读写,InputStreamReader和OutputStreamWriter流完成字符和字节的转换。 FileReader和FileWriter流采用本地字符集读写文件。 1、创建FileReader对象 可用下列方法创建FileReader对象: FileReader(Filefile)用File对象创建一个FileReader对象,File对象指定实际访问的磁盘文件。 例如: FileReaderdatain=newFileReader(newFile(""));FileReader(FileDescriptorfdObj)用FileDescriptor对象创建一个FileReader对象。 例如: FileReaderdatain=newFileReader();FileReader(Stringname)用指定的文件名创建一个FileReader对象。 例如: FileReaderdatain=newFileReader("d: \\javatemp\\chapter09\\"); 2、FileReader流常用操作 FileReader流常用操作如下: getEncoding(): 返回文件采用的字符集。 close(): 关闭流。 read(): 从流读取一个字符,返回值类型为int。 若没有可读数据,返回-1。 read(char[]b): 从流读取字符,按顺序放入b的各个数组元素中。 返方法回值类型为int,表示从流中读取的总的字符数。 若没有可读数据,返回值为-1。 read(char[]b,intbindex,intcount): 最多从输入流读取count个字符,按顺序放入b数组中下标从bindex开始的元素中。 返方法回值类型为int,表示从流中读取的总的字符数。 若没有可读数据,返回值为-1。 skip(longn): 在流中跳过n个字符。 n不能为负数,否则产生错误。 3、创建FileWriter对象 可用下列方法创建FileWriter对象: FileWriter(Filefile)用指定File对象创建FileWriter流,向File对象指定的文件输出数据。 该方法始终创建一个新文件。 如果已存在同名文件,原文件被覆盖。 File对象指定的是一个文件夹或者文件路径错误,则会产生FileNotFoundException异常。 例如: FileWriterdataout=newFileWriter(newFile(""));FileWriter(Filefile,booleanappend)参数append为false时,与FileWriter(Filefile)相同。 参数append为true时,表示向文件添加数据。 例如: FileWriterdataout=newFileWriter(newFile(""),true); FileWriter(FileDescriptorfdObj)用FileDescriptor对象创建FileWriter流。 例如: FileWriterdataout=newFileWriter();FileWriter(Stringname)用指定文件名创建FileWriter流,向文件输出数据,与FileWriter(Filefile)方法类似。 例如: FileWriterdataout=newFileWriter("");FileWriter(Stringname,booleanappend)参数append为false时,与FileWriter(Stringname)相同。 参数append为true时,表示向文件添加数据。 例如: FileWriterdataout=newFileWriter("",true); 4、FileWriter对象操作 FileWriter对象常用操作如下: close(): 关闭FileWriter流。 flush(): 刷新流,即向流中的数据全部写入文件。 getEncoding(): 返回文件采用的字符集。 write(intn): 向文件写入一个字符,n为字符的Unicode码。 write(char[]b): 将字符数组b写入文件。 write(char[]b,intbindex,intcount): 将字符数组b中下标从bindex开始的count个元素写入文件。 write(Stringb): 将字符串b写入文件。 write(Stringb,intindex,intcount): 将字符串b中序号从index开始的count个字符写入文件。 append(charc): 将字符c写入文件。 append(CharSequence[]b): 将字符序列b写入文件。 String类型为一个典型的实现了CharSequence接口的类。 append(CharSequence[]b,intstart,intend): 将字符串序列b中下标start开始到end的字符写入文件。 缓冲流 前面前面介绍的字节流和字符流均未使用内存缓冲区,也就是说,每次读写一个字节或字符都是直接访问文件,这会导致大量数据读写时频繁访问文件。 缓冲输入输出流则是在内存中创建一个缓冲区来缓存数据。 程序只是从缓冲区读取数据,不直接访问文件。 输入数据时,缓冲流在缓冲区为空时自动从文件读取数据填满缓冲区。 输出数据时,数据首先写入缓冲区,缓冲区填满或执行flush方法时,缓冲流将缓冲的数据写入文件。 Java提供了4种缓冲流,BufferedInputStream和Java4BufferedInputStreamBufferedOutputStream用于缓冲字节流,BufferedReader和BufferedWriter用于缓冲字符流。 可以创建默认大小缓冲区的缓冲流。 例如: BufferedReaderin=newBufferedReader(newFileReader(""));也可创建指定大小缓冲区的缓冲流。 例如: BufferedWriterout=newBufferedWriter(newFileWriter(""),100); 格式化输入输出 字节流和字符流只是按字节或字符读写文件。 如果要从读取特定类型的数据,例如读一个整数,则需要使用Scanner对象。 在将特定类型的数据写入文件,则可使用PrintWriter或PrintStream对象完成输出。 格式化输入 Scanner对象可以按基本数据类型从字符串或各种输入流中解析数据。 1、创建Scanner对象 Scanner类的构造方法有两种基本格式: Scanner(数据源)Scanner(数据源,字符集)创建Scanner对象的数据源可以是一个字符串、File对象、InputStream对象、InputStream子类对象、Readable对象或ReadableByteChannel对象。 例如: Scannerin1=newScanner("1one2two");Scannerin2=newScanner(newFile(""));Scannerin3=newScanner(newFileReader(""));Scannerin4=newScanner(newFileReader(""));Scannerin5=newScanner(newFileInputStream(""));Scannerin6=newScanner(newBufferedReader(newFileReader(""))); 在创建访问各种流的Scanner对象时,可用一个字符串指明数据源采用的字符集,默认为本地字符集。 从文件读出字节时,将其转换为指定字符集的字符。 例如: Scannerin2=newScanner(newFile(""),"GB2312");//指定采用的字符集Scanner对象在不使用之后,应调用close方法将其关闭。 例如: in1close(); 2、从数据源解析数据 Scanner对象用一系列的next方法从数据源解析各种类型的数据: next(): 从数据源读取一个字符串。 nextLine(): 将当前位置到换行符号之前的全部内容作为一个字符串返回。 nextBoolean()nextBoolean(): 从数据源读取一个boolean类型值。 booleannextByte(): 从数据源读取一个byte类型值。 nextDouble(): 从数据源读取一个double类型值。 nextFloat(): 从数据源读取一个float类型值。 nextInt(): 从数据源读取一个int类型。 nextLong(): 从数据源读取一个long类型值。 nextShort(): 从数据源读取一个short类型值。 在使用各种next方法读取数据时,可能会发生下列三种异常: InputMismatchException: 如果下一个标记不能转换为指定类型的数据,或者超出了数据范围。 NoSuchElementException: 数据源中已无数据可读。 IllegalStateException: Scanner对象已被关闭。 这3种异常属于不检查异常,可以不捕捉处理。 格式化输出 PrintStream和PrintWriter类提供了格式化输出方法,可用print、printf、println和format方法输出各种基本数据类型的数据,也可输出对象。 printf和format方法用法相同,均可使用格式字符串来控制数据的输出格式。 提示: 提示: 关于格式字符串、print、printf和println方法的使用请参考中的相关内容。 println方法会在输出数据后添加一个换行符号。 print、printf和format方法不自动添加换行符号,可在输出数据中包含换行符号来实现换行。 PrintStream对象将数据转换为字节流输出,PrintWriter对象将数据转换为字符流输出。 字符和字符串按照默认的本地字符集转换为字节。 可以在创建PrintStream或
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第9章 输入输出流 输入输出