75. InputStreamReader和OutputStreamWriter(转换流--字节流转换成字符流)

转换流:

InputStreamReader   输入字节流转换成输入字符流
OutputStreamWriter  输出字节流转换成输出字符流

总结:就是字节流转换成字符流,但是不能字节流转换成字节流(联想记忆----只有屌丝想变成高富帅,没有高富帅想变成屌丝)

应用场景:
    在以后开发中中我们免不了使用别人的工具,如果别人就是返回一个字节流,但是你想用字符流,这个时候我们就可以使用转换流来把字节流转换成字符流

下面是一些实例演示:

把字节流转换成字符流,并实现读写

public class Demo3 {
    public static void main(String[] args) throws IOException {
        writeText();
        readText();
    }

    public static void readText() throws IOException {
        File file = new File("D:\\新建文件夹\\a.txt");
        FileInputStream fileInputStream = new FileInputStream(file);
        //输入字节流转换成输入字符流
        InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream);

        char[] cs = new char[1024];
        int length = 0;
        while((length = inputStreamReader.read(cs))!=-1) {
            System.out.println(new String(cs,0,length));
        }
        inputStreamReader.close();
    }

    public static void writeText() throws IOException {
        File file = new File("D:\\新建文件夹\\a.txt");
        FileOutputStream fileOutputStream = new FileOutputStream(file);
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream);
        outputStreamWriter.write("你好,陌生人");
        outputStreamWriter.close();
    }
}

把字节流转换成字符流后用字符流的缓存类实现读写

public class Demo4 {
    public static void main(String[] args) throws IOException {
        readText();
        writeText();
    }

    public static void readText() throws IOException {
        File file = new File("D:\\新建文件夹\\a.txt");
        FileOutputStream fileInputStream = new FileOutputStream(file);
        //输出字节流转换成输入字符流
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileInputStream);
        //使用输出字符流的缓存类
        BufferedWriter bufferedReader = new BufferedWriter(outputStreamWriter);
        //一行一行存
        bufferedReader.write("这是第一行数据");
        bufferedReader.newLine();
        bufferedReader.write("这是第二行数据");

        bufferedReader.close();

    }

    public static void writeText() throws IOException {
        File file = new File("D:\\新建文件夹\\a.txt");
        FileInputStream fileInputStream = new FileInputStream(file);
        //输入字节流转换成输入字符流
        InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream);
        //使用输入字符流的缓存类
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
        String line = null;
        //一行一行读取文本
        while((line = bufferedReader.readLine())!=null) {
            System.out.println(line);
        }
        bufferedReader.close();
    }
}

把字节流转换成字符流并指定码表进行读写数据

注意:记事本值存储和我们从记事本获取数据的都是码值,并不是我们输入时的字符,只不过我们在打开记事本的时候记事本自动给我们解码了,也就是我们看的懂得字符,上面我们没有指定码表,实际上是读写时使用的是默认的编码表gbk(java中默认码表)

public class Demo5 {
    public static void main(String[] args) throws IOException {
        writeText();
        readText();
    }

    public static void writeText() throws IOException {
        File file = new File("D:\\新建文件夹\\a.txt");
        FileOutputStream fileOutputStream = new FileOutputStream(file);
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream, "iso8859-1");
        outputStreamWriter.write("你好!!!");
        outputStreamWriter.close();
    }

    public static void readText() throws IOException {
        File file = new File("D:\\新建文件夹\\a.txt");
        FileInputStream fileInputStream = new FileInputStream(file);
        InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream,"iso8859-1");
        char[] cs = new char[1024];
        int length = 0;
        while((length = inputStreamReader.read(cs))!=-1) {
            System.out.println(new String(cs,0,length));
        }
        inputStreamReader.close();
    }
}

在这个之前我实验四种码表(iso8859-1 gbk utf-8 utf-16),发现除了用iso8859-1码表写入记事本,其他的码表编码,记事本都可以解码成功(我们看的懂得文字),至于为什么我不知道可能跟我们系统有关(猜测),我们再来分析为什么会输出这么个鬼东西出来

首先我在存入“你好!!!”的时候,我是使用的iso8859-1码表编码的,注意这里我们编译的是中国文字,在iso8859-1码表中是中国文字是没有对应的码值的,所以会出现乱码,并且每一个字符都是一样的(全是?),也就是对于不能识别的字符都是给的63这个码值(下面例子可以知道),所以导致最后我们根据这个码值进行解码的时候控制台全输出的是?

在上一片中最后一个例子中,跟这个是不同的,那个例子中首先是使用gbk先进行编码成对应的码值,而这个码值在iso8859-1码表中都有对应的字符(iso8859-1码表的特性),最后我们才可以获取最早用gbk编码的后的码值后找到原来的字符,而这个是一开始就是用iso8859-1码表进行的编码,并且iso8859-1码表对于不能识别的字符都是给的63这个码值,这个是解码不出最初的字符的(如果有大神知道可以私信我,谢谢)

public static void readText() throws IOException {
        File file = new File("D:\\新建文件夹\\a.txt");
        FileInputStream fileInputStream = new FileInputStream(file);
        InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream,"iso8859-1");
        char[] cs = new char[1024];
        int length = 0;
        while((length = inputStreamReader.read(cs))!=-1) {
            String str = new String(cs,0,length);
            byte[] buf = str.getBytes("iso8859-1");
            System.out.println(Arrays.toString(buf));
        }
        inputStreamReader.close();
    }

原文地址:https://www.cnblogs.com/zjdbk/p/9102387.html

时间: 2025-01-06 10:27:18

75. InputStreamReader和OutputStreamWriter(转换流--字节流转换成字符流)的相关文章

将字节流转换成字符流

readLine方法是字符流BufferedReader类中的方法 键盘read方法是字节流InputStream的方法. 能不能将字节流转换成字符流,在使用字符流缓冲区的readLine方法? InpuStream in = System.in; //将字节流对象转换成字符流 InputStreamReader isr = new InputStreamReader(in); //使用字符流的缓冲区,用于提高效率 BufferedReader bufr = new BufferedReader

Java中字节流如何转字符流,OutputStreamWriter用法

OutputStreamWriter 将字节流转换为字符流.是字节流通向字符流的桥梁.如果不指定字符集编码,该解码过程将使用平台默认的字符编码,如:UTF-8: 步骤: 1.创建流 子类对象  绑定数据目的. 1 FileOutputStream fos = new FileOutputStream("c:\\utf.txt"); 2.将字节转为字符,并声明utf-8格式(万国码). 1 OutputStreamWriter sow = new OutputStreamWriter(f

IO流(二)字符流

1.字符流:在字节流的基础上添加了编码机制.很大程度上和字节流操作一样的,字符流只能操作文本类文件,准确的说应该是纯文本类文件.例如.txt,.java,.cpp,.html等 编码:每一个国家都有自己的编码,编码不一致往往导致的结果就是!!乱码!!.中国编码的编码:gbk gbk:英文字母:1个字节,中文:2个字节,系统的默认编码. unicode:统一编码.中文还是英文字母都是占2个字节. utf-8: 国际编码.英文占1个字节,中文占3个字节. 文件是用什么编码来写的,那么就用什么编码来读

IO流中将字节流转成字符流的方法

//字节流--->字符流 1. public class TestIO { public static void main(String[] args) throws IOException { FileInputStream fis = new FileInputStream("c:/abc.txt");// 字节流 InputStreamReader isr = new InputStreamReader(fis);// 字符流 BufferedReader br = new

Java基础知识强化之IO流笔记37:字符流缓冲流之BufferedWriter / BufferedReader使用

1. 字符流缓冲流: 字符流为了高效读写,也提供了对应的字符缓冲流. BufferedWriter:字符缓冲输出流 BufferedReader:字符缓冲输入流 2. BufferedWriter使用:     将文本写入字符输出流,缓冲各个字符,从而提供单个字符.数组和字符串的高效写入.可以指定缓冲区的大小,或者接受默认的大小.在大多数情况下,默认值就足够大了. (1)BufferedWriter的构造方法: 构造方法摘要 BufferedWriter(Writer out)         

Java基础知识强化之IO流笔记39:字符流缓冲流之特殊功能

1. 字符缓冲流的特殊方法 BufferedWriter: 1 public void newLine():根据系统来决定换行符 BufferedReader: 1 public String readLine():一次读取一行数据 包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null 2. 代码示例: 1 package cn.itcast_05; 2 3 import java.io.BufferedReader; 4 import java.io.BufferedW

IO流 - 复制文件(字符流)

一.单字符复制 //明确数据源 FileReader fr=new FileReader("D:\\java1018\\buffer.txt"); //明确目的地 FileWriter fw=new FileWriter("D:\\java1018\\b\\buffer.txt"); //创建字符缓冲流对象 BufferedReader br=new BufferedReader(fr); BufferedWriter bw=new BufferedWriter(f

Java中字符流与字节流的区别

字符流处理的单元为2个字节的Unicode字符,分别操作字符.字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组.所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好!如果是音频文件.图片.歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点. 所有文件的储存是都是字节(byte)的储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘.在读取文件(特别是文本文件)时,也是一个字节一

Java IO 字节流与字符流 (二)

概述 IO流用来处理设备之间的数据传输 Java对数据的操作时通过流的方式 Java用于操作流的对象都在IO包中 流按操作的数据分为:字节流和字符流 流按流向不同分为:输入流和输出流 IO流常用基类 字节流的抽象基类 InputStream,OuputStream 字符流的抽象基类 Reader,Writer 注: 这些基类的子类都是以基类的名称结尾的,如FileReader,FileInputStream 字节流 字节流:以字符为导向的流 简单介绍一个例子,演示字节流对图片的复制 1: imp