Java高级_Day13(字符缓冲流,IO流小结)
字符缓冲流
BufferedWriter:
将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入。
可以指定缓冲区大小,或者可以接受默认大小。 默认值足够大,可用于大多数用途。
创建对象
BufferedWriter(Writer out)
创建使用默认大小的输出缓冲区的缓冲字符输出流。
BufferedWriter(Writer out, int sz)
创建一个新的缓冲字符输出流,使用给定大小的输出缓冲区。
常见方法:
返回值类型 | 方法 |
---|---|
void | close() 关闭流,先刷新。 |
void | flush() 刷新流。 |
void | newLine() 写一行行分隔符。 |
void | write(char[] cbuf, int off, int len) 写入字符数组的一部分。 |
void | write(int c) 写一个字符 |
void | write(String s, int off, int len) 写一个字符串的一部分。 |
BufferedReader:
从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取。
可以指定缓冲区大小,或者可以使用默认大小。 默认值足够大,可用于大多数用途。
BufferedReader(Reader in)
创建使用默认大小的输入缓冲区的缓冲字符输入流。
BufferedReader(Reader in, int sz)
创建使用指定大小的输入缓冲区的缓冲字符输入流。
返回值类型 | 方法 |
---|---|
void | close() 关闭流并释放与之相关联的任何系统资源。 |
int | read() 读一个字符 |
int | read(char[] cbuf, int off, int len) 将字符读入数组的一部分。 |
String | readLine() 读一行文字。 |
缓冲流的使用:
public static void main(String[] args) throws IOException {
// 创建缓冲流对象
// File file = new File("day_13_IODemo\\dir\\buff.txt");
// Writer out = new FileWriter(file);
// BufferedWriter bw = new BufferedWriter(out);
BufferedWriter bw = new BufferedWriter(new FileWriter("day_13_IODemo\\\\dir\\buff.txt"));
// bw.write("hello\r\n"); //自己完成换行的操作,但是\r\n仅使用于windows系统
// bw.write("world\r\n");
// bw.write("java\r\n");
bw.write("hello");
bw.newLine();// 由jdk自动根据系统判定,在行末写出行分隔符
bw.write("world");
bw.newLine();
bw.write("java");
bw.newLine();
bw.close();
//读数据
BufferedReader br = new BufferedReader(new FileReader("day_13_IODemo\\\\dir\\buff.txt"));
// char[] buff = new char[1024];//传统的读的方式
// int len;
// while((len=br.read(buff))!= -1){
// System.out.println(new String(buff,0,len));
// }
//使用BufferedReader的特有的读的方式,每次读取一行readLine
String str ;
while((str = br.readLine()) != null){
System.out.println(str);
}
}
使用缓冲流实现文件的拷贝:
public static void main(String[] args) throws IOException {
// 创建字符输入流 读
BufferedReader br = new BufferedReader(new FileReader("day_13_IODemo\\dir\\BufferedDemo.java"));
//创建字符输出流 写
BufferedWriter bw = new BufferedWriter(new FileWriter("day_13_IODemo\\dir\\Demo.java"));
// 读写操作
// 方式一:
/*char[] cbuff = new char[1024];
int len;
while((len= br.read(cbuff)) != -1){
bw.write(cbuff,0,len);
}*/
//方式二:
String str ;
while( (str = br.readLine())!= null){//readLine 在读取的时候是遇到行分隔符就结束,因此在他读取的内容中没有行分隔符
bw.write(str);
bw.newLine();//每次写完之后不要忘记写行分隔符
}
// 释放资源
bw.close();
br.close();
}
IO流小结
字节流:
字符流:
案例:
- 集合到文件【应用】
需求:把ArrayList集合中的字符串数据写入到文本文件。要求,每一个字符串元素作为文件中的一行数据
public static void main(String[] args) throws IOException {
//创建集合
List<String> list = new ArrayList<>();
//创建输出流
BufferedWriter bw = new BufferedWriter(new FileWriter("Java_13\\dir\\list.txt"));
//添加元素
list.add("java");
list.add("lanqiao");
list.add("中北");
//获取数据
Iterator<String> iter = list.iterator();
while (iter.hasNext()){
String str = iter.next();
bw.write(str);
bw.newLine();
}
//释放资源
bw.close();
}
- 文件到集合【应用】
需求:把文本文件中的数据读取到集合中,并遍历集合。要求:文件中每一行数据是一个集合元素
public static void main(String[] args) throws IOException {
//创建集合
List<String> list = new ArrayList<>();
//创建输入流
BufferedReader br = new BufferedReader(new FileReader("Java_13\\dir\\list.txt"));
//从文件读取数据
String str ;
while((str = br.readLine()) != null){
list.add(str);
}
//释放资源
br.close();
//遍历集合
for(String st :list){
System.out.println(st);
}
}
- 点名器【应用】
需求:有一个文件里面存储了班级同学的姓名,每一个姓名占一行,要求通过程序实现随机点名器
public static void main(String[] args) throws IOException {
//创建输入流
BufferedReader br = new BufferedReader(new FileReader("Java-13\\dir\\names.txt"));
//创建集合
List<String> list = new ArrayList<>();
//读取文件
String str;
while((str = br.readLine()) != null){
list.add(str);
}
//释放资源
br.close();
//随机点名
int index = new Random().nextInt(list.size());
System.out.println(list.get(index));
}
- 集合到文件(数据排序改进版)
需求:键盘录入5个学生信息(姓名,语文成绩,数学成绩,英语成绩)。要求按照成绩总分从高到低写入文本文件
格式:姓名,语文成绩,数学成绩,英语成绩 举例:林青霞,98,99,100
public class StudentSort2Txt {
public static void main(String[] args) throws IOException {
// 采用TreeSet集合
TreeSet<Stu> set = new TreeSet<>(new Comparator<Stu>() {
@Override
public int compare(Stu s1, Stu s2) {
return s1.sum() - s2.sum();
}
});
//从键盘录入5个学生姓名及成绩
for(int i = 0 ; i < 5 ; i++){
Scanner sc = new Scanner(System.in);
System.out.println("请录入第" + (i+1)+"个学生信息");
System.out.println("姓名:");
String name = sc.nextLine();
System.out.println("语文成绩:");
int chinese = sc.nextInt();
System.out.println("数学成绩:");
int math = sc.nextInt();
System.out.println("英语成绩:");
int english = sc.nextInt();
Stu stu = new Stu(name,chinese,math,english);
set.add(stu);
}
// 将集合中的数据写出到文件
BufferedWriter bw = new BufferedWriter(new FileWriter("day_13_IODemo\\stuSort.txt"));
for (Stu stu : set){
//需要实现字符串的拼接
StringBuffer sb = new StringBuffer();
sb.append(stu.getName());
sb.append("-");
sb.append(stu.getChinese());
sb.append("-");
sb.append(stu.getMath());
sb.append("-");
sb.append(stu.getEnglish());
bw.write(sb.toString());
bw.newLine();
}
bw.close();
}