字符流---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();
    }

}

结果截图:
这里写图片描述

注意:在操作字符流的时候要注意编码的问题。这里读取的文件是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();
    }
}

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

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>

版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值