教材学习内容总结
主要内容:File类 文件字节输入、输出流 文件字符输入、输出流 缓冲流 随机流 数组流 数据流 对象流 序列化与对象克隆 使用Scanner解析文件 文件锁
java.io包(I/O流库)提供大量的流类。
输入流的指向称为它的源,程序通过输入流读取源中的数据。所有输入流都是抽象类InputStream(字节输入流)或抽象类Reader(字符输入流)的子类。
输出流的指向称为它的目的地,程序通过输出流把数据传送到目的地。所有输出流都是抽象类OutputStream(字节输出流)或抽象类Writer(字符输出流)的子类。
10.1File类
1.File类的对象主要用来获取文件本身的一些信息,不涉及对文件的读写操作。
2.构造方法:·File(String filename);//用此创建的文件被认为与当前程序在同一目录中
·File(String directoryPath,String filename);
·File(File dir,String filename);
(filename是文件名,dierctoryPath是文件的路径,dir为一个目录)
3.File类获取文件本身信息的方法
·public String getName() ---文件的名字
·public boolean canRead() ---是否可读
·public boolean canWrite() ---是否可被写入
·public boolean exists() ---是否存在
·public long length() ---文件的长度(单位是字节)
·public String getAbsolutePath() ---文件的绝对路径
·public String getParent() ---文件的父目录
·public boolean isFile() ---是否是普通文件
·public boolean isDirectory() ---是否是目录
·public boolean isHidden() ---是否是隐藏文件
·public long lastModified() ---最后修改时间
4.目录
创建目录:File对象调用方法public boolean mkdir(),创建成功返回true,否则返回false(如果该目录已经存在将返回false)
列出目录中的文件:·public String[] list() 字符串形式、全部
·public File [] listFiles() File对象形式、全部
·public String[] list(FilenameFilter obj) 字符串形式、指定类型
·public File [] listFiles(FilenameFilter obj) File对象形式、指定类型
File对象dirFile调用list方法时,需向该方法传递一个实现FilenameFilter接口的对象。执行时,参数obj不断回调接口方法accept(File dir,String name),其中参数dir为调用list的当前目录dirFile,参数name被实例化为dirFile目录中的一个文件名,当接口方法返回true时,list方法就将名字为name的文件存放到返回的数组中。
5.文件的创建与删除
·使用File类创建一个文件对象 eg:File file = new File("C:\\myletter","letter.txt");
·如果C:\myletter目录中没有letter.txt文件,文件对象file会调用方法 public boolean createNewFile(); 创建出这个文件。
·文件对象调用方法 public boolean delete(); 可以删除当前文件。
6.java.lang包中的Runtime类声明一个对象,然后用该类的getRuntime()静态方法创建这个对象。
eg:Runtime ec;
ec=Runtime.getRuntime();
然后ec可以调用exec(String command)方法打开本地机器上的可执行文件或执行一个操作。
10.2文字字节输入流
1.使用输入流的4个基本步骤
a.设定输入流的源;
b.创建指向源的输入流;
c.让输入流读取源中的数据;
d.关闭输入流;
2.FileInputStream类(文件字节输入流)是InputStream类的子类。
3.创建指向文件的输入流: FileInputStream(String name) FileInputStream(File file) name和file指定的文件称为输入流的源。
在try-catch语句中的try部分创建输入流,在catch(捕获)部分检测并处理异常。
try{
FileInputStream in = new FileInputStream("hello.txt");
}
catch (IOException e){
System.out.println("File read error:"+e );
}
或
File f = new File("hello.txt");
try{
FileInputStream in = new FileInputStream(f);
}
catch(IOException e){
System.out.println("File read error:"+e);
}
4.字节输入流的read方法以字节为单位读取源中的数据。(只要不关闭流,每次调用read方法就顺序地读取其余的内容,直到源的末尾或流被关闭。)
in read()读取单个字节,返回字节值(0~255之间的一个整数),未读出就返回-1。
in read(byte b[])读取b.length个字节到字节数组b,返回实际读取字节数,到达文件末尾返回-1。
int read(byte b[],int off,int len)读取len个字节到字节数组b,返回实际读取字节数,到达文件末尾返回-1,参数off指定从字节数组的某个位子开始存放读取的数据。
5.关闭流:关闭方法close()。
10.3文件字节输出流
1.使用输出流的4个基本步骤
a.给出输出流的目的地
b.创建指向目的地的输出流
c.让输出流把数据写入到目的地
d.关闭输出流
2.FileOutputStream类(文件字节输出流)是OutputStream类的子类。
3.创建指向文件的输出流:FileOutputStream(String name) FileOutputStream(File file) name和file指定的文件称为输出流的目的地。
如果输出流指向的文件不存在,Java就会创建该文件,如果已存在,输出流将刷新该文件。
在try-catch语句中的try部分创建输出流,在catch(捕获)部分检测并处理异常。
FileOutputStream(String name, boolean append); FileOutputStream(File file, boolean append);
参数append取值true,输出流不会刷新所指向文件,write的方法将从文件的末尾开始写入数据;append取false,刷新。
4.使用输入流写字节
void write(int n)单个字节
void write(byte b[])一个字节数组
void write(byte b[],int off,int len)从字节数组的off处开始取len个字节
void close()关闭
10.4文件字符输入、输出流
FileReader、FileWriter字符流
构造方法分别是:
FileReader(String filename);FileReader(File filename);
FileWriter(String filename);FileWriter(File filename);
FileWriter(String filename,boolean append);Fil,Wrirer(String filename,boolean append);
10.5缓冲流
(1)BufferedReader和BufferedWriter类创建的对象称作缓冲输入、输出流。二者的源和目的地必须是字符输入流和字符输出流。
构造方法:
–BufferedReader(Reader in);
–BufferedWriter (Writer out);
(2)BufferedReader和BufferedWriter类读写文件的方法:
–readLine() 读取文本行
–write(String s,int off,int len) 把字符串s写到文件中
–newLine(); 向文件写入一个回行符
10.6随机流
(1)使用RandomAccessFile类来创建一个随机访问文件流。RandomAccessFile类创建的流的指向既可以作为源也可以作为目的地。
构造方法:
–RandomAccessFile(String name,String mode) ;
–RandomAccessFile(File file,String mode) ;
(2)相关方法:
–seek(long a) 定位RandomAccessFile流的读写位置
–getFilePointer() 获取流的当前读写位置
–例子8(把几个int型整数写入到一个名字为tom.dat文件 )
–readLine()方法在读取含有非ASCII字符的文件时出现“乱码”现象的解决方法:
1)读取 String str=in.readLine();
2)用“iso-8859-1”重新编码 byte b[]=str.getBytes("iso-8859-1");
3)使用当前机器的默认编码将字节数组转化为字符串
String content=new String(b);
10.7数组流
1)字节数组流
字节数组输入流ByteArrayInputStream和字节数组输出流ByteArrayOutputStream分别使用字节数组作为流的源和目标。
ByteArrayInputStream构造方法及常用方法
– ByteArrayInputStream(byte[] buf);
– ByteArrayInputStream(byte[] buf,int offset,int length);
– public int read();顺序地从源中读出一个字节
– public int read(byte[] b,int off,int len);顺序地从源中读出参数len指定的字节数
ByteArrayOutputStream流构造方法及常用方法
– ByteArrayOutputStream();
– ByteArrayOutputStream(int size);
– public void write(int b); 顺序地向缓冲区写入一个字节
– public void write(byte[] b,int off,int len); 将参数b中指定的len个字节顺序地写入缓冲区
– public byte[] toByteArray(); 返回输出流写入到缓冲区的全部字节
(2)字符数组
– CharArrayReader和CharArrayWriter类是字符数组流,使用字符数组作为流的源和目标。例子10 向内存(输出流的缓冲区)写入字符串 。
10.8数据流
DataInputStream和DataOutputStream类创建的对象称为数据输入流和数据输出流。
构造方法:
– DataInputStream(InputStream in)创建的数据输入流指向一个由参数in指定的底层输入流
– DataOutputStream(OutnputStream out)创建的数据输出流指向一个由参数out指定的底层输出流
10.9对象流
ObjectInputStream和ObjectOutputStream类创建的对象称为对象输入流和对象输出流。
它的构造方法是:
– ObjectInputStream(InputStream in)
– ObjectOutputStream(OutputStream out)
相关方法:
– writeObject(Object obj) 将一个对象obj写入到一个文件
– readObject() 读取一个对象到程序中
所谓序列化:一个类如果实现了Serializable接口,那么这个类创建的对象就是所谓序列化的对象。
10.10序列化与对象克隆
如果一个“复制品”实体的变化不会引起原对象实体发生变化,反之亦然。这样的复制品称为原对象的一个克隆对象或简称克隆。
一个对象调用clone()方法就可以获取该对象的克隆对象。
对象输入流通过对象的序列化信息来得到当前对象的一个克隆。
10.11使用Scanner解析文件
用Scanner类和正则表达式来解析文件。
(1)使用默认分隔标记解析文件
创建Scanner对象,并指向要解析的文件,例如:
File file = new File("hello.java");
Scanner sc = new Scanner(file);
sc将空白作为分隔标记
相关方法 next()依次返回file中的单词
hasNext()判断file最后一个单词是否已被next()方法返回.
(2)使用正则表达式作为分隔标记解析文件 : 创建Scanner对象,指向要解析的文件,并使用useDelimiter方法指定正则表达式作为分隔标记,例如:
File file = new File("hello.java");
Scanner sc = new Scanner(file);
sc.useDelimiter(正则表达式);
sc将正则表达式作为分隔标记
相关方法 next() 依次返回file中的单词
hasNext() 判断file最后一个单词是否已被next()方法返回
10.12文件对话框
JFileChooser类创建。构造方法JFileChooser()创建初始不可见的有模式文件对话框。
文件对话框调用下述两个方法:showSaveDialog(Component a); 提供保存文件时的界面
showOpenDialog(Component a); 提供打开文件时的界面
(参数a指定出现对话框出现的位置,取null时出现在屏幕正中央,不空则在组件a的正前面居中显示。)
对话框消失时,上述方法返回下列常量之一:JFileChooser.APPROVE_OPTION
JFileChooser.CANCEL_OPTION
10.13带进度条的输入流
使用Javax.swing包提供的输入流类ProgressMonitorInpuStream
构造方法如下:
ProgressMonitorInputStream(Component c,String s,InputStream);
进度条在参数c指定的组件的正前方显示,若参数取null,则在屏幕正前方显示。
10.14文件锁
FileLock、FileChannel类处理Java提供的文件锁功能。它们分别在java.nio和java.nio.channels包中。
输入、输出流读写文件时可以使用文件锁。
RondomAccessFile创建的流在读写文件时使用文件锁的步骤如下:
(1)先使用RondomAccessFile流建立指向文件的流对象,该对象的读写属性必须是rw,例如:
RandomAccessFile input=new
RandomAccessFile("Example.java","rw");
(2)input流调用方法getChannel()获得一个连接到地层文件的FileChannel对象(信道),例如
FileChannel channel=input.getChannel();
(3)信道调用tryLock()或lock()方法获得一个FileLock(文件锁)对象,这一过程也称作对文件加锁.
例如:FileLock lock=channel.tryLock();