字符流---IO学习笔记(三)

字符流:

文本和文本文件的区别:
文本:
java的文本(char)是16位无符号整数,是字符的unicode编码(双字节编码)。
文件:
文件是byte byte byte…的数据序列。
文本文件:
文本文件是文本(char)序列按照某种编码方案(utf-8,utf-16be,gbk)序列化为byte的存储结果。

字符流(Reader,Writer)
操作的是文本文件。对于mp3,二进制文件是字节文件不适合用字符流读取,因为读取出来的是char,没有意义。
字符的处理,一次处理一个字符
字符的底层仍然是基本的字节序列

字符流(字节字符转换流)的基本实现:
InputStreamReader:
完成byte流解析为char流,按照编码解析
OutputStreamWriter:
提供char流到byte流,按照编码处理

字符流的基本方法的使用:

package com.test.FileInputStreamReader;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class FileInputStreamReaderTest {

    public static void main(String[] args){
        try {
            String filename = "C:\\Users\\Administrator\\Desktop\\javaIO\\读取的测试文件.txt";
            ReadFile1(filename);
            ReadFile2(filename);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /** * 单字符读取 * 返回的是读到字节转换成int类型(最后8位)的值 * @param fis */
    public static void ReadFile1(String filename) throws IOException{
        System.out.println("单字节读取的方式:");
        InputStreamReader isr = new InputStreamReader(new FileInputStream(filename));//默认的是项目的编码(这里是gbk)
// InputStreamReader isr = new InputStreamReader(fis, "gbk");
        int i;
        while((i = isr.read())!=-1){
            System.out.print((char)i);
        }
        isr.close();
    }

    /** * 批量读取 * 放入buf这个字符数组中,从第0个位置开始放置,最多放buf.length个 * 返回的是读到字符的个数 * @param fis * @throws IOException */
    public static void ReadFile2(String filename) throws IOException{
        System.out.println();
        System.out.println("批量读取的方式:");
        InputStreamReader isr = new InputStreamReader(new FileInputStream(filename));//默认的是项目的编码(这里是gbk)
        char[] buf = new char[2*1024];
        int i;
        while((i = isr.read(buf, 0, buf.length))!=-1){
// //第一种转换成字符的方式
// for(int j = 0;j<i;j++){
// System.out.print((char)buf[j]);
// }
            //第二种转换成字符串的方式
            String str = new String(buf,0,i);
            System.out.println(str);

        }
        isr.close();
    }

}

结果截图:
字符流---IO学习笔记(三)_第1张图片

注意:在操作字符流的时候要注意编码的问题。这里读取的文件是gbk编码格式的,所以在读取的时候要采用gbk编码的读取方式。否则就会出现乱码。

FileWriter和FileReader:
其实上边的代码中的:
InputStreamReader isr = new InputStreamReader(new FileInputStream(String filename));
这部分代码完全可以使用
FileReader fr = new FileReader(String filename);
来替代。
FileReader和FileWriter的基本方法的使用:

package com.test.FileReaderAndFileWriter;

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

public class FileReaderAndFileWriterTest{

    public static void main(String[] args) throws IOException{

        FileReader fr = new FileReader("C:\\Users\\Administrator\\Desktop\\javaIO\\读取的测试文件.txt");//缺点:不过这里只能识别项目默认的编码不能设置其他的编码,如果读取的文件编码不是项目默认的编码,读取时就会出现乱码
        FileWriter fw = new FileWriter("C:\\Users\\Administrator\\Desktop\\javaIO\\写出的测试文件.txt");
        char[] buf = new char[2*1024];
        int i;
        while((i = fr.read(buf, 0, buf.length))!=-1){
            fw.write(buf, 0, i);
            fw.flush();
        }

        fr.close();
        fw.close();
    }


}

注意:FileReader和FileWriter与之前的代码中通过InputStreamReader包装FileInputStream相比,虽然简洁,但是不能设置采用什么编码读取文件,只能使用项目默认的编码读取文件。

字符流的过滤器:
BufferedReader——>readLine 一次读一行
BufferedWriter/PrintWriter———>写一行

package com.test.BufferedReaderAndBufferedWriter;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;

public class BufferedReaderTest {

    public static void main(String[] args){
        String filename = "C:\\Users\\Administrator\\Desktop\\javaIO\\读取的测试文件.txt";
        try {
            BufferedWriter(filename);
            PrintWriter(filename);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /** * 使用BufferedWriter写出 * @throws IOException */
    public static void BufferedWriter(String filename) throws IOException{
        BufferedReader br = new BufferedReader(
                new InputStreamReader(
                        new FileInputStream(
                                filename)));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("C:\\Users\\Administrator\\Desktop\\javaIO\\测试文件1.txt")));


        String line;
        while((line = br.readLine())!=null){//但是这里的readLine并不识别换行符
            System.out.println(line);
// bw.write(line);//写出的文件内容没有进行换行
// bw.write(line+"\r\n");//这里再写出文件的时候要单独写出换行操作

            bw.write(line);
            bw.newLine();//换行操作
            bw.flush();
        }

        br.close();
        bw.close();
    }

    /** * 使用PrintWriter写出 * @param filename * @throws IOException */
    public static void PrintWriter(String filename) throws IOException{
        BufferedReader br = new BufferedReader(
                new InputStreamReader(
                        new FileInputStream(
                                filename)));
        PrintWriter pw = new java.io.PrintWriter("C:\\Users\\Administrator\\Desktop\\javaIO\\测试文件2.txt");

        String line;
        while((line = br.readLine())!=null){
            pw.println(line);
            pw.flush();
        }
        br.close();
        pw.close();
    }
}

上边这两种写出文件的方法的效果是一样的。

你可能感兴趣的:(java,字符流)