Java 2实用教程课件(第3版第10章)
Java 2实用教程(第版)教学课件,第10章输入输出流,10.1 File类10.2 FileInputStream类10.3 FileOutputStream类10.4 FileReader类和FileWriter类10.5 使用文件对话框打开和保存文件10.6 RandomAccessFile类,10.7 数据流10.8 数组流10.9 对象流10.10 序列化与对象克隆10.11 文件锁FileLock10.12 Process 类中的流10.13 带进度条的输入流,I/O流,I/O流提供一条通道程序,可以使用这条通道把源中的字节序列送给目的地。把输入流的指向称做源,程序从指向源的输入流中读取源中的数据。而输出流的指向是字节要去的一个目的地(或用户),程序通过向输出流中写入数据把信息传递到目的地。虽然I/O流经常与磁盘文件存取有关,但是程序的源和目的地也可以是键盘、鼠标、内存或显示器窗口。Java的I/O流库提供大量的流类(在包java.io中)。但是,所有输入流类都是抽象类InputStream(字节输入流)或抽象类Reader(字符输入流)的子类,而所有输出流都是抽象类OutputStream(字节输出流)或抽象类Writer(字符输出流)的子类。,10.1 File类,File类的对象主要用来获取文件本身的一些信息,例如文件所在的目录、文件的长度、文件读写权限等,不涉及对文件的读写操作 构造方法有3个: File(String filename); File(String directoryPath,String filename); File(File f, String filename);,1.文件的属性,public String getName() 获取文件的名字public boolean canRead()判断文件是否是可读的public boolean canWrite()判断文件是否可被写入public boolean exits()判断文件是否存在public long length()获取文件的长度public String getAbsoloutePath()获取文件的绝对路径public String getParent()获取文件的父路径public boolean isFile()判断文件是否是一个正常的文件,而不是目录public boolean isDirectory()判断文件是否是一个目录public boolean isHidden()判断文件是否是隐藏文件public long lastModified()获取文件最后修改的时间(时间是从1970年午夜至文件最后修改时刻的毫秒数),例子1import java.io.*;public class Example10_1 public static void main(String args) File f1=new File("F:8000","Example20_1.java"); File f2=new File("F:8000"); System.out.println("文件Example20_1是可读的吗:"+f1.canRead(); System.out.println("文件Example20_1的长度:"+f1.length(); System.out.println("文件Example20_1的绝对路径:"+f1.getAbsolutePath(); System.out.println("F:8000:是目录吗?"+f2.isDirectory(); ,2.目录,(1)创建目录File对象调用方法public boolean mkdir()创建一个目录,如果成功就返回true,否则返回false(如果该目录存在,将返回false)(2)列出目录中的文件如果File对象是一个目录,那么该对象可以调用下述的方法列出该目录下的文件和目录。public String list()用字符串形式返回目录下的全部文件public File listFile()用File对象形式返回目录下的全部文件列出指定类型的文件:public String list(FilenameFilter obj)该方法用字符串的形式返回目录下的指定类型的所有文件。public File listFiles(FilenameFilter obj)该方法用File对象返回目录下的指定类型所有文件。FilenameFilter是一个接口,该接口有一个方法:public boolean accept(File dir,String name),3.文件创建与删除,使用File类创建一个文件对象后,例如:File f=new File(“c:myletter”,“letter.txt”);如果c:myletter目录中没有名字为letter.txt文件,文件对象f调用方法:public boolean createNewFile()可以在c:myletter目录中建立一个名字是letter.txt的文件。文件对象调用方法:public boolean delete()可以删除当前的文件,例如:f.delete();,例子2import java.io.*;class FileAccept implements FilenameFilter String str=null; FileAccept(String s) str="."+s; public boolean accept(File dir,String name) return name.endsWith(str); public class Example10_2 public static void main(String args ) File dir=new File("E:chaper9"); File deletedFile=new File(dir,"E.java"); FileAccept acceptCondition=new FileAccept("java"); File fileName=dir.listFiles(acceptCondition); for(int i=0;i< fileName.length;i+) System.out.println("文件名称:"+fileNamei.getName(); boolean boo=deletedFile.delete(); if(boo) System.out.println("文件:"+deletedFile.getName()+"被删除"); ,4.运行可执行文件,当要执行一个本地机上的可执行文件时,可以使用java.lang包中的Runtime类,首先使用Runtime类声明一个对象。如:Runtime ec;然后使用该类的静态getRuntime()方法创建这个对象:Ec=Runtime.getRuntime();Ec可以调用exec(String command)方法打开本地机的可执行文件或执行一个操作。,例子3import java.awt.*;import java.io.*;import java.awt.event.*;public class Example10_3 public static void main(String args) try Runtime ce=Runtime.getRuntime(); ce.exec("javac Example9_18.java"); ce.exec("java Example9_18"); File file=new File("c:/windows","Notepad.exe"); ce.exec(file.getAbsolutePath(); catch(Exception e) System.out.println(e); ,10.2 FileInputStream类,1.使用文件输入流读取文件文件输入流提供对文件的读取,使用文件输入流构造方法来打开一个到达该文件的输入流。(源就是这个文件,输入流指向这个文件)例如:为了读取一个名是myfile.dat的文件,建立一个文件输入流对象,代码是:FileInputStream istream=new FileInputStream(“myfile.dat”);或File f=new File(“myfile.dat”);FileInputStream istream=new FileInputStream(“myfile.dat”);,10.2 FileInputStream类,使用文件输入流构造方法建立通往文件的输入流时,可能会出现错误(也被称为异常)。为了把一个文件输入流对象与一个文件关联起来,使用类似于下面所示的代码:try FileInputStream ins = new FileInputStream("myfile.dat"); catch (IOException e ) System.out.println("File read error: " +e ); /文件I/O错误 ,3.从输入流中读取字节,read方法给程序提供一个从输入流中读取数据的基本方法 , read方法从输入流中顺序读取源中的单个字节数据,该方法返回字节值(0255之间的一个整数),如果到达源的末尾,该方法返回-1。 read方法还有其它一些形式。这些形式能使程序把多个字节读到一个字节数组中: int read(byte b); int read(byte b, int off, int len);,4.关闭流,JAVA在程序结束时自动关闭所有打开的流。一个被打开的流可能会用尽系统资源,这取决于平台和实现。如果没有关闭那些被打开的流,那么在这个或另一个程序试图打开另一个流时,这些资源可能得不到。关闭输入流的另一个原因是把该流缓冲区的内容冲洗掉。在操作系统把程序所写到输入流上的那些字节保存到磁盘上之前,内容有时被存放在内存缓冲区中,通过调用close()方法,乐意保证操作系统把流缓存区的内容写到它的目的地。例子4import java.io.*;import java.awt.*;import java.awt.event.*;public class Example10_4 public static void main(String args) int b; byte tom=new byte25; try File f=new File("Example10_3.java");,FileInputStream in=new FileInputStream(f); while(b=in.read(tom,0,25)!=-1) String s=new String (tom,0,b); System.out.print(s); in.close(); catch(IOException e) System.out.println("File read Error"+e); ,