JAVA第八章流与文件课件.ppt
计算机科学与技术学院,第八章 流与文件,Stream and File,计算机科学与技术学院,1.了解流、输入输出的概念2.掌握常见的输入输出流类的使用3.熟悉System类,掌握标准输入输出和重新定向输入输出技术4.掌握用I/O流实现文件读/写,压缩文件读/写的方法,本节学习要点,计算机科学与技术学院,目的地:标准输出设备.如屏幕 磁盘文件 网络连接等,8.1什么是流,8.1.1 基本概念,输入:指的是如何从数据源中获得字节序列,数据源:标准输入设备.如:键盘 磁盘文件 网络连接等,输出:指的是如何将字节序列发送到能接收 数据的目的地,计算机科学与技术学院,在Java中,输入流指的是能够读取一个字节序列的对象;,Java的流类可分为两大部分:File类:用于文件管理I/O流类:用于文件读写,8.1什么是流,而输出流指的是能够写一个 字节序列的对象,计算机科学与技术学院,File类:封装了对文件系统进行操作的功能 最后修改日期 文件,目录操作等,8.1什么是流,I/O流类:,InputStream和OutputStream是用来存取字节的所有类的根类,Reader和Writer是专门用来读写双字节Unicode的类的根类,计算机科学与技术学院,InputStream和OutputStream只提供了读写字节的方法,要想使用各种形式的输入输出方式,必须扩展其子类,Java从四个抽象类上派生了很多具体类,利用这些类,任何你能想象得到的输入输出形式都可以轻松完成,8.1什么是流,计算机科学与技术学院,API:java.io.InputStreamabstract int read()int read(byte b)int read(byte b,int off,int len)long skip(long n)int available() 返回不会阻塞的实际可用字节数void close(),8.1什么是流,计算机科学与技术学院,void mark(int readlimit) 在当前位置作一个标记void reset() 返回最近的标记处boolean markSupported()如果该流支持 标记则返回true,8.1什么是流,计算机科学与技术学院,API:java.io.OutputStream()abstract int write()int write(byte b)int write(byte b,int off,int len)void close()void flush(),8.1什么是流,计算机科学与技术学院,8.1什么是流,8.1.2 System.in和System.out对象,System.in和System.out是InputStream和OutputStream的一个子类的预定义对象,与之相关的方法:read()-System.in.read( )print(参数)、println(参数)System.out.println(“请输入一个数据:”);,System.in可以用于从键盘读入System.out可以将数据输出到显示屏,计算机科学与技术学院,InputStream,用于读取字节数据,FileInputStream,用于从文件上读取字节,FilterInputStream,用于构成过滤器流,PipedInputStream,用于线程之间通信,BufferedInputStream,支持缓冲区输入,PushbackInputStream,跟踪中间流,DataInputStream,提供各种方式的输入形式,8.2 常用的流类,计算机科学与技术学院,8.2.1 文件管理File类,File类的功能十分强大,它可以访问指定文件的所有属性,包括文件名、文件长度、最后修改时间等还可以用来建立目录、删除文件等,构造方法:File(String path)File(String path,String name)File(File dir, String name),计算机科学与技术学院,API:java.io.File,String getAbsolutePath()返回包含绝对 路径名的字符串String getCanonicalPath()返回包含规 范路径名的字符串,String getName()String getParent()boolean isDirectory()boolean isFile(),8.2.1 文件管理File类,计算机科学与技术学院,String list()返回File对象下的文件名和子目录名String list(FilenameFilter filter) 同上,但只有通过过滤器检查的文件和目录才能被返回,boolean mkdir()URL toURL()把File对象转化为一个URL,例:打印指定路径下的子目录结构FindDirectories.java,8.2.1 文件管理File类,计算机科学与技术学院,8.2.1 文件管理File类,计算机科学与技术学院,用于指定路径的代码:if (args.length = 0) args = new String . ; try File pathName = new File(args0); String fileNames = pathName.list();,复合成绝对路径:for (int i = 0; i fileNames.length; i+) File f = new File(pathName.getPath(), fileNamesi);,8.2.1 文件管理File类,计算机科学与技术学院,1.FileInputStream 类,构造方法:FileInputStream(String filename)FileInputStream(File file),例: FileInputStream in1 =new FileInputStream(“c:1000hello.java”);例: File f=new File(“myfile.dat”); FileInputStream in2 =new FileInputStream(f),用于读写磁盘文件,8.2.2 FileInputStream和 FileOutputStream类,计算机科学与技术学院,2.FileOutputStream类,构造方法:FileOutputStream(String filename)FileOutputStream(File file),例:String name=“c:1000line.txt”; FileOutputStream out=new FileOutputStream(name);,只能读取字节或字节数组,in1、in2、out,8.2.2 FileInputStream和 FileOutputStream类,计算机科学与技术学院,8.2.3.DataInputStream和DataOputStream类,1. DataInputStream,构造方法:DataInputStream(InputStream in),常用方法:close()readByte()readInt()readUTF()readFloat(),计算机科学与技术学院,2.DataOutputStream类,构造方法:DataOutputStream(OutputStream in),常用方法:close()writeByte()writeInt()writeUTF()writeFloat(),8.2.3.DataInputStream和DataOputStream类,计算机科学与技术学院,3. FileInputStream类能从文件及其它位置上读取字节,而DataIputStream类能够把字节合成为常用的数据类型。,可以把两种类结合起来从而构成过滤器流,例:从一个文件中读取一个数字FileInputStream fin=new FileInputStream(“line.txt”);DataInputstream din=new DataInputStream(fin);int data1=din.readInt();,过滤器,8.2.3.DataInputStream和DataOputStream类,计算机科学与技术学院,8.2.4 BufferedInputStream和BufferedInputStream类,构造方法:BufferedInputStream(InputStream in)BufferedInputStream(InputStream in,int n) 用来创建一输入缓冲流BufferedOutputStream(OutputStream out)BufferedOutputStream(OutputStream out,int n)用来创建一输出缓冲流,用于从一个流中读取字符,但不会每次都导致设备访问,计算机科学与技术学院,例:利用缓冲区从文件中读取数据DataInputStream din= new DataInputStream (new BufferedInputStream (new FileInputStream(“line.txt”);,Void unread(int n)回退一个字节,8.2.4 BufferedInputStream和BufferedInputStream类,计算机科学与技术学院,构造方法:PushbackInputStream (Inputstream in) 构造具有一个字节预先量缓冲流PushbackInputStream (Inputstream in,int size) 构造一个指定大小的预先缓冲的流,8.2.5 PushbackInputStream 类,用于跟踪中间流的类,计算机科学与技术学院,8.2.6 RandomAccessFile类,通过构造RandomAccessFile类,你可以做任何想对文件进行的操作。,构造方法:RandomAccessFile(String filename,String mode)RandomAccessFile(Filefile,String mode),常用方法:read write系列public void seek(long pos)throw IOException public int SkipBytes(int n)throw IOException,计算机科学与技术学院,8.2.7 管道类,PipedInputStream类创建是一个输入管道PipedOutputStream创建是一个输出管道,输出管道与输入管道连接就形成了一个传输数据的通道,使用这样的管道,用户可以在不同的线程间实现数据共享,计算机科学与技术学院,管道模型如图:,线程1,管道输出,连接,管道输入,管道输出,线程2,线程3,管道输入,连接,8.2.7 管道类,计算机科学与技术学院,构造输入输出流:PipedInputStream in = new PipedInputStream();PipedOutputStream out= new PipedOutputStream(),1.将输入与输出连接connect(PipedOutputStream c) 例: in.connect(out),2.将输出与输入连接connect(PipedInputStream c) out.connect(in),8.2.7 管道类,计算机科学与技术学院,8.2.7 管道类,例:一个简单的例子PipeTest.java,ProducerFilter Consumer 0.01,计算机科学与技术学院,8.3 Readers的Writers类,Readers的Writers类的出现并不是要取代InputStream和OutputStream,而是为了更好地国际化目的,为了更好的搭配使用两种类,Java提供了“桥接类”:InputStreamReader和 OutputStreamWriter,用于将InputStream和 OutputStream转化为Reader和Writer,这是两个用于Unicode并基于字符的I/O流,计算机科学与技术学院,两个继承体系之间类的对应关系,InputStreamOutputStreamFileInputStreamFileOutStyreamPipesInputStreamPipesOutputStream,Reader转换器:InputStreamReaderWriter转换器:OutputStreamWriterFileReaderFileWriterPipedReaderPipedWriter,8.3 Readers的Writers类,计算机科学与技术学院,Filters:两个继承体系之间类的对应关系,FilterInputStreamFilterOutputStreamBufferedInputStreamBufferedOutputStreamDataInputStreamPushBackInputStreamPrintStream,FilterReaderFilterWriterBufferedReaderBufferedWriterPushBackReaderPrintWriter,8.3 Readers的Writers类,计算机科学与技术学院,未变化的类,DataOutputStreamFileRandomAccessFileSequenceInputStream,8.3 Readers的Writers类,计算机科学与技术学院,小结,I/O类库是Java基本类库中非常重要的组成,本节主要介绍了:1.流的概念2.常见的I/O流类及主要方法3.标准I/O4.File类及属性和方法5.用I/O流实现文件读写,