Java

Java 21-2 IO技术字符流

2019-01-29  本文已影响0人  第二套广播体操

发现 文本数据 媒体文件字节流没问题 但是对于文本文件 想要操作文件中的中文数据时 字节流只能操作字节
需要我们转码成字符 麻烦
所以到Api查找 字符流 字节到字符的桥梁对象(字节流的基础上添加字符流)
Reader
|--InputStreamReader:字节转字符
Writer
|--OutPutStreamReader:字符转字节
出现了中文编码问题
为了便捷操作字符文件 找到了转换流的子类 但是他有局限性 只能操作文件 而且默认编码
如果不操作文件 而且编码不是默认的 需要转换流
Reader
|--InputStreamReader:字节转字符
|--FileReader
Writer
|--OutPutStreamReader:字符转字节
|--FileWriter 只能操作文本
为了挺高效率 引用了字符串的缓冲区
Reader
|--InputStreamReader:字节转字符
|--FileReader
|--BufferedReader
Writer
|--OutPutStreamReader:字符转字节
|--FileWriter
|--BufferedWriter


public class Reader_Test1 {
    public static void main(String[] args) throws IOException {
        File file=new File("D:\\TEST.txt");
        if (!file.exists()) {
            file.createNewFile();
        }
        OutputStream ops=new FileOutputStream(file,true);
        Writer writer=new OutputStreamWriter(ops);
//        只能操作字符数据
        writer.write("yusongjiang");
//        缓冲转换成汉字 所以需要刷新
//        刷新 或者关闭字符流才可以获取到文件中 会存储在缓冲区里因为需要查表
        writer.close();
//        关闭字符流就关闭了字节流
    }
}

InputStreamReader


方法摘要

一次读一个字符

public class FileReader_Tesr1 {
    public static void main(String[] args) throws IOException {
        File file=new File("D:\\TEST.txt");
        FileReader fr=new FileReader(file);
        int ch=0;
        while ((ch=fr.read())!=-1)
        System.out.println((char) ch);
        fr.close();
    }
}

将复制文本

public class FileReader_Test2 {
    public static void main(String[] args) throws IOException {
        File file=new File("D:\\TEST.txt");
        FileReader fr=new FileReader(file);
        FileWriter fw=new FileWriter("D:\\TEST副本.txt");

        char[] buf=new char[1024];
        int len=0;
        while ((len=fr.read(buf))!=-1)
        fw.write(buf,0,len);
        fr.close();
        fw.close();
//        记得关闭
    }
}

OutputStreamWriter


方法
public class FileWriter_Test1 {
    public static void main(String[] args) throws IOException {
        File file=new File("D:\\TEST.txt");
        FileWriter fw=new FileWriter(file);//只能操作文件
//    等价于    FileOutputStream fos=new FileOutputStream(file);
//        OutputStreamWriter osw=new OutputStreamWriter(fos);
    fw.write("你好");
        fw.close();
    }
}

BufferedWriter
BufferedReader


BufferedWriter方法

将文件中的所有.java文件写入txt中

public class BufferWriter_Test2 {
    public static void main(String[] args) {
        File file=new File("C:\\Users\\Yu\\IdeaProjects\\Study\\src\\it");

        outPutNames(file);
    }

    private static void outPutNames(File file) {
        ArrayList<File> list=new ArrayList<>();
        FileFilter filter=new NameFilter(".java");
        getFile(file,filter,list);
        BufferedWriter bw=null;
        try {
          bw= new BufferedWriter(new FileWriter("D:\\TEST.txt"));
            for (File f:
            list) {
//                循环集合 并通过BufferedWriter写入文本
                bw.write(f.getAbsolutePath());
                bw.newLine();
                bw.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (bw!=null) {
                try {
                    bw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    private static void getFile(File file, FileFilter filter, ArrayList<File> arrayList) {
         File[] files=file.listFiles();
        for (File f :
                files) {
            if (f.isDirectory())
                getFile(f,filter,arrayList);
            else {
                if (filter.accept(f))
                    arrayList.add(f);
            }
        }
          }

}

过滤器

public class NameFilter implements FileFilter {
    private String string;

    public NameFilter(String string) {
        this.string = string;
    }

    @Override
    public boolean accept(File pathname) {
        return pathname.getName().endsWith(string);
    }
}
上一篇下一篇

猜你喜欢

热点阅读