FileReader 读取文件

import java.io.FileReader;
import java.io.IOException;

public class Demo1_FileReader {
    public static void main(String[] args) throws IOException {
//        Demo1();
        FileReader fr = new FileReader("m.txt");
        int b ;
        while ( (b = fr.read()) != -1){
            System.out.println((char)b);
        }
        fr.close();
    }

    private static void Demo1() throws IOException {
        FileReader fr = new FileReader("m.txt");
        int x = fr.read();
        System.out.println(x);
        System.out.println((char)x);
    }
}

FileWriter 字符写入文件

import java.io.FileWriter;
import java.io.IOException;

public class Demo2_FileWriter {
    public static void main(String[] args) throws IOException {
        FileWriter fw = new FileWriter("output.txt");
        String s = "这只羊叫Leon";
        fw.write(s);
        fw.flush();
        fw.close();
    }
}

字符复制

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class Demo3_ReaderWriter {
    public static void main(String[] args) throws IOException {
        FileReader fr = new FileReader("input.txt");
        FileWriter fw = new FileWriter("output.txt");

        int b ;
        while ( (b = fr.read()) != -1){
            fw.write(b);
        }
        fr.close();
        fw.close();
    }
}

什么情况使用使用字符流

  • 字符流也能复制文件, 但不推荐, 字节->字符, 字符->字节 多一步转换
  • 程序需要读取一段文本, 或都需要写入一段文本的时候可以使用字符流
  • 读取的时候按字符读出, 不会出现半个中文
  • 写出时可直接字符串写出, 不用转换为字节数组
  • 图片类文件不能使用字符流复制, 丢失数据

自定义数组复制

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class Demo4_ReaderWriter {

    public static void main(String[] args) throws IOException {
        FileReader fr = new FileReader("input.txt");
        FileWriter fw = new FileWriter("output.txt");

        char[] arr = new char[1024];
        int len;
        while ( (len = fr.read(arr)) != -1){
            fw.write(arr, 0 , len);
        }
        fr.close();
        fw.close();
    }
}

BufferedReader 和 BufferedWriter 读取写入字符

import java.io.*;

public class Demo5_BufferedReader {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader("input.txt"));
        BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"));
        int b ;
        while ( (b=br.read()) != -1){
            bw.write(b);
        }
        br.close();
        bw.close();
    }
}

BufferedReader readLine()方法, BufferedWriter 的newLine方法

  • newLine 没有放在write(line)后, 并写在循环内, 这样写多写一个空行
import java.io.*;

public class Demo6_ReadLine {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader("input.txt"));
        BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"));
        String line ;
        if( (line = br.readLine() ) != null ){
            bw.write(line);
        }
        while (  (line = br.readLine()) != null){
            bw.newLine();
            bw.write(line);
        }
        br.close();
        bw.close();
    }
}

练习, 读取行, 并行数反向输出

  • 流, 最好晚开早关
import java.io.*;
import java.util.ArrayList;

public class Demo7_ReverseLine {
    public static void main(String[] args) throws IOException {

        ArrayList<String> arrayList = new ArrayList<>();
        String str ;
        BufferedReader br = new BufferedReader(new FileReader("input.txt"));
        while( ( str=br.readLine()) != null){
            arrayList.add(str);
        }
        br.close();

        BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"));
        for(int i= arrayList.size()-1;i>=0 ;i--){
            bw.write(arrayList.get(i));
            if( i == 0 ){
                break;
            }
            bw.newLine();
        }
        bw.close();
    }
}

LineNumberReader

import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;

public class Demo8_LineNumberReader {
    public static void main(String[] args) throws IOException {
        LineNumberReader lnr = new LineNumberReader(new FileReader("input.txt"));
        String line;

        lnr.setLineNumber(3);
        while ( (line = lnr.readLine()) != null){
            System.out.println(lnr.getLineNumber() + " "+line);
        }
        lnr.close();
    }
}

装饰设计模式

  • 使用被装饰的类, 对类中方法升级增加内容
  • 好处
    • 耦合性不强, 被装饰类的变化与装饰类的变化无关
public class Demo9_Wrap {
    public static void main(String[] args) {
        JiuCai j = new JiuCai(new Student());
        j.code();
    }
}
class Student {
    private String name;
    private int age;
    public void code(){
        System.out.println("C");
        System.out.println("Java");
    }
}
interface Coder{
    public void code();
}

class JiuCai implements Coder{
    JiuCai (Student stu){
        this.stu = stu;
    }
    private Student stu;
    @Override
    public void code() {
        stu.code();
        System.out.println("JavaEE");
        System.out.println("SprintBoot");
    }
}

使用指定被码表读写字符

utf8格式写到gbk中, 乱码

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class Demo10_UTF8 {
    public static void main(String[] args) throws IOException {
        FileReader fr = new FileReader("utf8.txt");
        FileWriter fw = new FileWriter("gbk.txt");
        int b ;
        while (( b=fr.read()) != -1){
            fw.write(b);
        }
        fr.close();
        fw.close();
    }
}
private static void Demo2() throws IOException {
    InputStreamReader isr = new InputStreamReader(new FileInputStream("utf-8.txt"),"utf-8");
    OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("gbk.txt"), "gbk");
    int b ;
    while ( ( b=isr.read()) != -1 ){
        osw.write(b);
    }
    isr.close();
    osw.close();
}
public static void main(String[] args) throws IOException {
    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 b ;
    while ( (b=br.read()) != -1){
        bw.write(b);
    }
    br.close();
    bw.close();

}

练习, 统计字符, 并输出到一个文件中

import java.io.*;
import java.util.Map;
import java.util.TreeMap;

public class Demo11_CalculatorChar {
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader (new FileReader("utf-8.txt"));
        TreeMap<String,Integer> treeMap = new TreeMap<>();

        int b ;
        while ( (b=br.read()) != -1){
            if( treeMap.containsKey(String.valueOf((char)b))){
                treeMap.put(String.valueOf((char)b),treeMap.get(String.valueOf((char)b))+1);
            } else {
                treeMap.put(String.valueOf((char)b), 1);
            }
        }
        br.close();
        BufferedWriter bw = new BufferedWriter(new FileWriter("times.txt"));
        for(Map.Entry<String,Integer> stringIntegerEntry : treeMap.entrySet()){
            if( "\n".equals(stringIntegerEntry.getKey())){
                bw.write(stringIntegerEntry.getValue()+"="+"\\n");
            } else if( " ".equals(stringIntegerEntry.getKey()) ){
                bw.write(stringIntegerEntry.getValue()+"="+"space");
            } else {
                bw.write(stringIntegerEntry.getValue()+"="+stringIntegerEntry.getKey());
            }
            bw.newLine();
        }
        bw.close();
    }
}

模拟软件剩余使用次数

import java.io.*;

public class Demo12_CalculatorTimes {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader("license.txt"));
        String str;
        str = br.readLine();
        br.close();
        int times = Integer.parseInt(str);
        if( times <= 0){
            System.out.println("试用结束, 请购买正版");
        } else if( times > 0){
            System.out.println("还可以使用"+times+"次");
            times = times - 1;
        }
        BufferedWriter bw = new BufferedWriter(new FileWriter("license.txt"));
        bw.write(String.valueOf(times));
        bw.close();
    }
}

递归

public static int demo1(int nu){
    if(nu > 1){
        nu = nu * demo1(nu - 1);
    }
    return nu;
}

递归找.java结尾的文件

import java.io.File;
import java.util.Scanner;

public class Demo14_DiGui2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str;
        while (true){
            if( sc.hasNext()){
                str=sc.nextLine();
                break;
            }
        }
        File file = new File(str);
        if(file.exists()){
            printJavaFile(file);
        } else{
            System.out.println("文件夹不存在");
        }
    }

    private static void printJavaFile(File file) {
        File[] arrayList ;
        arrayList = file.listFiles();
        for(File f : arrayList) {
            if (f.isDirectory()) {
                printJavaFile(f);
            } else if (f.isFile() && f.getName().endsWith(".java")) {
                System.out.println(f.getAbsoluteFile());
            }
        }
    }
}