2020/6/261第九章输入、输出流本章导读文件文件字节流和文件字符流缓冲流数组流和字符串流数据流对象流序列化和对象克隆随机读写流使用Scanner类解析文件文件锁2020/6/262输入流、输出流概述I/O流提供一条通道程序,可以使用这条通道读取“源”中的数据,或把数据送到“目的地”。I/O流中的输入流的指向称为源,程序从指向源的输入流中读取源中的数据(如图9.1所示意);输出流的指向称为目的地,程序通过向输出流中写入数据把信息传递到目的地(如图9.2所示意)。程序的源和目的地也可以是键盘、鼠标、内存或显示器窗口。2020/6/263I/O流库提供的4个重要的abstract类Java的I/O流库提供大量的流类(在包java.io中),其中有4个重要的abstract类:InputStream字节输入流Reader字符输入流OutputStream字节输出流Writer字符输出流InputStream和Reader类为其子类提供了重要的读取数据的read()方法.OutputStream和Writer类为其子类提供了重要的写入数据的write()方法。2020/6/2649.1文件多流的读写与文件有关。Java使用File类创建的对象来获取文件本身的一些信息,如文件所在的目录、文件的长度、文件读写权限等,文件对象并不涉及对文件的读写操作。创建一个File对象的构造方法有3个:File(Stringfilename);File(StringdirectoryPath,Stringfilename);File(Filef,Stringfilename);其中filename是文件名字,directoryPath是文件的路径,f是一个目录。使用File(Stringfilename)创建文件时,该文件被认为是与当前应用程序在同一目录中。2020/6/2651.文件的属性使用File类的下列方法可以获取文件本身的一些信息:◆publicStringgetName()获取文件的名字。◆publicbooleancanRead()判断文件是否是可读的。◆publicbooleancanWrite()判断文件是否可被写入。◆publicbooleanexits()判断文件是否存在。◆publiclonglength()获取文件的长度(单位是字节)。◆publicStringgetAbsolutePath()获取文件的绝对路径。◆publicStringgetParent()获取文件的父目录。◆publicbooleanisFile()判断文件是否是一个正常文件,而不是目录。◆publicbooleanisDirectroy()判断文件是否是一个目录。◆publicbooleanisHidden()判断文件是否是隐藏文件。◆publiclonglastModified()获取文件最后修改的时间(时间是从1970年午夜至文件最后修改时刻的毫秒数。2020/6/2662.目录1)创建目录publicbooleanmkdir()创建一个目录,创建成功返回true,否则返回false。2)列出目录中的文件(如果File对象是一个目录)publicString[]list()用字符串形式返回目录下的全部文件。publicFile[]listFiles()用File对象形式返回目录下的全部文件。File类的下述两个方法可以列出指定类型的文件:publicString[]list(FilenameFilterobj)该方法用字符串形式返回目录下的指定类型的所有文件。publicFile[]listFiles(FilenameFilterobj)该方法用File对象返回目录下的指定类型所有文件。FilenameFilter是一个接口,该接口有一个方法:publicbooleanaccept(Filedir,Stringname);使用list()方法时,需向该方法传递一个实现FilenameFilter接口的对象。list()方法执行时,参数不断回调接口方法accept(Filedir,Stringname),参数name被实例化目录中的一个文件名,参数dir为调用list的当前对象,当接口方法返回true时,list()方法就将目录dir中的文件存放到返回的数组中。2020/6/2673.文件的创建与删除◆对于Filef=newFile(C:\myletter,letter.txt);如果C:\myletter目录中没有名字为letter.txt的文件,文件对象f调用方法publicbooleancreateNewFile()可以在C:\myletter目录中建立一个名字为letter.txt的文件。◆文件对象调用方法publicbooleandelete()可以删除当前文件,如f.delete();例9-1列出了D:\ch9目录下java源文件的名字及其大小,并删除了D:\ch9中的一个java源文件。2020/6/2684.运行可执行文件使用java.lang包中的Runtime类,执行一个本地机上的可执行文件。首先使用Runtime类声明一个对象,如Runtimeec;然后使用该类的静态getRuntime()方法创建这个对象:ec=Runtime.getRuntime();ec可以调用exec(Stringcommand)方法打开本地的可执行文件或执行一个操作。例9-2中,Runtime对象打开Windows平台上的绘图程序和记事本程序。2020/6/2699.2文件字节流1.FileInputStream类FileInputStream类是InputStream的子类,称为文件字节输入流,按字节读取文件中的数据。该类的所有方法都是从InputStream类继承来的。构造方法:FileInputStream(Stringname)FileInputStream(Filefile)构造方法参数指定的文件称为输入流的源,输入流通过使用read()方法从输入流读出源中的数据。建立一个文件输入流对象,代码如下:try{FileInputStreamins=newFileInputStream(myfile.dat);}catch(IOExceptione){System.out.println(e);}read()方法的形式:intread();从输入流中顺序读取单个字节的数据intread(byteb[])和intread(byteb[],intoff,intlen)把多个字节读到一个字节数组中,返回实际读取的字节个数。参数off指定read()方法把数据存放在字节数组b中的位置,参数len指定该方法将读取的最大字节数。FileInputStream流顺序地读取文件,只要不关闭流,每次调用read()方法就顺序地读取文件中其余的内容,直到文件的末尾或流被关闭。2020/6/26102.FileOutputStream类FileOutputStream提供了基本的文件写入能力,是OutputStream的子类,称为文件字节输出流。文件字节输出流按字节将数据写入到文件中.构造方法:FileOutputStream(Stringname)FileOutputStream(Filefile)FileOutputStream(Stringname,booleanappend)FileOutputStream(Filefile,booleanappend)构造方法参数指定的文件称为输出流的目的地。输出流使用write()方法把数据写入输出流到达目的地。publicvoidwrite(byteb[])写b.length个字节到输出流。publicvoid.write(byteb[],intoff,intlen)从给定字节数组中起始于偏移量off处写len个字节到输出流,参数b是存放了数据的字节数组。只要不关闭流,每次调用writer()方法就顺序地向文件写入内容,直到流被关闭例9-3中,首先将“欢迎welcom”写入到文件“hello.txt”中,然后再读取该文件中的内容。2020/6/26119.3文件字符流1.FileReader类FileReader类是Reader的子类,称为文件字符输入流。文件字符输入流按字符读取文件中的数据。构造方法:FileReader(Stringname)FileReader(Filefile)构造方法参数指定的文件称为输入流的源,输入流通过使用read()方法从输入流读出源中的数据。◆intread()输入流调用该方法从源中读取一个字符。该方法返回一个整数(0~65535之间的一个整数,Unicode字符值),如果未读出字符就返回1。◆intread(charb[])输入流调用该方法从源中读取b.length个字符到字符数组b中,返回实际读取的字符数目。如果到达文件的末尾,则返回-1。◆intread(charb[],intoff,intlen)输入流调用该方法从源中读取len个字符并存放到字符数组b中,返回实际读取的字符数目。如果到达文件的末尾,则返回-1。其中,参数off指定该方法从字符数组b中的什么地方存放数据。2020/6/26122.FileWriter类FileWriter提供了基本的文件写入能力。FileWriter类是Writer的子类,称为文件字符输出流。文件字符输出流按字符将数据写入到文件中.构造方法:FileWriter(Stringname);FileWriter(Filefile);FileWriter(Stringname,booleanappend);FileWriter(Filefile,booleanappend);构造方法参数指定的文件称为输出流的目的地。输出流使用write()方法把数据写入输出流到达目的地。publicvoidwrite(charb[])写b.length个字符到输出流publicvoid.write(charb[],intoff,intlen)从给定字符数组中起始于偏移量off处写len个字符到输出流,参数b是存放了数据的字符数组voidwrite(Stringstr)把字符串中的全部字符写入到输出流voidwrite(Stringstr,intoff,intlen)从字符串str中起始于偏移量off处写len个字符到输出流只要不关闭流,每次调用writer()方法就顺序地向文件写入内容,直到流被关闭例9-4首先用字符输出流向一个已经存在的文件尾加若干个字符,然后再用字符输入流读出文件中的内容。2020/6/26139.4缓冲流(教材印刷错误9.5)1.BufferedReader类BufferedReader类创建的对象称为缓冲输入流,该输入流的指向必须是一个Reader流,称为BufferedReader流的底层流,底层流负责将数据读入缓冲区。BufferedReader流的源就是这个缓冲区,缓冲输入流再从缓冲区中读取数据。可以将BufferedReader与FileReader连接,然后BufferedReader就可以按行读FileReader指向的文件。BufferedReader的构造方法如下:BufferedReader(Readerin)BufferedReader流能够读取文本行,方法是readLine()可以向BufferedReader传递一个Reader对象(如FileReader的实例)来创建一个BufferedReader对象:FileReaderinOne=newFileReader(Student.txt)BufferedReaderinTwo=newBufferedReader(inOne);然后inTwo调用readLine()顺序读取文件“Student.txt”的一行。2020/6/26142.BufferedWriter类可以将BufferedWriter流和FileWriter流连接在一