《JAVA中的输入输出.ppt》由会员分享,可在线阅读,更多相关《JAVA中的输入输出.ppt(80页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、JavaJava的输入的输入/输出流输出流熟悉使用File类操作文件属性熟悉使用流读/写文件熟悉使用随机访问类读/写文件本章目标Java的输入/输出类库v 流的概念流的概念流:是同一台计算机或网络中不同计算机之间有序运动的数据序列。输入数据流:外设流入计算机的数据序列数据流 输出数据流:计算机流向外设的数据序列数据序列:可以是原始的二进制字节数据,也可以是经过特定编码处理的有格式的数据v输入输入/输出流类输出流类 用于实现I/O操作的流类和接口在java.io包中。ObjectInputStreamOutputStreamReaderWriterFileRandomAccessFileJava
2、的输入/输出类库什么是File类数据流类实现文件的顺序读写。RandomAccessFile 类 实现文件的随机读写。他们都不能对文件的属性进行访问。使用File类,可以访问文件属性信息,但是,它不提供读写文件的方法。下面列出File类的构造方法和实例方法:1.File类有三个构造方法File(String filename)File(String directoryPath,String filename)File(File f,String filename)其中,filename指文件名,directoryPath指文件所在的 目录,f指文件的目录对象。2.实用方法实用方法(1)属性操作
3、 pubic String getName()获取文件名 public String getPath()获取文件路径 public String getAbsolutePath()获取文件绝对路径 public long length()获取文件的长度(单位是字节)public String getParent()获取文件的父目录 public File getParentFile()获取文件的父目录 public long lastModified()获取文件最后修改时间(时间是从 1970年午夜至文件最后修改时刻的毫秒数)public boolean canRead()判断文件是否是可读的
4、 public boolean canWrite()判断文件是否可被写入 public boolean exits()判断文件是否存在 public boolean isFile()判断是不是一个正常文件 public boolean isDirectroy()判断是不是一个目录 public boolean isHidden()判断文件是不是隐藏文件(2)文件操作 public boolean renameTo(File dest)给文件换名 public boolean delete()删除文件(3)目录操作 public boolean mkdir()创建目录 public String
5、 list()以字符串形式列出目录 public File listFiles()以File对象形式列出目录要求:在e:/test/6目录下,创建一个文件”new.txt”,然后测试该文件的属性。练习一 获得文件信息获得文件信息 import java.io.*;import java.io.*;public class first public class first public static void main(String args)public static void main(String args)File f1=new File(“E:/test/6”,“new.txt”);F
6、ile f1=new File(“E:/test/6”,“new.txt”);f1.createNewFile();/f1.createNewFile();/创建文件创建文件new.txtnew.txt System.out.println(“System.out.println(“文件文件new.txtnew.txt存在吗存在吗?:”+?:”+f1.exists();f1.exists();System.out.println(“new.txt System.out.println(“new.txt的父目录是的父目录是:”+:”+f1.getParent();f1.getParent();S
7、ystem.out.println(“System.out.println(“文件文件new.txtnew.txt是可读的吗是可读的吗?”+?”+f1.canRead();f1.canRead();System.out.println(“System.out.println(“文件文件new.txtnew.txt的长度的长度:”+:”+f1.length();f1.length();练习二 创建目录和文件创建目录和文件要求:在e:/test目录下创建一个子目录Students,在Students目录下创建文件new.doc。程序算法:程序算法:1.以e:/test和Students为参数,创建
8、一个File对 象:dir 2.调用mkdir()方法,创建目录Students。3.调用createNewFile()方法,创建文件:new.docimport java.io.File;import java.io.File;import java.io.IOException;import java.io.IOException;public class f1 public class f1 public static void main(String args)public static void main(String args)File f1=new File(d:/1/,2);F
9、ile f1=new File(d:/1/,2);f1.mkdir();f1.mkdir();File f2=new File(f1,new.doc);File f2=new File(f1,new.doc);f2.createNewFile();f2.createNewFile();现场编程要求:列出c盘根目录下的所有子目录和文件。程序算法:程序算法:1以c:/为参数,创建对象:dir 2.获取对象dir所包含的对象数组(文件和目录构成的对象):file 3.输出所包含的子目录 4.输出所包含的文件练习三 删除文件和目录要求:删除e:/test/Students目录下的文件“new.doc”
10、,然后删除目录“Students”。程序结构:1.以文件名E:/test/Students/new.doc为参数创建File对象:f 2.以目录名E:/test/Students为参数创建File对 象:dir 3.删除文件:f.delete()4.删除目录:dir.delete()Import java.io.*;Import java.io.*;public class f2public class f2 public static void main(String args)public static void main(String args)File f=new File(E:/te
11、st/Students/new.doc);File f=new File(E:/test/Students/new.doc);File dir=new File(E:/test/Students);File dir=new File(E:/test/Students);boolean b1=f.delete();/boolean b1=f.delete();/删除文件删除文件new.docnew.doc boolean b2=dir.delete();/boolean b2=dir.delete();/删除目录删除目录StudentsStudents System.out.println(“S
12、ystem.out.println(“文件文件new.docnew.doc成功删除了吗成功删除了吗?”+b1);?”+b1);System.out.println(“System.out.println(“目录目录StudentsStudents成功删除了吗成功删除了吗?”+b2);?”+b2);什么是数据流数据流是对各种流的总称。每个流本身是一个类。我们可以使用数据流读文件或写文件。输入流只能读文件不能写文件,输出流只能写文件不能读文件。1数据流概念 我们把数据的输入流和数据输出流统称为数据流(这里说的输入输出是以程序为参考点而言)。2数据流分类按照数据流动方向分为:输入流和输出流按照数据流
13、动成分分为:字节流、字符流、缓冲流、数据流、对象流等等。数据流模型为了便于理解数据流工作方式,对数据流进行抽象,得到数据流模型如图 所示。键盘键盘文件文件程序程序gggggwessdddshu输入显示器显示器打打 印印机机文件文件输入流输入流输出流输出流在程序中,使用输入流,可从键盘或文件中读取数据;使用输出流,可向显示器、打印机或文件中传输数据。数据流-字节流字节流有两个超类,也是两个抽象类,它们是字节输入流(InputStream)和字节输出流(OutputStream)。InputStream类是所有字节输入流的超类;OutputStream类是所有字节输出流的超类。1.InputStr
14、eam类下面是对InputStream类的描述:(1)InputStream的类层次图InputStream的类层 次图如图所示 InputStreamFileInputStreamPipedInputStreamFilterInputStreamObjectInputStreamSequenceInputStreamByteArrayInputStreamStringBufferInputStreamPushbackInputStreamBufferedInputStreamDataInputStream(2)InputStream类的常用方法int read()输入流调用该方法从数据源中读
15、取单个字节的数据,该方法返回字节值(0255之间的一个整数)。如果未读出字节就返回-1。int read(byte b)输入流调用该方法从数据源中试图读取b.length个字节到b中,返回实际读取的字节数目。如果到达文件的末尾,则返回-1。int read(byte b,int off,int len)输入流调用该方法从数据源中试图读取len个字节到b中,并返回实际读取的字节数目。如果到达文件的末尾,则返回-1。参数off指定从字节数组的某个位置开始存放读取的数据。void close()输入流调用该方法关闭输入流。long skip(long numBytes)输入流调用该方法跳过numBy
16、tes个字节,并返回实际跳过的字节数目。2.OutputStream类 下面是对OutputStream类的描述:(1)OutputStream类层次图OutputStreamFileOutputStreamPipedOutputStreamFilterOutputStreamObjectOutputStreamByteArrayOutputStreamPrintStreamBufferedOutputStreamDataOutputStream(2)OutputStream类的常用方法void write(int n)输出流调用该方法向输出流写入单个字节。void write(byte b)
17、输出流调用该方法向输出流写入一个字节数组void write(byte b,int off,int len)从给定字节数组中,起始于偏移量off处,取len个字节写到输出流void close()关闭输出流 字节流有多个子类,能直接对文件进行读或写的子类有 FileInputStream和FileOutputStream下面是它们的构造方法 1 FileInputStream类的构造方法:public FileInputStream(String name)throws FileNotFoundExceptionpublic FiIeInputStream(File file)throws F
18、ileNotFoundException 其中,name为文件名,file为文件类File对象,即可以以文件名或File对象构造文件输入流对象。通过文件输入流对象读文件。FileOutputStream类的构造方法:public FileOutputStream(String name)throws FileNotFoundExceptionpublic FileOutputStrearm(File file)throws FileNotFoundExceptionpublic FileOutputStrearm(String name,boolean append)throws FileNo
19、tFoundException 其中,name为文件名,file为File对象,append表示文件 的写入方式。append的值为false时,为重写方式,即要写入的内容从文件开头写入,覆盖以前的文件内容;当append的值为true时,为添加方式,即要写入的内容添加到文件的尾部。append的默认值是false。可以以文件名或File对象构造文件输出流对象,通过文件输出流对象写文件。练习四用类用类FileInputStream读文件读文件要求:读文件e:/read.txt的内容,并输出到客户端。程序算法:程序算法:1.以文件名e:/read.txt为参数,构造文件对象:f2.以文件对象f为
20、参数,构造输入流:in3.每次从in中读取n个字节,保存在数组b中4.n等于-1时结束循环,否则,把数组b以字符串的方式输出到客户端,重复步骤3。publicpublic classclass f1 f1 publicpublic staticstatic voidvoid main(String args)main(String args)File f=File f=newnew File(d:/1/new.txt);File(d:/1/new.txt);trytry bytebyte b=b=newnew bytebyte5;/5;/每次读取数据保存在该字节数组中每次读取数据保存在该字节数
21、组中 intint n=0;/n=0;/实际读取的字节数实际读取的字节数 FileInputStream in=FileInputStream in=newnew FileInputStream(f);FileInputStream(f);whilewhile(n=in.read(b)!=-1)(n=in.read(b)!=-1)String temp=String temp=newnew String(b,0,n);String(b,0,n);System.System.outout.print(n);.print(n);System.System.outout.print(temp);.p
22、rint(temp);in.close();in.close();catchcatch(IOException e)(IOException e)e.printStackTrace();e.printStackTrace();练习五用类用类FileOutputStream写文件写文件要求:把e:/read.txt中的内容,添加到服务器的e:/write.txt文件中。程序设计:1.以文件名e:/read.txt为参数,构造文件对象:f2.以文件对象f为参数,构造输入流:in4.以e:/write.txt为参数,创建一个输出流:wf5.每次从in中读取n个字节,保存在数组b中6.n等于-1时结束
23、循环,否则,把数组b以字符串的方式写到输出流wf中去,重复步骤3。packagepackage chap1;chap1;importimport java.io.File;java.io.File;importimport java.io.FileInputStream;java.io.FileInputStream;importimport java.io.FileOutputStream;java.io.FileOutputStream;importimport java.io.IOException;java.io.IOException;publicpublic classclass
24、f2 f2 publicpublic staticstatic voidvoid main(String args)main(String args)File f=File f=newnew File(e:/read.txt);File(e:/read.txt);trytry FileInputStream in=FileInputStream in=newnew FileInputStream(f);FileInputStream(f);bytebyte b=b=newnew bytebyte10;10;intint n=0;n=0;FileOutputStream wf=FileOutpu
25、tStream wf=newnew FileOutputStream(e:/write.txt);FileOutputStream(e:/write.txt);whilewhile(n=in.read(b)!=-1)(n=in.read(b)!=-1)wf.write(b,0,n);wf.write(b,0,n);System.System.outout.println(n);.println(n);wf.close();wf.close();in.close();in.close();catchcatch(IOException e)(IOException e)e.printStackTr
26、ace();e.printStackTrace();练习六用类用类FileOutputStream写文件写文件要求:从控制台输入一个数据,然后把这个数据保存到e盘下的test.dat文件中文件中:程序设计:1.从控制台读取一个输入流2.以“e:/test.dat”为参数,创建一个输出流对象fos4.把接收到的输入流写入到输出流文件中去。5.关闭输出流import java.io.*;public class TestFileOutputStream public static void main(String args)try System.out.print(请输入数据请输入数据:);int
27、 count,n=128;byte buffer=new byten;count=System.in.read(buffer);/读取标准输入流读取标准输入流 FileOutputStream fos=new FileOutputStream(test.dat);/创建文件输出流对象创建文件输出流对象 fos.write(buffer,0,count);/写入输出流写入输出流 fos.close();/关闭输出流关闭输出流 System.out.println(已将上述输入数据输出保存为已将上述输入数据输出保存为test.dat文件。文件。);catch(IOException ioe)Sys
28、tem.out.println(ioe);catch(Exception e)System.out.println(e);字节缓存流由于使用文件字节流读/写文件效率不高,在实际应用中,常常使用字节缓存流来读/写文件。字节缓存流有:字节缓存输字节缓存输入流入流(BufferedInputStream)和字节缓字节缓存输出流存输出流(BufferedOutputStream)。常用构造方法 BufferedInputStream类的构造方法BufferedInputStream(InputStream in)BufferedInputStream(InputStream in,int size)B
29、ufferedOutputStream类的构造方法BufferedOutputStream(OutputStream out)BufferedOutputStream(OutputStream out,int size)其中,in是字节输入流对象,out是字节输出流对象,size是缓冲区大小。实际应用中,为了提高文件读写的效率,FileInputStream流经常和BufferedInputStream流配合使用,FileOutputStream流经常和BufferedOutputStream流配合使用。下面是构造字节缓存流的方法。1.构造字节缓存输入流的步骤假设需要使用字节缓存流读文件A.t
30、xt,则需要对文件A.txt进行两次封装:第一步:构造文件字节输入流FileInputStream in=new FileInputStream(A.txt)第二步:构造缓存输入流BufferedInputStream inbuffer=new BufferedInputStream(in)这时,我们就可以让inbuffer调用read()方法读取文件(A.txt)的内容Inbuffer读取文件的过程中,会进行缓存处理,提高读取的效率构造字节缓存输出流的步骤假设需要使用字节缓存流写文件B.txt,则需要对文件B.txt进行两次封装:第一步:构造文件字节输出流FileOutputStream o
31、ut=new FileOutputStream(B.txt)第二步:构造缓存输出流BufferedOutputStream outbuffer=new BufferedOutputStream(out)这时,outbuffer调用write()方法向文件(B.txt)写入内容时会进行缓存处理提高写入的效率需要注意的是,写入完毕后,须调用flush()方法将缓存中的数据存入文件练习六用类练习六用类BufferedInputStream读文件读文件要求:用字节缓存读文件e:/read.txt的内容,并输出到客户端。程序算法:程序算法:1.以文件名e:/read.txt为参数,构造文件对象:f 2.
32、以文件对象f为参数,构造文件字节输入流:in 3.以文件字节输入流in为参数,构造缓存输入流:bufferin 4.每次从bufferin中读取n个字节,保存在数组c中 5.n等于-1时结束循环,否则,把数组c以字符串的方式输出到客户端,重复步骤4。public class f2 public class f2 public static void main(String args)public static void main(String args)File f=new File(e:/read.txt);File f=new File(e:/read.txt);try try FileI
33、nputStream in=new FileInputStream(f);FileInputStream in=new FileInputStream(f);BufferedInputStream bufferin=new BufferedInputStream bufferin=new BufferedInputStream(in);BufferedInputStream(in);byte c=new byte90;byte c=new byte90;int n=0;int n=0;while(n=bufferin.read(c)!=-1)while(n=bufferin.read(c)!=
34、-1)String temp=new String(c,0,n);String temp=new String(c,0,n);System.out.print(temp);System.out.print(temp);bufferin.close();bufferin.close();in.close();in.close();catch(IOException e)catch(IOException e)e.printStackTrace();e.printStackTrace();BufferedInputStream类只是在FilterInputStream类(或者说InputStrea
35、m类)的基础上添加了一个读取缓冲功能,因此,也有人说它本来应该合并到InputStream中去才对。不过,我们更关心的是,到底缓冲能带来多大的性能提高呢?练习七就是一个测试程序,读者有兴趣的话可以亲自上机验证一下,我们在自己的计算机上对输入流的缓冲与否做了一个测试,测试读取的为一图片文件,大小约为2.52M,结果表明,它们二者之间的速度差别还是非常明显的,对于小输入流的读取况且如此,那么对于大输入流情况,则缓冲带来的效果就可想而知了。import java.io.*;public class TestBufferedInputStream public static void main(Str
36、ing args)throws IOException try /创建文件输入流对象创建文件输入流对象fis,为了取得明显效果为了取得明显效果,Big.dat文件中编辑了文件中编辑了大量数据大量数据 InputStream fis=new BufferedInputStream(new FileInputStream(Big.dat);System.out.println(测试开始测试开始.);while(fis.read()!=-1)/从文件输入流从文件输入流fis中读取字节数据中读取字节数据 /读取整个文件输入流读取整个文件输入流 System.out.println(测试结束测试结束);
37、fis.close();/关闭关闭fis输入流输入流 catch(IOException ioe)System.out.println(I/O异常异常);现场编程用类现场编程用类BufferedOutputStream写文件写文件要求:改编练习六中的例题,用BufferedOutputStream来实现写文件的操作。字符流前面我们学习了使用字节流读/写文件,但是字节流不能直接操作Unicode 字符,所以java提供了字符流由于汉字在文件中占用2个字节,如果使用字节流读写文件会出现乱码现象,采用字符流就可以避免乱码在Unicode字符集中,一个汉字被看作一个字符字符流有两个超类,也是两个抽象类
38、:字符输入流(Reader)和字符输出流(Writer)Reader类是所有字符输入流的父类;Writer类是所有字符输出流的父类。1 Reader类下面是对Reader类的描述(1)Reader的常用方法 int read()输入流调用该方法从源中读取一个字符,该方法返回一个参数(065535之间的一个整数,Unicode字符值)。如果未读出字符就返回-1。int read(char b)输入流调用该方法从源中读取b.length个字符到字符数组b中,返回实际读取的字符数目。如果到达文件的末尾,则返回-1。int read(char b,int off,int len)输入流调用该方法从源中
39、读取len个字符并存放到字符数组b中,返回实际读取的字符数目。如果到达文件的末尾,则返回-1。其中,off参数表明,从数组b的off位移处开始存放数据。void close()输入流调用该方法关闭输入流long skip(long numBytes)输入流调用该方法跳过numBytes个字符,并返回实际跳过的字符数目(2)Reader的类层次Reader类的层次结构图如图6-4所示。ReaderInputStreamReaderFilterReaderBufferedReaderPipedReaderCharArrayReaderStringReaderFileReaderLineNumber
40、ReaderPushbackReaderReader类层次2.Writer类下面是对Writer类的描述。(1)Writer的常用方法void write(int n)向输出流写入一个Unicode字符值(数字)void write(char b)向输出流写入一个字符数组void write(char b,int off,int length)从给定字符数组中其实与偏移量off处取len个字符写到输出流。void write(String str)向输出流写入一个字符串void close()关闭输出流(2)Writer的类层次 Writer类的层次结构图如图所示。WriterOutputSt
41、reamWriterFilterWriterBufferedWriterPipedWriterCharArrayWriterStringWriterPrintWriterFileWriterWriter类层次字符流有多个子类,能直接对文件进行读或写的子类有:文件字符输入流(FileReader)和文件字符输出流(FileWriter)下面是它们的构造方法。FileReader类的构造方法:public FileReader(File file)throws IOExceptionpublic FileReader(String name)throws IOException 其中,name为文
42、件名,file为File对象,即可以用文件名或File对象构造文件输入流对象。通过文件输入流对象读文件。FileWriter类的构造方法:public FileWriter(File file)throws IOExceptionpublic FileWriter(String name)throws IOExceptionpublic FileWriter(File file,boolean append)throws IOException public FileWriter(String name,boolean append)throws IOException 其中,name为文件名
43、,file为File对象,append表示文件的写入方式。append的值为false时,为重写方式,即要写入的内容从文件开头写入,覆盖以前的文件内容;当append的值为true时,为添加方式,即要写入的内容添加到文件的尾部。append的默认值是false。可以以文件名或File对象构造文件输出流对象,通过文件输出流对象写文件。练习八用类用类FileReader读文件读文件要求:在客户端显示文件 e:/read.txt的内容。程序算法:程序算法:1.以文件名“e:/read.txt”为参数,构造文件对 象:f 2.以文件对象f为参数,构造字符输入流:in 3.每次从in中读取n个字符,保存
44、在字符数组b中 4.n等于-1时,结束循环,否则,把数组b以字符串的方式输出到客户端,重复步骤3。修改P38页的练习题,要求使用FileWriter写文件写文件字符缓存流由于使用FileReader类和FileWriter类读写文件效率不高,在实际应用中,常常使用字符缓存流来读写文件。字符缓存流有:字符缓存输入流(BufferedReader)和字符缓存输出流(BufferedWriter)。常用构造方法1BufferedReader类的构造方法BufferedReader(Reader in)BufferedReader(Reader in int size)2.BufferedWriter
45、类的构造方法 BufferedWriter(Writer out)BufferedWriter(Writer out int size)其中,in是字符输入流对象,out是字符输出流对象,size是缓冲区大小。实际应用中,为了提高文件读写的效率,FileReader流经常和BufferedReader流配合使用;FileWriter流经常和BufferedWriter流配合使用。下面是构造字符缓存流的方法:1.构造字符缓存输入流的步骤:假设需要使用字符缓存流读文件A.txt,则需要对文件A.txt进行两次封装:第一步:构造文件字符输入流 FileReader in=new FileReader
46、(A.txt)第二步:构造字符缓存输入流 BufferedReader inbuffer=BufferedReader(in)这样,我们就可以让inbuffer调用readLine()方法读取文件内容,inbuffer读取文件的过程中,会进行缓存处理,提高读取的效率2.构造字符缓存输出流的步骤:假设需要使用字符缓存流写文件B.txt,则需要对文件B.txt进行两次封装:第一步:构造文件字符输出流 FileWriter out=new FileWriter(B.txt)第二步:构造缓存输出流 BufferedWriter outbuffer=BufferedWriter(out)这样,我们就可以
47、让outbuffer调用write()方法向文件写入内容时会进行缓存处理,提高写入的效率。需要注意的是,写入完毕后,须调用flush()方法将缓存中的数据存入文件。练习八用类练习八用类BufferedRdader读文件读文件要求:用字符缓存读文件e:/read.txt的内容,并输出到客户端。程序算法:程序算法:1以文件名e:/read.txt为参数,构造文件对象:f 2.以文件对象f为参数,构造输入流:in 3.以输入流in为参数,构造缓存输入流:bufferin 4.每次从bufferin中读取一行数据,保存在字符串str中 5.str等于null时结束循环,否则,把字符串str输出到 客户
48、端,重复步骤4。特色Java输入输出的一个特色就是可以组成使用(包装)各种输入输出流为功能更强的流,因此,才设计定义了这么多各具功能的输入输出流类。下面请看一个程序例子。FileReader和和BufferedReader的组合使用。的组合使用。import java.io.*;public class TestFileReader public static void main(String args)try FileReader fr=new FileReader(fuwa.dat);BufferedReader bfr=new BufferedReader(fr);String str=
49、bfr.readLine();while(str!=null)System.out.println(str);str=bfr.readLine();catch(IOException ioe)System.out.println(ioe);catch(Exception e)System.out.println(e);练习九用类练习九用类BufferedWriter写文件写文件要求:把e:/read.txt文件内容复制到e:/write.txt文件中。程序算法:程序算法:1.创建输入/输出文件对象fread,fwrite 2对fread进行两次封装,得到缓存输入流:bufferin 3对fwr
50、ite进行两次封装,得到缓存输出流:bufferout 4从bufferin读入一行数据,保存到字符串str中 5str等于null时,循环结束,否则,把str写入输出流(bufferout),str输出到客户端,重复步骤4FileWriter和和BufferedWriter的组合使用。的组合使用。import java.io.*;public class TestFileWriter public static void main(String args)try InputStreamReader isr=new InputStreamReader(System.in);BufferedRe