Java入门(四十一)

字符缓冲流

  • 字符缓冲流用来提高读写的效率。
  • 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集合中的字符串数据写入到文本文件。要求:每一个字符串元素作为文件中的一行数据
  • 思路:
  1. 创建ArrayList集合
  2. 往集合中存储字符串元素
  3. 创建字符缓冲输出流对象
  4. 遍历集合,得到每一个字符串数据
  5. 调用字符缓冲输出流对象的方法写数据
  6. 释放资源
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。
  • 思路:
  1. 创建字符缓冲输入流对象
  2. 创建ArrayList集合对象
  3. 调用字符缓冲输入流对象的方法读数据
  4. 把读取到的字符串数据存储到集合中
  5. 释放资源
  6. 遍历集合
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方法,根据索引去获取学生的姓名。
  • 思路
  1. 创建字符缓冲输入流对象
  2. 创建ArrayList集合对象
  3. 调用字符缓冲输入流对象的方法读数据
  4. 把读取到的字符缓冲输入流对象的方法读数据
  5. 释放资源
  6. 使用Random产生一个随机数,随机数的范围在:[0,集合的长度]
  7. 把第6步产生的随机数作为索引到ArrayList集合中获取值
  8. 把第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,西安
  • 思路
  1. 定义学生类
  2. 创建ArrayList集合
  3. 创建学生类
  4. 把学生对象添加到集合中
  5. 创建字符缓冲输出流对象
  6. 遍历集合,得到每一个学生对象
  7. 把学生对象的数据拼接成指定格式的字符串
  8. 调用字符缓冲输出流对象的方法写数据
  9. 释放资源
  • 首先定义一个学生类,四个属性: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();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值