=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或