JAVAEE细细看 进阶 14 - IO总结

IO 总结

1. 字节流

在这里插入图片描述

2. 字符流

在这里插入图片描述

  • IO流总览
    在这里插入图片描述
  • 字节输入流
    在这里插入图片描述
  • 字节输出流
    在这里插入图片描述
  • 字符输入流
    在这里插入图片描述
  • 字符输出流
    在这里插入图片描述
  • 其他流
    在这里插入图片描述
案例一 集合到文件

将一个ArrayList集合中的字符串数据写入到文本文件,要求:每个字符串元素作为文件中的一行数据

// 数组
ArrayList<String> list = new ArrayList<>();
list.add("hello");
list.add("world");
list.add("java");
list.add("中国");
list.add("上海");
list.add("北京");
list.add("hello");
list.add("home,my home.");
list.add("我爱你,中国。");

// 字符流 写
BufferedWriter writer = new BufferedWriter(new FileWriter("myCharStream/fo.txt"));

for(String s: list) {
    writer.write(s);
    writer.newLine(); //换行
writer.flush();
/*
writer.flush();
字符流必须写,因为文章可能很长,超出buffer,数据可能出问题
字节流可写可不写,因为底层有做特殊的操作
特殊的,
如果在未flush或者close前重新new  BufferedWriter()就会把原来的缓冲区覆盖。
 */
}

writer.close();

案例二 文件到集合
// 创建存储器
ArrayList<String> list = new ArrayList<>();

// 创建缓存流,字符流 读
BufferedReader reader = new BufferedReader(new FileReader("myCharStream/fo.txt"));

// 读
String s;
while ((s = reader.readLine()) != null) {
    list.add(s);
}

System.out.println(list);

reader.close();

案例三 点名器

我有一个文件里面存储了班级同学的姓名,每一个姓名占一行,要求通过程序实现随点名器

// 存储器
ArrayList<String> list = new ArrayList<>();

// 缓冲流 字符流 读
BufferedReader reader = new BufferedReader(new FileReader("myCharStream/fo.txt"));

String s;
while ((s = reader.readLine()) != null) {
    list.add(s);
}
reader.close();

// 随机选一个
Random r = new Random();
int k = r.nextInt(list.size());

System.out.println(list.get(k));

案例四 学生数据写入到文本文件

把ArrayList集合中的学生数据写入到文本文件。要求:每一个学生对象的数据作为文件中的一行数据
格式:学号,姓名,年龄,居住地 举例:itheima001,林青霞,30,西安

// 创建数据
ArrayList<Student> list = new ArrayList<>();

// 写数据
BufferedWriter writer = new BufferedWriter(new FileWriter("myCharStream/fo.txt"));

// 填充数据
list.add(new Student("001","张三",12,"广东"));
list.add(new Student("002","李四",10,"上海"));
list.add(new Student("003","王五",8,"北京"));
list.add(new Student("004","赵柳",7,"深圳"));
list.add(new Student("005","张丽颖",9,"郑州"));
list.add(new Student("006","王昭君",5,"西安"));
list.add(new Student("007","张飞",18,"成都"));
list.add(new Student("008","赵云",81,"云南"));

for (Student s: list) {

    // 编辑内容
    String content = s.getSid() + "," + s.getName() + "," + s.getAge() + "," + s.getAddress();

    // 写
    writer.write(content);
    writer.newLine();        // 换行
    writer.flush();          // 刷新
}

// 关闭
writer.close();
案例五 文件到数组

需求:把文本文件中的数据读取到集合中,并遍历集合。要求:文件中每一行数据是一个学生对象的成员变量值
举例:itheima001,林青霞,30,西安

// 创建接收的集合
ArrayList<Student> list = new ArrayList<>();

// 读
BufferedReader reader = new BufferedReader(new FileReader("myCharStream/fo.txt"));

String s;
while ((s = reader.readLine()) != null) {

    // 将字符串切为数组
    String[] tmp = s.split(",");
    if (tmp.length == 4){

        // 创建对象,并存到list中
        String sid     = tmp[0];
        String name    = tmp[1];
        int    age     = Integer.parseInt(tmp[2]);
        String address = tmp[3];
        Student stu = new Student(sid, name, age, address);
        list.add(stu);

    } else {

        System.out.println("数据错误!!!");
        System.out.println(s);
        System.out.println("--------");

    }
}

// 关闭
reader.close();

// 遍历
for (Student stu: list) {
    System.out.println(stu);
}

案例六

键盘录入5个学生信息(姓名,语文成绩,数学成绩,英语成绩)。要求按照成绩总分从高到低写入文本文件
格式:姓名,语文成绩,数学成绩,英语成绩 举例:林青霞,98,99,100

思路:
1:定义学生类
2:创建TreeSet集合,通过比较器排序进行排序
3:键盘录入学生数据
4:创建学生对象,把键盘录入的数据对应赋值给学生对象的成员变量
5:把学生对象添加到TreeSet集合
6:创建字符缓冲输出流对象
7:遍历集合,得到每一个学生对象
8:把学生对象的数据拼接成指定格式的字符串
9:调用字符缓冲输出流对象的方法写数据
10:释放资源

案例七
// 在当前模块目录下,有一个“maths.txt”文件,其中的文本内容如下:
//        5+5
//        10-5
//        2*3
//        20/4
//        ...
//        每行一个算术表达式,每个式子都是使用加减乘除符号连接的两个数字,没有其他数据。 请编写程序将每个式子的结果计算出来,再写回这个文件中。程序执行后,文件中的内容为:
//        5+5=10
//        10-5=5
//        2*3=6
//        20/4=5
//        ...

import java.io.*;
import java.time.Instant;
import java.util.ArrayList;

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

        // 源数据 目标路径
        String fileName = "/Users/thor/Desktop/maths.txt";
        // 创建源数据
        createdTXT(fileName);

        // 生成答案数据
        String fileName_answer = "/Users/thor/Desktop/maths_answer.txt";
        txt_answer(fileName_answer, fileName);

    }

    // 读、计算、写
    public static void txt_answer(String fileName, String srcFileName) throws IOException {
        // 读数据
        BufferedReader reader = new BufferedReader(new FileReader(srcFileName));
        // 写数据
        BufferedWriter writer = new BufferedWriter(new FileWriter(fileName));

        // 读写
        String s;
        while ((s = reader.readLine()) != null) {

            // 解析
            String reslut = analysisData(s);

            // 写
            writer.write(reslut);
            writer.newLine();
            writer.flush();
        }

        // 关闭
        writer.close();
    }

    // 分析数据
    public static String analysisData(String s) {

        String[] arr = s.split("[-+*/%]");

        // 屏蔽错误 - 运算符个数不为 1
        if (arr.length != 2) {
            return "内容不合法:" + s;
        }

        // 屏蔽错误 - 运算符两边不为数字
        int fir = 0;
        int sec = 0;
        try {
            fir = Integer.parseInt(arr[0]);
            sec = Integer.parseInt(arr[1]);
        } catch (NumberFormatException e) {
            return "内容不合法:" + s;
        }

        // 计算
        int result = 0;
        if (s.contains("+")) {         // +
            result = fir + sec;
        } else if (s.contains("-")) {   // -
            result = fir - sec;
        } else if (s.contains("*")) {   // *
            result = fir * sec;
        } else if (s.contains("/")) {   // /
            result = fir / sec;
        } else if (s.contains("%")) {   // %
            result = fir % sec;
        }

        return s + "=" + result;
    }

    // 创建数据源
    public static void createdTXT(String fileName) throws IOException {

        // 数据源
        ArrayList<String> al = new ArrayList<>();

        // 添加数据
        al.add("5+5");
        al.add("10-5");
        al.add("2*3");
        al.add("6/2");
        al.add("6*3");
        al.add("8+2");
        al.add("9*9");
        al.add("99");
        al.add("kk");
        al.add("+k");
        al.add("+我");
        al.add("们+我");
        al.add("们+我+");
        al.add("们+我+你");
        al.add("2=4");
        al.add("1+2=4");
        al.add("1 +2");
        al.add("。+2");
        al.add("a+2");

        // 写到文件中
        // 字符缓存流
        BufferedWriter writer = new BufferedWriter(new FileWriter(fileName));

        // 写
        for (String s : al) {
            writer.write(s);
            writer.newLine();
            writer.flush();
        }

        // 关闭
        writer.close();
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值