File类:
既能代表一个特定文件的名称,又能代表一个目录下的一组文件的名称。File类也可以用来创建新的目录。
File file = new File( "D:/test.txt");
file.exists();
File file2 = new File( "D:/mkdir");
file2.mkdir();
File2.mkdirs();
file.length();
file.renameTo( new File("d:/test2.txt"));
file.delete();
file.isDirectory();
String[] fileNames = file.list(); 返回一个文件名的字符数组
File[] files = file.listFiles(); 返回一个file类型的数组
其中List()参数可以为一个实现了FilenameFilter接口的对象,通过回调accept方法实现返回值的过滤:
public interface FilenameFilter{
boolean accept(File dir,String name);
}
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();
}
}
如何产生一个文件集?
1. local()产生本地目录中的文件构成的File对象数组
2. Walk()产生给定目录下的由整个目录树中所有文件构成的List<File>
区别:local使用file.listFiles方法(是File.list的变体),产生File数组;Walk通过递归调用recurseDirs()返回treeinfo对象,分为treeInfo.files 保存当前目录下的所有文件, treeInfo.dirs 保存所有目录。
stream流(面向字节)
代表任何有能力产出数据的数据源或者是有能力接收数据的接收端对象。
Inputstream:常见数据源包括:字节数组,string对象,文件。
每一种数据源都有相应的inputstream子类,
如FileInputstream,StringBufferInputStream,ByteArrayInputStream,FilterInputStream...
其中FilterInputStream是一个子类,抽象类,为装饰器提供基类。
子类:DataInputStream读取基本数据类型,bufferedInputStream使用缓冲区...
OutputStream:决定了输出要去的目标,包括字节数组,文件,管道。
如FileOutputStream,ByteArrayOutputStream,FilterOutputStream
FilterOutputStream是一个outputstream的子类,抽象类,为装饰器提供基类。
子类:DataOutputStream写入基本数据类型,bufferedOutputStream使用缓冲区,printStream格式化输出。
通过继承,任何自inputstream和reader派生而来的类都含有名为read的基本方法,任何自outputstream和writer派生而来的类都含有名为write的基本方法。
我们通常通过叠加多个对象来提供所期望的功能(装饰器模式)。对于Inputstream和OutputStream,我们会使用FilterInputStream和FilterOutputStream的装饰器子类来修改流以满足特殊需要。IO流之间可以组合,组合的目的是把多种类的特性融合在一起以实现更多的功能。组合使用的方式通过把一个流放入另一个流的构造器中即可实现。
如:InputStream is = new BufferedInputStream( new FileInputStream(file));
Reader和Writer(面向字符)
图表示:
字节流可以转换为字符流:
File file= new File( "d:/test.txt");
InputStream is= new FileInputStream( file);
Reader reader= new InputStreamReader( is);
为了简化对文件的读写操作,可以使用TextFile类:public class TextFile extends ArrayList<String>
类中有两个静态方法: public static String read(String fileName)
public static void write (String fileName, String text)
构造方法: public TextFile(String fileName, String splitter){
super(Arrays.asList(read(fileName).split(splitter)));
if(get(0).equals("")) remove(0);
} 将我们创建的textfile对象用arraylist保存文件的若干行
public TextFile(String fileName){
this(fileName,"\n"); 默认按照行读取
}
非静态方法:public void write(String fileName)可以将一个已经存在的文件写入到另一个文件。
与之对应的二进制文件类:BinaryFile
另一种方式为java.util.Scanner类,但只能用于读取文件,不能用于写入文件。
标准I/O
意义在于我们可以很容易的把程序串联起来,一个程序的标准输出可以作为另一个程序的标准输入。
重点在于提供程序与用户之间,程序与程序之间,数据传输的标准。
Java提供了System.in、System.out、System.err.
其中System.out、System.err已经被包装成PrintStream,
而System.in是一个未包装的inputStream,使用之前对其进行包装:
BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
Java的system类提供了一些静态方法调用,以实现对标准输入,输出,和错误流进行重定向:
setIn(InputStream)使输入不再只是通过键盘,可以定义为一个文件
setOut(PrintStream)是输出不再只是控制台,可以输出到一个文件
setErr(PrintStream)