一、字符流FileReader
字符流是可以直接读写字符的IO流
字符流读取字符, 就要先读取到字节数据, 然后转为字符
如果要写出字符, 需要把字符转为字节再写出
二、字符流使用场景
1、字符流也可以拷贝文本文件, 但不推荐使用。因为读取时会把字节转为字符, 写出时还要把字符转回字节。
程序需要读取一段文本, 或者需要写出一段文本的时候可以使用字符流
读取的时候是按照字符的大小读取的,不会出现半个中文
写出的时候可以直接将字符串写出,不用转换为字节数组
2、字符流不可以拷贝非纯文本的文件
因为在读的时候会将字节转换为字符,在转换过程中,可能找不到对应的字符,就会用?代替,
写出的时候会将字符转换成字节写出去;如果是?,直接写出,这样写出之后的文件就乱了,看不了了
三、带缓冲的字符流
1、BufferedReader的read()方法读取字符时会一次读取若干字符到缓冲区, 然后逐个返回给程序,
降低读取文件的次数, 提高效率
2、BufferedWriter的write()方法写出字符时会先写到缓冲区, 缓冲区写满时才会写到文件,
降低写文件的次数, 提高效率
四、readLine()和newLine()方法
BufferedReader的readLine()方法可以读取一行字符(不包含换行符号)
BufferedWriter的newLine()可以输出一个跨平台的换行符号"\r\n"
newLine()与\r\n区别:
newLine()是跨平台方法
\r\n只支持Windows系统
五、递归好处:不需要知道循环次数
递归坏处:如果调用次数过多,导致栈内存溢出
构造方法不能使用递归调用
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.LineNumberReader; import java.io.OutputStreamWriter; import java.util.ArrayList; import java.util.Scanner; import java.util.TreeMap; public class FileReaderAndWriter { public static void main(String[] args) throws IOException { /* * 一、字符流FileReader 字符流是可以直接读写字符的IO流 字符流读取字符, 就要先读取到字节数据, 然后转为字符 如果要写出字符, 需要把字符转为字节再写出 二、字符流使用场景 1、字符流也可以拷贝文本文件, 但不推荐使用。因为读取时会把字节转为字符, 写出时还要把字符转回字节。 程序需要读取一段文本, 或者需要写出一段文本的时候可以使用字符流 读取的时候是按照字符的大小读取的,不会出现半个中文 写出的时候可以直接将字符串写出,不用转换为字节数组 2、字符流不可以拷贝非纯文本的文件 因为在读的时候会将字节转换为字符,在转换过程中,可能找不到对应的字符,就会用?代替, 写出的时候会将字符转换成字节写出去;如果是?,直接写出,这样写出之后的文件就乱了,看不了了 二、带缓冲的字符流 1、BufferedReader的read()方法读取字符时会一次读取若干字符到缓冲区, 然后逐个返回给程序, 降低读取文件的次数, 提高效率 2、BufferedWriter的write()方法写出字符时会先写到缓冲区, 缓冲区写满时才会写到文件, 降低写文件的次数, 提高效率 三、readLine()和newLine()方法 BufferedReader的readLine()方法可以读取一行字符(不包含换行符号) BufferedWriter的newLine()可以输出一个跨平台的换行符号"\r\n" newLine()与\r\n区别: newLine()是跨平台方法 \r\n只支持Windows系统 四、递归好处:不需要知道循环次数 递归坏处:如果调用次数过多,导致栈内存溢出 构造方法不能使用递归调用 * */ fileReader(); fileWrite(); fileCopy(); imageCopy(); customArr();//自定义数组 buffer();//缓冲区 readerLine(); newerLine(); reverseText();//反转文本 lineNumber(); design();//装饰设计模式好处:耦合性不强,被装饰的类的变化与装饰类的变化无关 codeStyle();//指定编码表 countChar();//统计字符 deCount(); System.out.println("===============递归================"); System.out.println("递归:" + digui(4)); // System.out.println("递归:" + digui(1000000)); //java.lang.StackOverflowError;如果调用次数太多导致栈内存溢出 System.out.println("===============获取.java文件路径(递归)================"); File dir = getDir(); printJavaFile(dir); } public static void printJavaFile(File dir) { File[] fileArr = dir.listFiles(); for (File subFile : fileArr) { if(subFile.isFile() && subFile.getName().endsWith(".java")){ System.out.println(subFile); }else if(subFile.isDirectory()){ printJavaFile(subFile); } } } public static File getDir() { Scanner sc = new Scanner(System.in); System.out.println("请输入一个文件夹路径:"); while(true){ String line = sc.nextLine(); File dir = new File(line); if(!dir.exists()){ System.out.println("您输入的文件夹不存在,请重新录入:"); }else if(dir.isFile()){ System.out.println("您输入的是一个文件,请重新录入一个文件夹:"); }else{ return dir; } } } private static int digui(int num) { if (num == 1){ return 1; }else{ return num * digui(num - 1); } } private static void deCount() throws IOException { System.out.println("===============数减少================"); BufferedReader br = new BufferedReader(new FileReader("c.txt")); String line = br.readLine(); int count = Integer.parseInt(line); if(count > 0){ System.out.println("您还有" + count-- + "次机会"); FileWriter fw = new FileWriter("c.txt"); fw.write(count + ""); fw.close(); }else{ System.out.println("请购买正版"); } } private static void countChar() throws IOException { System.out.println("===============统计字符个数================"); BufferedReader br = new BufferedReader(new FileReader("aa.txt")); TreeMap<Character, Integer> tr = new TreeMap<>(); int b; while((b = br.read()) != -1){ char c = (char)b; if(!tr.containsKey(c)){ tr.put(c, 1); }else{ tr.put(c, tr.get(c) + 1); } } br.close(); for (Character key : tr.keySet()) { System.out.println(key + "--" + tr.get(key)); } } private static void codeStyle() throws IOException, FileNotFoundException { System.out.println("===============指定编码表================"); BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("utf-8.txt"),"UTF-8")); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("gbk.txt"),"gbk")); int c; while((c = br.read()) != -1){ bw.write(c); } br.close(); bw.close(); } private static void design() { System.out.println("===============装饰设计模式================"); SocialStudent s = new SocialStudent(new Student()); s.code(); } private static void lineNumber() throws IOException { System.out.println("===============设置行号================"); LineNumberReader lnr = new LineNumberReader(new FileReader("aa.txt")); String line; lnr.setLineNumber(100); while((line = lnr.readLine()) != null){ System.out.println(lnr.getLineNumber() + ":" + line); } lnr.close(); } private static void reverseText() throws IOException { System.out.println("===============反转文本================"); BufferedReader br = new BufferedReader(new FileReader("aa.txt")); String line; ArrayList<String> list = new ArrayList<>(); while((line = br.readLine()) != null){ list.add(line); } br.close(); BufferedWriter bw = new BufferedWriter(new FileWriter("aaRever.txt")); for (int i = list.size() - 1;i >= 0;i--) { bw.write(list.get(i)); bw.newLine(); } bw.close(); } private static void newerLine() throws IOException { System.out.println("===============newLine================"); BufferedReader br = new BufferedReader(new FileReader("aa.txt")); BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt")); String line; while((line = br.readLine()) != null){ bw.write(line); bw.newLine();//newLine()是跨平台方法,\r\n只支持Windows系统 } br.close(); bw.close(); } private static void readerLine() throws IOException { System.out.println("===============readLine================"); BufferedReader br = new BufferedReader(new FileReader("aa.txt")); String line; while((line = br.readLine()) != null){ System.out.println(line); } br.close(); } private static void buffer() throws IOException { BufferedReader br = new BufferedReader(new FileReader("aaa.txt")); BufferedWriter bw = new BufferedWriter(new FileWriter("bbb.txt")); int c; while((c = br.read()) != -1){ bw.write(c); } br.close(); bw.close(); } private static void customArr() throws IOException { FileReader fr = new FileReader("aaa.txt"); FileWriter fw = new FileWriter("bbb.txt"); char[] arr = new char[1024 * 8]; int len; while((len = fr.read(arr)) != -1){ fw.write(arr, 0, len); } fr.close(); fw.close(); } private static void imageCopy() throws IOException { /* * 字符流不可以拷贝非纯文本的文件 因为在读的时候会将字节转换为字符,在转换过程中,可能找不到对应的字符,就会用?代替, 写出的时候会将字符转换成字节写出去;如果是?,直接写出,这样写出之后的文件就乱了,看不了了 * */ FileReader fr = new FileReader("11.jpg"); FileWriter fw = new FileWriter("22.jpg"); int c; while((c = fr.read()) != -1){ fw.write(c); } fr.close(); fw.close(); } private static void fileCopy() throws IOException { FileReader fr = new FileReader("b.txt"); FileWriter fw = new FileWriter("bbb.txt"); int c; while((c = fr.read()) != -1){ fw.write(c); } fr.close(); fw.close(); //Write类中有一个2K的小缓冲区,如果不关闭,就会将内容写到缓冲区里,关流会将缓冲区内容刷新再关闭 } private static void fileWrite() throws IOException { FileWriter fw = new FileWriter("aaa.txt"); fw.write("我读书少啊,千万别骗我啊"); fw.close(); } public static void fileReader() throws FileNotFoundException, IOException { FileReader fr = new FileReader("aa.txt"); int c; while((c = fr.read()) != -1){ System.out.print((char)c); } fr.close(); } } /*---------------------装饰设计模式-----------------------*/ interface Coder{ public void code(); } class Student implements Coder{ public void code(){ System.out.println("C"); System.out.println("C++"); System.out.println("Java"); } } class SocialStudent implements Coder{ //1、获取被装饰类的引用 private Student s; //2、在构造方法中传入被装饰类的对象 public SocialStudent(Student s){ this.s = s; } //3、对原有功能进行升级 public void code(){ s.code(); System.out.println("iOS"); System.out.println("Android"); System.out.println("JavaEE"); } }
编码表
字符流和字节流对比