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