Thinking in java 第18章 Java I/O系统

一.Java操作文件/目录的File类
File类既能代表一个特定文件的名称,又能代表目录下的一组文件的名称。如果指的是一个文件集,我们就可以对此集合调用list方法,这个方法会返回一个字符数组。
下面是一个例子,如何得到符合条件的File对象。

import java.io.File;
import java.util.Arrays;

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);
    }
}

public class DirFilter implements FilenameFilter {

    private Pattern pattern;

    public DirFilter(String regex) {
        pattern = Pattern.compile(regex);
    }

    @Override
    public boolean accept(File dir, String name) {
        return pattern.matcher(name).matches();
    }
}

这里DirFIilter实现了FilenameFilter接口。
DirFilter这个类存在的唯一原因就是将accept方法提供给list使用,使list可以回调accept()。注意,此Java经典的输入输出流 处用了策略模式。
**二,Java经典的输入输出流 **
(1).输入流和输出流
输入流指的是只能从中读取数据,而不能向里面写数据。:包括InputStream和Reader两个基本接口
输出流是指只能向里面写数据而不能向其中读数据:包括OutputStream和Writer两个基本接口
(2).字节流和字符流
字节流和字符流唯一的区别就是操作单元不同而已。字节流操作的数据单元是字节,而字符流操作的数据单元是字符。所有从Writer,Reader派生来的类都是字符流的类。而所有从InputStream和OutputStream派生出来的类都是字节流的类。
(3)节点流和处理流
所谓的节点流指的是:可以向/从一个特定的IO设备(如磁盘,网络,数组,字符串)读/写的流;节点流也被成为低级流。
所谓的处理流指的是:对一个已存在的流进行连接或封装,然后通过封装以后的流来实现数据的读写功能。处理流也叫做高级流。
下面几个实例了解一下Io类具体用法

//打开一个文件进行操作时,为了提高速度,对文件进行缓冲
//使用BufferedReader,这个I/O流包括一个可以整行读取的ReadLine()方法
//BufferdReader 属于包装流,需要在构造器中传入一个FileInputReader节点流

 BufferedReader br = new BufferedReader(new FileReader("/Test/test.txt"));
                LinkedList<String> read = new LinkedList<>();
                String s;
                StringBuilder sb = new StringBuilder();
                while((s=br.readLine())!=null){ ///按行读取
                    s=s.toUpperCase();
                    read.add(s);
                    //sb.append(s+"\n"); ///采用append()方法比“+”要快
                }
                br.close();
                for(int i=read.size()-1;i>=0;i--){
                    System.out.println((String)read.get(i));
                }

**三.Java的标准输入输出 **
Java的标准输入输出流指的是System.in,System.out
System.err分别是标准输入流,标准输出流,标准错误输出流
System.out,System.err都是已经经过包装的PrintStream对象,而System.in是未经包装过的InputStream,所以在使用System.in之前我们需要进行包装

 ///将System.in包装成BufferedReader
      //  BufferedInputStream in = new BufferedInputStream(System.in);
        ///要先转成Reader
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String content="";
        String str;
        while((str=br.readLine())!=null&&str.length()!=0){
            content+=str;
        }
        br.close();
        ///将System.out包装成PrintWriter
        ///System.out是一个PrintStream但是PrintWriter有一个构造器可以接受OutputSteam
        ///作为参数,所以可以直接使用那个构造器将System.out转成PrintWriter
        PrintWriter out =new PrintWriter(System.out,true); ///注意设置第二个参数
        out.println(content);

猜你喜欢

转载自blog.csdn.net/lc138544/article/details/82814739