Java中的IO流(二)

发布时间 2023-11-10 17:45:05作者: news_one

一、前言

前面我们讲解了如何使用字节流输入以及输出流,还有如何复制文件的操作,
今天我们讲解一下如何使用字符流。

字符流的一些基本知识点:

package file.charStream;

import java.io.UnsupportedEncodingException;
import java.util.Arrays;

public class StringDemo {
    public static void main(String[] args) throws UnsupportedEncodingException {
        //定义一个字符串
        String s = "中国";

        byte[] bys = s.getBytes();//[-28, -72, -83, -27, -101, -67]
        byte[] bys1 = s.getBytes("GBK");//[-42, -48, -71, -6]

        String ss = new String(bys,"UTF-8");
        System.out.println(ss);

    }
}

字符输出流

package file.charStream;

import java.io.*;

public class OutputStreamWriteDemo {
    public static void main(String[] args) throws IOException {
        if(!new File("myCharStream").exists()){
            new File("myCharStream").mkdirs();
//            new File("myCharStream\\a.txt").createNewFile();
        }
        FileWriter fw = new FileWriter("myCharStream//a.txt");
        fw.write(97);
        fw.write(98);
        fw.write(99);

        //void write(char[] cbuf): 写入一个字符数组
        char[] chs = {'a','b','c','d','e'};
        fw.write(chs);

        //void write(char[] cbuf, int off, int len): 写入字符数组的一部分
        fw.write(chs,0,chs.length);
        fw.write(chs,1,3);

        //void write(String str):写一个字符串
        fw.write("abcde");

        //void write(String str, int off, int len): 写一个字符串的一部分
        fw.write("abcde",0,"abcde".length());
        fw.write("abcde",1,3);

        //释放资源
        fw.close();

//        //读取文件中有几个字符?
//        FileInputStream bis = new FileInputStream("myCharStream\\a.txt");
//        byte[] bys = new byte[1024];
//        int len;
//        while((len = bis.read(bys))!= -1){
//            System.out.println(new String(bys,0,len).length());
//        }
    }
}

字符输入流

package file.charStream;

import java.io.FileReader;
import java.io.IOException;

public class InputStreamReaderDemo {
    public static void main(String[] args) throws IOException {
        FileReader fr = new FileReader("myCharStream\\a.txt");
        //第一种方法: in read(): 一次读一个字符数据
        int ch;
        while ((ch=fr.read()) != -1) {
            System.out.print((char)ch);
        }

        //第二种方法: int read(char[] cbuf): 一次读取一个字符数组数据
        char[] chs = new char[1024];
        int len;
        while((len = fr.read(chs))!=-1){
            System.out.println(new String(chs,0,len));
        }

        //释放资源
        fr.close();

    }
}

字符缓冲输入流和字符缓冲输出流

案例一:
package file.charStream;

import java.io.*;

public class BufferedStreamDemo01 {
    public static void main(String[] args) throws IOException {
        //BufferedWriter(Writer out)
        BufferedWriter bw = new BufferedWriter(new
                FileWriter("myCharStream\\bw.txt"));
        bw.write("hello\r\n");
        bw.write("world\r\n");
        bw.close();

        //BufferedReader(Reader in)
        BufferedReader br = new BufferedReader(new
                FileReader("myCharStream\\bw.txt"));


        //一次读取一个字符数据
        int ch;
        while((ch = br.read())!= -1){
            System.out.println((char)ch);
        }

        //一次读取一个字符数组数据
        char[] chs = new char[1024];
        int len;
        while((len = br.read(chs))!=-1){
            System.out.println(new String(chs,0,len));
        }
        br.close();
    }
}
案例二:
package file.charStream;

import java.io.*;

public class BufferedStreamDemo02 {
    public static void main(String[] args) throws IOException {
        //创建字符缓冲输出流
        BufferedWriter bw = new BufferedWriter(new
                FileWriter("myCharStream\\bw.txt"));
        for(int i = 0; i < 10; i++){
            bw.write("hello" + i);
            bw.newLine();//这是什么意思
            bw.flush();
        }

        //释放资源
        bw.close();

        //创建字符缓冲输入流
        BufferedReader br = new BufferedReader(new
                FileReader("myCharStream\\bw.txt"));

        String line;
        while((line = br.readLine())!= null){
            System.out.println(line );
        }

        bw.close();
    }
}

应用:

package file.charStream;

import java.io.*;
import java.util.Arrays;

/*
案例需求
    使用字符缓冲流读取文件中的数据,排序后再次写到本地文件
实现步骤
    将文件中的数据读取到程序中
    对读取到的数据进行处理
    将处理后的数据添加到集合中
    对集合中的数据进行排序
    将排序后的集合中的数据写入到文件中
*/
public class CharStreamDemo2 {
    public static void main(String[] args) throws IOException {
        //需求:读取文件中的数据,排序后再次写到本地文件
        //分析:
        //1、要把文件中的数据读取进来
        BufferedReader br = new BufferedReader(new FileReader("myCharStream\\sort.txt"));

        //输出流一定不能写在这里,因为会清空文件中的内容
        //BufferedWriter bw = new BufferedWriter(new FileWriter("myCharStream\\sort.txt"));

        String line = br.readLine();
        System.out.println("读取到的数据为:" + line);
        br.close();


        //2、按照空格进行切割
        String[] split = line.split(" ");//9 1 2 5 3 10 4 6 7 8
        //3、字符串类型的数组变成int类型
        int[] arr = new int[split.length];
        //遍历split数组,可以进行类型转换
        for(int i = 0; i < split.length; i++){
            String smallStr = split[i];
            //类型转换
            int number = Integer.parseInt(smallStr);

            //把转换后的结果存入到arr中
            arr[i] = number;
        }
        //4、排序
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));

        //把排序之后的结果写回到本地
        BufferedWriter bw = new BufferedWriter(new FileWriter("myCharStream\\sort.txt"));
        //写出
        for(int i = 0; i < arr.length; i++){
            bw.write(arr[i] + " ");
            bw.flush();
        }

        //释放资源
        bw.close();
    }
}