字符缓冲流
- 字符缓冲流用来提高读写的效率。
- BufferedReader,从字符输入流读取文本,缓冲字符,以提供字符、数组和行的高效读取。可以指定缓冲区大小,或者可以使用默认大小。
- 他的构造方法 参数里面Reader可以是FileInputReader,也可以是StreamInputReader
- 另外一个对应的类BufferedWriter,将文本写入字符输出流,缓冲字符,以提供单个字符、数组和字符串的高效写入。
BufferedWriter bw = new BufferedWriter(new FileWriter("/home/ding/IdeaProjects/Study/src/com/itheima_02/file/bw.txt"));
bw.write("hello");
bw.write("world");
bw.close();
BufferedReader br = new BufferedReader(new FileReader("/home/ding/IdeaProjects/Study/src/com/itheima_02/file/bw.txt"));
int ch;
while((ch=br.read())!=-1){
System.out.print((char)ch);
}
br.close();
char[] chs = new char[1024];
int len;
while((len=br.read(chs))!=-1){
System.out.println(new String(chs,0,len));
}
字符流 复制Java文件(字符缓冲流改进版)
import java.io.*;
public class CopyJavaDemo01 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("/home/ding/IdeaProjects/Study/src/com/itheima_02/file/ConversionStreamDemo.java"));
BufferedWriter bw = new BufferedWriter(new FileWriter("/home/ding/IdeaProjects/Study/src/com/itheima_02/file/Copy.java"));
int ch;
while((ch=br.read())!=-1){
bw.write(ch);
}
br.close();
bw.close();
}
}
char[] chs = new char[1024];
int len;
while((len=br.read(chs))!=-1){
bw.write(chs,0,len);
}
字符缓冲流的特有功能
- BufferedWriter: void newLine() 写一行行分隔符,行分隔符字符串由系统属性定义。
- BufferedReader: public String readLine(): 读一行文字。结果包含行的内容的字符串,不包括任何行终止字符,如果流的结尾已经到达,则为null。
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class BufferedStreamDemo02 {
public static void main(String[] args) throws IOException {
//创建字符缓冲输出流
BufferedWriter bw = new BufferedWriter(new FileWriter("/home/ding/IdeaProjects/Study/src/com/itheima_02/file/bw.txt"));
//写数据
for(int i = 0; i < 10 ; i++){
bw.write("hello" + i);
bw.write("\n");
}
//释放资源
bw.close();
}
}
- 这种写法能够换行,但不适用于所有系统,所以该类提供了一个newLine方法。
bw.newLine();
bw.flush();
- 输入流
BufferedReader br = new BufferedReader(new FileReader("/home/ding/IdeaProjects/Study/src/com/itheima_02/file/bw.txt"));
// readLine()
String line = br.readLine();
System.out.println(line);
- 读的内容超出范围就会返回null
- 采用循环的方式改进
String line;
while((line=br.readLine())!=null){
System.out.print(line);
}
- 由于读取的时候不包含终止符,所以不换行
- 所以把 print() 换成 println() 。
复制Java文件(字符缓冲流特有功能改进版)
- 读写数据,复制文件:使用字符缓冲流特有功能实现。
import java.io.*;
public class CopyJavaDemo02 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("基础语法/src/io/ConversionStreamDemo.java"));
BufferedWriter bw = new BufferedWriter(new FileWriter("基础语法/src/io/Copy.java"));
//使用字符缓冲流特有功能实现
String line;
while((line=br.readLine())!=null){
bw.write(line);
}
bw.close();
br.close();
}
}
- 文件的内容整个都在一行上,readLine只读数据不读换行符
while((line=br.readLine())!=null){
bw.write(line);
bw.newLine();
bw.flush();
}
IO流小结
- 字节流可以复制任何文件数据,有4种方式,一般采用字节缓冲流一次读写一个字节数组的方式。
- 字符流只能复制文本数据,有5种方式,一般采用字符缓冲流的特有功能。
集合到文件
- 把ArrayList集合中的字符串数据写入到文本文件。要求:每一个字符串元素作为文件中的一行数据
- 思路:
- 创建ArrayList集合
- 往集合中存储字符串元素
- 创建字符缓冲输出流对象
- 遍历集合,得到每一个字符串数据
- 调用字符缓冲输出流对象的方法写数据
- 释放资源
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
public class ArrayListToTxtDemo {
public static void main(String[] args)throws IOException {
//创建ArrayList集合
ArrayList<String> array = new ArrayList<String>();
//往集合中添加字符串元素
array.add("hello");
array.add("world");
array.add("java");
//创建字符缓冲输出流对象
BufferedWriter bw = new BufferedWriter(new FileWriter("基础语法/src/io/array.txt"));
//遍历集合,得到每一个字符串的数据
for(String s : array){
//调用字符缓冲输出流对象的方法写数据
bw.write(s);
bw.newLine();
bw.flush();
}
bw.close();
}
}
文件到集合
- 需求:把文本文件中的数据读取到集合中,并遍历集合。要求:文件中每一行数据是一个集合元素。这个方法在BufferedReader,所以我们要使用字符缓冲输入流。而我们读到的是String类型,所以泛型也应该是String。
- 思路:
- 创建字符缓冲输入流对象
- 创建ArrayList集合对象
- 调用字符缓冲输入流对象的方法读数据
- 把读取到的字符串数据存储到集合中
- 释放资源
- 遍历集合
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
public class TxtToArrayListDemo {
public static void main(String[] args) throws IOException {
//创建字符缓冲输入流对象
BufferedReader br = new BufferedReader(new FileReader("基础语法/src/io/array.txt"));
//创建ArrayList集合对象
ArrayList<String> array = new ArrayList<String>();
//调用字符缓冲输入流对象的方法读数据
String line;
while((line=br.readLine())!=null){
//把读取到的字符串存储到集合中
array.add(line);
}
//释放资源
br.close();
//遍历集合
for(String s : array){
System.out.println(s);
}
}
}
点名器
- 需求:我有一个文件里面存储了班级同学的姓名,每一一个姓名占一行,要求通过程序实现随机点名器。
- 集合ArrayList是由索引的,随机产生一个索引,索引的范围在集合长度范围内,每一次根据他随机产生的索引,通过他集合调用get方法,根据索引去获取学生的姓名。
- 思路
- 创建字符缓冲输入流对象
- 创建ArrayList集合对象
- 调用字符缓冲输入流对象的方法读数据
- 把读取到的字符缓冲输入流对象的方法读数据
- 释放资源
- 使用Random产生一个随机数,随机数的范围在:[0,集合的长度]
- 把第6步产生的随机数作为索引到ArrayList集合中获取值
- 把第7步得到的数据输出在控制台
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Random;
public class CallName {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("基础语法/src/io/name.txt"));
ArrayList<String> array = new ArrayList<String>();
String line;
while((line=br.readLine())!=null){
array.add(line);
}
br.close();
Random r = new Random();
int index = r.nextInt(array.size());
String name = array.get(index);
System.out.println("幸运者是:"+name);
}
}
集合到文件的改进版
- 把ArrayList集合中的学生数据写入到文本文件。要求:每一个学生对象的数据作为文件中的一行数据格式:学号,姓名,年龄,居住地 举例:itheima001,林青霞,30,西安
- 思路
- 定义学生类
- 创建ArrayList集合
- 创建学生类
- 把学生对象添加到集合中
- 创建字符缓冲输出流对象
- 遍历集合,得到每一个学生对象
- 把学生对象的数据拼接成指定格式的字符串
- 调用字符缓冲输出流对象的方法写数据
- 释放资源
- 首先定义一个学生类,四个属性:sid , name, age,address
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
public class ArrayListToFileDemo {
public static void main(String[] args) throws IOException {
ArrayList<Student> array = new ArrayList<Student>();
Student s1 = new Student("itheima001","林青霞",30,"西安");
Student s2 = new Student("itheima002","张曼玉",35,"武汉");
Student s3 = new Student("itheima003","王祖贤",33,"郑州");
array.add(s1);
array.add(s2);
array.add(s3);
BufferedWriter bw = new BufferedWriter(new FileWriter("基础语法/src/io/studnets.txt"));
for(Student s : array){
StringBuilder sb = new StringBuilder();
sb.append(s.getSid()).append(",").append(s.getName()).append(",").append(s.getAge()).append(",").append(s.getAddress());
bw.write(sb.toString());
bw.flush();
}
bw.close();
}
}