java转换流 InputStreamReader和OutputStreamWriter详解

对于java转换流 InputStreamReader和OutputStreamWriter你都了解吗?下面的文章内容,要给你讲解的就是这个方面的知识。

在正常的情况之下,字节流能够对所有的数据进行操作,可是,有些时候在对文本进行处理时,要用到字符流,例如,查看文本的中文的时候,采用字符流就会更加的方便,所以, Java IO流当中,提供了两种用于将字节流转换为字符流的转换流。

InputStreamReader用于将字节输入流转换为字符输入流,其中OutputStreamWriter用于将字节输出流转换为字符输出流,使用转换流能够在一定程度上避免乱码,还能够指定输入输出所使用的字符集。

示例:

在java.txt当中输出“你你你你你你”6个字,将java.txt保存为“UTF-8”的格式,之后,通过字节流的方式读取。

代码:

public static void main(String[] args)
{
    try
    {
        FileInputStream fis = new FileInputStream("D://java.txt");
        int b = 0;
        while ((b = fis.read()) != -1)
        {
            System.out.print((char) b);
        }
    }
    catch (FileNotFoundException e)
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    catch (IOException e)
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

输出结果:“??????????”

可以发现中文都是乱码,下面的话用字节数组,并通过字符串设定编码格式来显式内容。

代码:

public static void main(String[] args)
{
    try
    {
        FileInputStream fis = new FileInputStream("D://java.txt");
        byte b[] = new byte[1024];
        int len = 0;
        while ((len = fis.read(b)) != -1)
        {
            System.out.print(new String(b, 0, len, "UTF-8"));
        }
    }
    catch (FileNotFoundException e)
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    catch (IOException e)
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

输出结果为“你你你你你你”,可是在存储的文字较多的时候,会出现解码不正确的问题,并且,字节长度不能够根据解码内容自动设定,这个时候,就需要转换流来完成。

代码:

public static void main(String[] args)
{
    try
    {
        FileInputStream fis = new FileInputStream("D://java.txt");
        InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
        int b = 0;
        while ((b = isr.read()) != -1)
        {
            System.out.print((char) b); // 输出结果为“你你你你你你”
        }
    }
    catch (FileNotFoundException e)
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    catch (IOException e)
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

示例:

下面以获取键盘输入为例来介绍转换流的用法。

Java使用System.in代表标准输出,也就是键盘输入,但这个标准输入流是InputStream类的实例,使用不太方便,并且,键盘输入内容都是文本内容,所以可以使用InputStreamReader将其转换成字符输入流,普通的Reader读取输入内容时依然不太方便,可以将普通的Reader再次包装成BufferedReader,利用BufferedReader的readLine()方法可以一次读取一行内容。

程序:

public static void main(String[] args)
{
    try
    {
        // 将 System.in 对象转换成 Reader 对象
        InputStreamReader reader = new InputStreamReader(System.in);
        // 将普通的Reader 包装成 BufferedReader
        BufferedReader br = new BufferedReader(reader);
        String line = null;
        // 利用循环方式来逐行的读取
        while ((line = br.readLine()) != null)
        {
            // 如果读取的字符串为“exit”,则程序退出
            if (line.equals("exit"))
            {
                System.exit(1);
            }
            // 打印读取的内容
            System.out.println("输入内容为:" + line);
        }
    }
    catch (IOException e)
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

上面代码第4行和第6行将System.in包装成BufferedReader,BufferReader流具有缓冲功能,它可以一次读取一行文本,以换行符为标志,如果它没有读到换行符,则程序堵塞,等到读到换行符为止。运行上面程序可以发现这个特征,在控制台执行输入时,只有按下回车键,程序才会打印出刚刚输入的内容。

因为,BufferedReader具有一个 readLine() 方法,可以非常方便地进行一次读入一行内容,所以经常把读入文本内容地输入流包装成BufferedReader,用来方便地读取输入流的文本内容。

问题:

有字节流转字符流的转换流,为什么没有字符流转字节流的转换流?

字节流比字符流的使用范围要更广,可是,字符流比字节流操作方便,假如,有一个流已经是字符流了,也就是是一个用起来更方便的流,为什么要转换成字节流呢?

反之,假如,现在有一个字节流,但可以确定这个字节流的内容都是文本内容,那么将它转换成字符流来处理就会更方便一些,所以Java只提供了将字节流转换成字符流的转换流,没有提供将字符流转换成字节流的转换流。

以上的内容你都清楚了吗?更多相关java基础内容,可以继续通过奇Q工具网来进行了解。

推荐阅读:

java字符流,字符缓冲区输入流BufferedReader类介绍

java字符流,字符缓冲区输出流BufferedWriter类介绍

java字符流,字符文件输入流FileReader类介绍