文件输入输出(自学)_第1页
文件输入输出(自学)_第2页
文件输入输出(自学)_第3页
文件输入输出(自学)_第4页
文件输入输出(自学)_第5页
已阅读5页,还剩62页未读 继续免费阅读

下载本文档

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

文档简介

Java面向对象程序设计1JavaI/O操作概念JavaI/O类JavaI/O操作标准输入/输出文件读写操作文件、目录管理随机访问文件2概念I/O来源控制台(console,如DOS窗口)打印/读入文件(file)读/写网络接口(TCP/UDP端口)读/写针对数据的读写以流(stream)的方式对数据进行操作数据源程序读出数据流目的程序写入数据流流的重要特性顺序读/写sequentially3概念读/写流的一般流程读(Reading)openastream//打开读出流whilemoreinformation//判断

readinformation//读closethestream//关闭流写(Writing)openastream//打开写入流whilemoreinformation//判断

writeinformation//写closethestream//关闭流4概念输入/输出流可以从以下几个方面进行分类从流的方向划分输入流输出流从流的分工划分节点流处理流从流的内容划分面向字符的流面向字节的流5概念两种流的定义(读取信息的基本数据单位)字节流(bytestream):一个字节(8-bit)一个字节读/写,用于一般目的字符流(characterstream):一个字符一个字符读/写(具有特定字符编码的数据),专门用于字符数据java语言6A617661D3EFD1D4以字节流的方式读:读8次,8个字节以字符流的方式读:读6次,6个字符6JavaI/O操作概念JavaI/O类JavaI/O操作标准输入/输出文件读写操作目录管理随机访问文件文件属性7JavaI/O类字符流的读/写操作(来自JDK1.1)java.io.Reader(抽象类)publicintread()publicint

read(char

cbuf[])publc

abstract

int

read(char

cbuf[],intoffset,intlength)到达流的终点,无数据读出则返回-1java.io.Writer(抽象类)publicvoidwrite(intc)publicvoidwrite(char

cbuf[])publicabstractvoidwrite(char

cbuf[],intoffset,intlength)所有的读/写函数都抛出java.io.IOException8JavaI/O类针对字符数据的特点进行过优化,提供一些面向字符的有用特性源或目标通常是文本文件实现内部格式和文本文件中的外部格式之间转换它们的子类又可分为两大类节点流:从数据源读入数据或往目的地写出数据处理流:对数据执行某种处理多数程序使用这两个抽象类的一系列子类来读入/写出文本信息例如FileReader/FileWriter用来读/写文本文件9I/O字符流的层次关系阴影部分为节点流,其余为处理流10JavaI/O类字节流的读/写操作(来自JDK1.0)java.io.InputStream(抽象类)publicabstract

intread()publicint

read(byteb[])publicint

read(byteb[],intoffset,intlength)到达流的终点,无数据读出则返回-1java.io.OutputStream(抽象类)publicabstractvoidwrite(intb)publicvoidwrite(byteb[])publicvoidwrite(byteb[],intoffset,intlength)所有的读/写函数都抛出java.io.IOException11JavaI/O类字节流使用范围:数据源或目标中含有非字符数据,必须用字节流来输入/输出通常被用来读写诸如图片、声音之类的二进制数据绝大多数数据是被存储为二进制文件的,世界上的文本文件大约只能占到2%,通常二进制文件要比含有相同数据量的文本文件小得多12JavaI/O类字节流的层次关系13JavaI/O类14JavaI/O类I/O流的分类(12个功能类)I/O类型所用到的类描述文件FileReader/FileWriterFileInputStream/FileOutputStream文件流(读/写文件)缓冲BufferedReader/BufferedWriterBufferedInputStream/BufferedOutputStream提高读/写效率打印PrintWriter

PrintStream

(System.out.println())内存CharArrayReader/CharArrayWriterByteArrayInputStreamByteArrayOutputStreamStringReader/StringWriterStringBufferInputStream读/写内存15JavaI/O类I/O流的分类(12个功能类)I/O类型所用到的类描述字节流和字符流的转换InputStreamReaderOutputStreamWriter将InputStream中读入的字节转为字符/将字符转为字节写入OutputStream管道pipePipedReader/PipedWriterPipedInputStream/PipedOutputStream文件流(读/写文件)连接ConcatenationSequenceInputStream多个输入流连接为一个输入流对象串行化ObjectInputStreamObjectOutputStreamObjectSerialization16JavaI/O类I/O流的分类(12个功能类)I/O类型所用到的类描述基本数据转化DataInputStreamDataOutputStreamJAVA基本数据类型的读/写计数LineNumberReaderLineNumberInputStream读操作时记录行数PeekingAheadPushbackReaderPushbackInputStream可回退缓存(pushbackbuffer)过滤FilterReader/FilterWriterFilterInputStream/FilterOutputStream在读/写操作时对数据进行过滤17JavaI/O操作概念JavaI/O类JavaI/O操作标准输入/输出文件读写操作目录管理随机访问文件文件属性18输出:控制台屏幕打印publicclassTest{ publicstaticvoidmain(Stringargs[]){

System.out.println("HelloWorld!"); }}标准输入/输出staticPrintStreamout;19输入:键盘读入importjava.io.IOException;classTest{ publicstaticvoidmain(Stringargs[])throws

IOException{ byte[]b=newbyte[10];

System.out.println("接收到的字符个数="+

System.in.read(b));

System.out.println("接收到的字符是"+newString(b)); }}标准输入/输出staticInputStreamin;20标准输入/输出标准输入输出流对象System类的静态成员变量包括System.in:InputStream类型的,代表标准输入流,这个流是已经打开了的,默认状态对应于键盘输入。System.out:PrintStream类型的,代表标准输出流,默认状态对应于屏幕输出。System.err:PrintStream类型的,代表标准错误信息输出流,默认状态对应于屏幕输出。21文件读/写流程打开文件流条件判断读出/写入关闭文件流两种类型文件FileReader/FileWriter(字符流)FileInputStream/FileOutputStream(字节流)文件读写操作22文件读写操作写文本文件FileWriter类创建一个磁盘文件关闭一个磁盘文件write()方法捕获I/O异常BufferedWriter

类23文件读写操作字符流构造方法publicFileReader(Filefile)throwsFileNotFoundExceptionpublicFileReader(String

fileName)throwsFileNotFoundExceptionpublicFile(Stringpathname)publicFileWriter(Filefile)throwsIOExceptionpublicFileWriter(Filefile,booleanappend)throwsIOExceptionpublicFileWriter(String

fileName)throwsIOExceptionpublicFileWriter(String

fileName,booleanappend)throwsIOException24文件读写操作在C盘根目录创建文本文件Hello.txt,并往里写入若干行文本importjava.io.*;classTest{publicstaticvoidmain(String[]args)throwsIOException{//main方法中声明抛出IO异常

StringfileName="C:\\Hello.txt";

FileWriter

writer=newFileWriter(fileName

);

writer.write("Hello!\n");

writer.write("Thisismyfirsttextfile,\n");

writer.write("Youcanseehowthisisdone.\n");

writer.write("输入一行中文也可以\n");

writer.close();

}}25文件读写操作打开C盘根目录下的Hello.txt文件换行有些问题,下面例子中将解决这个问题26文件读写操作每次运行这个程序,都将删除已经存在的”Hello.txt”文件,创建一个新的同名文件FileWriter的构造方法有五个,本例是通过一个字符串指定文件名来创建FileWriter类的write方法向文件中写入字符Writer类的流可实现内部格式到外部磁盘文件格式的转换“Hello.txt”是一个普通的ASCII码文本文件,每个英文字符占一个字节,中文字符占两个字节Java程序中的字符串则是每个字符占两个字节的,采用Unicode编码

close方法清空流里的内容并关闭它。如果不调用该方法,可能系统还没有完成所有数据的写操作,程序就结束了27文件读写操作处理IO异常importjava.io.*;classEx6_3{publicstaticvoidmain(String[]args){StringfileName="c:\\Hello.txt";

try{//将所有IO操作放入try块中

FileWriterwriter=newFileWriter(fileName,true);

writer.write("Hello!\n");

writer.write("Thisismyfirsttextfile,\n");

writer.write("Youcanseehowthisisdone.\n");

writer.write("输入一行中文也可以\n");

writer.close();

}catch(IOException

iox){

System.out.println("Problemwriting"+fileName);}

}}运行此程序,会发现在原文件内容后面又追加了重复的内容,这就是将构造方法的第二个参数设为true的效果28文件读写操作BufferedWriter类(处理流)如果需要写入的内容很多,就应该使用更为高效的缓冲器流类BufferedWriterFileWriter和BufferedWriter类都用于输出字符流,包含的方法几乎完全一样,但BufferedWriter多提供了一个newLine()方法用于换行不同厂家生产的计算机(IBM,Apple,VAX,Sun)对文字的换行方法不同。newLine()方法可以输出在当前计算机上正确的换行符构造方法:publicBufferedWriter(Writerout)8192bytepublicBufferedWriter(Writerout,intsize)29文件读写操作使用BufferedWriter完成前面例子实现的功能importjava.io.*;classEx6_4{ publicstaticvoidmain(String[]args)throwsIOException { StringfileName="C:/newHello.txt";

BufferedWriter

out=newBufferedWriter(newFileWriter(fileName));

out.write("Hello!");

out.newLine();

out.write("ThisisanothertextfileusingBufferedWriter,");

out.newLine();;

out.write("SoIcanuseacommonwaytostartanewline");

out.close();}}30文件读写操作用任何文本编辑器打开newHello.txt都会出现正确的换行效果31文件读写操作读文本文件FileReader类从文本文件中读取字符继承自Reader抽象类的子类InputStreamReaderBufferedReader读文本文件的缓冲器类具有readLine()方法,可以对换行符进行鉴别,一行一行地读取输入流中的内容继承自Reader文件输入方法:BufferedReaderin=newBufferedReader(new

FileReader(fileName));

32文件读写操作从Hello.txt中读取文本并显示在屏幕上importjava.io.*;classTest{publicstaticvoidmain(String[]args){StringfileName="C:/Hello.txt",line;try{

BufferedReaderin=newBufferedReader(newFileReader(fileName));line=in.readLine();//读取一行内容

while(line!=null){

System.out.println(line); line=in.readLine(); }

in.close();}catch(IOException

iox){

System.out.println("Problemreading"+fileName);}}}33文件读写操作运行该程序,屏幕上将逐行显示出Hello.txt文件中的内容FileReader对象:创建后将打开文件,如果文件不存在,会抛出一个IOExceptionBufferedReader类的readLine()方法:从一个面向字符的输入流中读取一行文本。如果其中不再有数据,返回nullReader类的read()方法:也可用来判别文件结束。该方法返回的一个表示某个字符的int型整数,如果读到文件末尾,返回-1。据此,可修改本例中的读文件部分:intc;while((c=in.read())!=-1)System.out.print((char)c);close()方法:为了操作系统可以更为有效地利用有限的资源,应该在读取完毕后,调用该方法34文件读写操作例:指定源文件和目标文件名,将源文件的内容拷贝至目标文件。调用方式为:javacopysourceFile

destinationFile35文件读写操作importjava.io.*;classCopyMaker{StringsourceName,destName;

BufferedReadersource;

BufferedWriter

dest;Stringline;

privateboolean

openFiles(){ try{

source=newBufferedReader(new

FileReader(sourceName)); } catch(IOException

iox){

System.out.println("Problemopening"+sourceName);returnfalse;}try{

dest=newBufferedWriter(new

FileWriter(destName));

}catch(IOException

iox){

System.out.println("Problemopening"+destName);returnfalse;}returntrue;}36文件读写操作privateboolean

copyFiles(){ try{ line=source.readLine();

while(line!=null){

dest.write(line);

dest.newLine();

line=source.readLine();

}}catch(IOException

iox){

System.out.println("Problemreadingorwriting");returnfalse;}returntrue;}37文件读写操作privateboolean

closeFiles(){

boolean

retVal=true;try{source.close();}catch(IOException

iox){

System.out.println("Problemclosing"+sourceName);

retVal=false;}try{dest.close();}catch(IOException

iox){

System.out.println("Problemclosing"+destName);

retVal=false;}returnretVal;}38文件读写操作

publicboolean

copy(String

src,Stringdst){

sourceName=src;

destName=dst;returnopenFiles()&©Files()&&closeFiles();}}publicclassCopy//一个文件中只能有一个公有类{ publicstaticvoidmain(String[]args){ if(args.length==2)newCopyMaker().copy(args[0],args[1]);else

System.out.println("PleaseEnterFilenames");}}39文件读写操作写二进制文件二进制文件原则上讲,所有文件都是由8位的字节组成的如果文件字节中的内容应被解释为字符,则文件被称为文本文件;如果被解释为其它含义,则文件被称为二进制文件例如文字处理程序,例如字处理软件Word产生的doc文件中,数据要被解释为字体、格式、图形和其他非字符信息。因此,这样的文件是二进制文件,不能用Reader流正确读取为什么需要二进制文件输入输出更快比文本文件小很多有些数据不容易被表示为字符40文件读写操作抽象类OutputStream派生类FileOutputStream用于一般目的输出(非字符输出)用于成组字节输出派生类DataOutputStream具有写各种基本数据类型的方法将数据写到另一个输出流它在所有的计算机平台上使用同样的数据格式其常用的一些方法见下表其中size方法,可作为计数器,统计写入的字节数41文件读写操作42文件读写操作43文件读写操作将三个int型数字255/0/-1写入数据文件data1.datimportjava.io.*;classTest{publicstaticvoidmain(String[]args){StringfileName="c:/data1.dat";

intvalue0=255,value1=0,value2=-1;try{

DataOutputStreamout=newDataOutputStream(newFileOutputStream(fileName));

out.writeInt(value0);

out.writeInt(value1);

out.writeInt(value2);

out.close();}catch(IOException

iox){

System.out.println("Problemwriting"+fileName);}}44文件读写操作运行结果运行程序后,在C盘生成数据文件data1.dat用写字板打开没有任何显示用ultraEdit打开查看其二进制信息,内容为0000

00FF0000

00

00FFFF

FF

FF,每个int数字都是32个bit的说明FileOutputStream类的构造方法负责打开文件“data1.dat”用于写数据FileOutputStream类的对象与DataOutputStream对象连接,写基本类型的数据45文件读写操作BufferedOutputStream写二进制文件的缓冲流类类似于文本文件中的BufferedWriter对于大量数据的写入,可提高效率用法示例:DataOutputStreamout=new

DataOutputStream(newBufferedOutputStream(newFileOutputStream(fileName)));46文件读写操作向文件中写入各种数据类型的数,并统计写入的字节数importjava.io.*;classEx6_8{publicstaticvoidmain(String[]args)throwsIOException{ StringfileName="mixedTypes.dat";

DataOutputStream

dataOut=newDataOutputStream(newBufferedOutputStream(newFileOutputStream(fileName)));

dataOut.writeInt(0);

System.out.println(dataOut.size()+"byteshavebeenwritten.");

dataOut.writeDouble(31.2);

System.out.println(dataOut.size()+"byteshavebeenwritten.");

dataOut.writeBytes("JAVA");

System.out.println(dataOut.size()+"byteshavebeenwritten.");

dataOut.close();}}47文件读写操作运行结果4byteshavebeenwritten12byteshavebeenwritten16byteshavebeenwritten说明这个程序可作为字节计数器48文件读写操作向文件中写入内容为-1的一个字节,并读出。importjava.io.*;publicclassTest{publicstaticvoidmain(String[]args)throwsException{

DataOutputStream

out=newDataOutputStream(newFileOutputStream("c:/trytry.dat"));

out.writeByte(-1);

out.close();

DataInputStream

in=newDataInputStream(newFileInputStream("c:/trytry.dat"));

inta=in.readByte();

System.out.println(Integer.toHexString(a));

System.out.println(a);

in.skip(-1);//往后一个位置,以便下面重新读出

a=in.readUnsignedByte();

System.out.println(Integer.toHexString(a));

System.out.println(a);

in.close(); }}49文件读写操作运行结果ffffffff-1ff255说明用ultraEdit打开c:/trytry.dat文件,其内容为FF如果用readByte读入,其高24位都将补1,所以结果还是-1如果用readUnsignedByte读入,其高24位都将补0,结果就变成了255写的字节是连续的,中间没有分隔符,所以应该记住写的数据类型、个数等情况,以便将来利用50文件读写操作读二进制文件读取例6-7创建的数据文件中的3个int型数字,显示相加结果importjava.io.*;classEx6_10{ publicstaticvoidmain(String[]args){ StringfileName="c:\\data1.dat";

intsum=0;try{

DataInputStream

instr=newDataInputStream(newBufferedInputStream(new

FileInputStream(fileName)));sum+=instr.readInt();sum+=instr.readInt();sum+=instr.readInt();

System.out.println("Thesumis:"+sum);

instr.close();} catch(IOException

iox){

System.out.println("Problemreading"+fileName);} }}}51文件读写操作该程序显示结果是254分析readInt方法可以从输入流中读入4个字节并将其当作int型数据由于知道文件中存储的是3个int型数据,所以使用了3个读入语句如果不知道数据的个数该怎么办呢?因为DataInputStream的读入操作如遇到文件结尾就会抛出EOFException异常,所以我们可以将读操作放入try块中52文件读写操作将读操作放入try块中,使遇到文件结尾就会抛出EOFException异常,进入到相应的catch块中try{while(true)sum+=instr.readInt();}catch(EOFException

eof){

System.out.println("Thesumis:"+sum);

instr.close();}53文件读写操作如果没有读到结尾,在读取过程中发生的异常属于IOException,这样就需要我们再加一个catch块处理这种异常一个try块后面可以跟不止一个catch块,用于处理各种可能发生的异常我们可以在上段代码后再加上用于捕捉IOException的代码段如下catch(

IOException

eof){

System.out.println("Problemreadinginput");

instr.close();}54文件读写操作如果catch块中的close方法也发生异常,现在就没法捕获了。解决方法可以有在main方法中抛出异常比较简单缺点是没有catch块,因而无法对异常进行进一步处理,例如给出提示信息使用嵌套的try块55文件读写操作importjava.io.*;classEx6_11{publicstaticvoidmain(String[]args){ StringfileName="c:/data1.dat";longsum=0; try{

DataInputStream

instr=newDataInputStream(newBufferedInputStream(new

ileInputStream(fileName)));

try{while(true)sum+=instr.readInt();}catch(EOFException

eof){

System.out.println("Thesumis:"+sum);

instr.close();}}catch(IOException

iox){

System.out.println("IOProblemswith"+fileName);}}}}56文件的特性读和写的权限文件长度修改时间是否是目录java.io.File类设定文件属性查询文件属性文件、目录管理57文件、目录管理构造方法:58文件、目录管理常用方法:59文件、目录管理获取文件路径importjava.io.*;classAttrDemo1{publicstaticvoidmain(String[]args)throwsIOException{Filetestfile=newFile("."+File.separatorChar+"testfile1");

testfile.createNewFile();

System.out.println("name="+testfile.getName());

System.out.println("path="+testfile.getPath());

System.out.println("absolutepath="+testfile.getAbsolutePath());

System.out.println("canonicalpath="+testfile.getCanonicalPath());}}60文件、目录管理获取文件修改时间importjava.io.*;importjava.util.*;publicclassAttrDemo2{ publicstaticvoidmain(String[]args)throwsIOException{ Filetestfile=newFile("testfile2");

testfile.delete();

testfile.createNewFile();longmodtime=testfile.lastModified();

System.out.println("lastmodificationtime#1="+newDate(modtime));testfile.setLastModified(0);

modtime=testfile.lastModified();

System.out.println("lastmodificationtime#2="+newDate(modtime)); }}61文件、目录管理获取和设定文件长度importjava.io.*;publicclassAttrDemo3{publicstaticvoidmain(String[]args)throwsIOException{Filetestfile=newFile("testfile3");

testfile.delete();

testfile.createNewFile();

System.out.println("length#1="+testfile.length());

RandomAccessFile

raf=newRandomAccessFile("testfile3","rw");raf.setLength(100);

raf.close();

System.out.println("length#2="+testfile.length());}}62文件、目录管理设置读写权限importjava.io.*;publicclassAttrDe

温馨提示

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

评论

0/150

提交评论