《第18章 Java
I/O系统》
任何自InputStream和Reader派生而来的类都含有read()基本方法。
Reader和Writer类提供天然的Unicode操作。
在某些场合,面向字节的InputStream和OutputStream才是正确的解决方案。
特别是java.util.zip类库就是面向字节的而不是面向字符的。
自我独立的类:RandomAccessFile
public class RandomAccessFile extends Object implements DataOutput, DataInput, Closeable
不是InputStream和OutputStream继承层次结构中的一部分。
我们可以在一个文件内向前和向后移动。
只有RandomAccessFile支持搜寻方法,并且只适用于文件。
18.6 I/O流的典型使用方式 典型I/O用法基本参考
18.6.1 缓冲输入文件 想要打开一个文件用于字符输入,可以使用String或File对象作为文件名的FileInputReader。
为了提高速度,我们希望对那个文件进行缓冲,那么我们将所产生的引用传给一个BufferedReader构造器,也提供readLine()方法。
import java.io.*;
public class BufferedInputFile{
public static String read(String filename)throws IOException{//Reading input by lines
BufferedReader in = new BufferedReader(new FileReader(filename) );
String s;
StringBuilder sb = new StringBuilder();
while( (s = in.readLine())!=null )
sb.append(s+"\n");
in.close();
return sb.toString();
}
public static void main(String[] args)throws IOException{
System.out.println(read("BufferedInputFile.java"));
}
}
从内存输入
public class MemoryInput{
public static void main(String[] args)throws IOException{
StringReader in = new StringReader(BufferedInputFile.read("MemoryInput.java"));
int c;
while((c = in.read())!= -1)
System.out.print((char)c);
}
}
格式化的内存输入:
要读取格式化数据,可以使用DataInputStream,它是一个面向字节的I/O类,不是面向字符的。
public class FormattedMemoryInput{
public static void main(String[] args)throws IOException{
try{
DataInputStream in = new DataInputStream(
new ByteArrayInputStream(
BufferedInputFile.read(
"FormattedMemoryInput.java").getBytes()));
while(true)
System.out.print((char)in.readByte());
}catch(EOFException e){
System.err.println("End of stream");
}
}
}
创建文件: public boolean createNewFile() throws IOException。
假设:现在要在d 盘上创建一个test.txt 文件。
在各个操作系统中,实际上路径的分隔符是不一样的,例如:windows 中使用反斜杠:“\”,linux 中使用正斜杠:“/”
import java.io.File ;
import java.io.IOException ;
public class FileDemo{
public static void main(String args[]){
File file = new File("d:"+File.separator+"test.txt") ; // 实例化File类的对象
try{
file.createNewFile() ; // 创建文件,根据给定的路径创建
}catch(IOException e){
e.printStackTrace() ; // 输出异常信息
}
}
}
删除文件:public boolean delete()
File 类中可以使用 exists() 方法判断一个文件是否存在:public
boolean exists()
import java.io.File ;
import java.io.IOException ;
public class FileDemo{
public static void main(String args[]){
File f = new File("d:"+File.separator+"test.txt") ; // 实例化File类的对象
if(f.exists()){ // 如果文件存在则删除
f.delete() ; // 删除文件
}
}
}
创建文件夹:
import java.io.File ;
import java.io.IOException ;
public class FileDemo{
public static void main(String args[]){
File f = new File("d:"+File.separator+"mldn") ; // 实例化File类的对象
f.mkdir() ; // 创建文件夹
}
}
列出指定目录的全部文件
如果现在给出了一个目录,则可以直接列出目录中的内容,但是列出的方法在File 类中存在两个:
以字符串数组的形式返回:public String[] list()
以 File 数组的形式返回: public
File[] listFiles()
操作一: 使用list() 列出全部内容
import java.io.File ;
import java.io.IOException ;
public class FileDemo{
public static void main(String args[]){
File f = new File("d:"+File.separator) ; // 实例化File类的对象
String str[] = f.list() ; // 列出给定目录中的内容
for(int i=0;i<str.length;i++){
System.out.println(str[i]) ;
}
}
} //360Downloads
操作二: 使用listFiles() 列出全部内容(带路径)
import java.io.File ;
import java.io.IOException ;
public class FileDemo{
public static void main(String args[]){
File f = new File("d:"+File.separator) ; // 实例化File类的对象
File files[] = f.listFiles() ; // 列出全部内容
for(int i=0;i<files.length;i++){
System.out.println(files[i]) ;
}
}
} //d:\360Downloads
要求:列出指定目录的全部内容
如果给定了一个目录,则要求将此目录中的全部文件都列出来,但是列的时候还会存在子文件夹。
import java.io.File ;
import java.io.IOException ;
public class FileDemo{
public static void main(String args[]){
File my = new File("d:" + File.separator) ; // 操作路径
print(my) ;
}
public static void print(File file){ // 递归调用
if(file!=null){ // 判断对象是否为空
if(file.isDirectory()){ // 如果是目录
File f[] = file.listFiles() ; // 列出全部的文件
if(f!=null){ // 判断此目录能否列出
for(int i=0;i<f.length;i++){
print(f[i]) ; // 因为给的路径有可能是目录,所以,继续判断
}
}
}else{
System.out.println(file) ; // 输出路径
}
}
}
}
总结:
1.File 类是在java.io 包中唯一与文件本身有关的
2.可以使用File 类创建、删除等常见的文件操作
3.在使用File 类指定路径的时候一定要注意操作系统间的差异。
《Java编程思想》中的代码
package IO;
import java.util.regex.*;
import java.io.*;
import java.util.*;
public class DirList {
public static void main(String args[]){
File path = new File(".");
String[] list;
if(args.length == 0)
list = path.list();
else
list = path.list(new DirFilter(args[0]));
Arrays.sort(list,String.CASE_INSENSITIVE_ORDER);
for(String dirItem : list)
System.out.println(dirItem);
}
}
class DirFilter implements FilenameFilter{
private Pattern pattern;
public DirFilter(String regex){
pattern = Pattern.compile(regex);
}
public boolean accept(File dir,String name){
return pattern.matcher(name).matches();
}
}
Java I/O
整理于20140903
《Java编程思想》 PDF-558
理解I/O类库的演化过程:目的是掌握什么时候该使用哪些类,什么时候不该使用哪些类。
18.1 File类
实用工具类库:处理文件目录问题
FilePath(文件路径)对这个类来说是个更好的名字。
18.1.1 目录列表器
import java.util.regex.*;
匿名内部类
注意上图中:传递给mian方法的参数必须是final的,因为匿名内部类的原因。
这样匿名内部类才能够使用来自该类范围之外的对象。
18.1.2 目录实用工具
18.1.3 目录的检查与创建
18.2 输入输出 P566
输入:InputStream
输出:OutputStream
18.2.1 InputStream类型
18.2.2 OutputStream类型
18.3 添加属性和有用的接口
P535 I/O类库:不同功能的组合(装饰器模式)
18.6 I/O流的典型使用方式
18.12 对象序列化 20140904