Java IO中转换流的作用

在《Java网络编程》中,有这样一段话:

”Reader和Writer最重要的子类是InputStreamReader和OutputStreamWriter类。

InputStreamReader类包含了一个底层输入流,可以从中读取原始字节。它根据指定的编码方式,将这些字节转换为Unicode字符。

OutputStreamWriter从运行的程序中接收Unicode字符,然后使用指定的编码方式将这些字符转换为字节,再将这些字节写入底层输出流中。“

转换流的特点:

1. 其是字符流和字节流之间的桥梁

2. 可对读取到的字节数据经过指定编码转换成字符

3. 可对读取到的字符数据经过指定编码转换成字节

什么时候使用转换流呢?

1,源或者目的对应的设备是字节流,但是操作的却是文本数据,可以使用转换作为桥梁。提高对文本操作的便捷。 参见示例1-1 1-2

2,一旦操作文本涉及到具体的指定编码表时,必须使用转换流 。参见示例2-1 2-2

关于指定编码表的作用,建议参考这篇文章从内存角度解析Java字符编码,一定会豁然开朗的。

具体的对象体现:

1. InputStreamReader:字节到字符的桥梁

2. OutputStreamWriter:字符到字节的桥梁

这两个流对象是字符体系中的成员,它们有转换作用,本身又是字符流,所以在构造的时候需要传入字节流对象进来。

示例1-1:字节流System.in转为字符流BufferedReader

读取键盘输入的每一行内容,并写入到文本中,直到遇到over行结束输入

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

        //字节流-->字符流
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new FileWriter("is2.txt"));
        String line = null;
        while((line = br.readLine())!=null){
            if("over".equals(line)){
                break;
            }
            bw.write(line);
            bw.newLine();
            bw.flush();
        }
        bw.close();
        br.close();
    }

实例1-2 字符流BufferedReader转为字节流System.out

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

        BufferedReader br = new BufferedReader(new FileReader("is2.txt"));
        //字符流-->字节流
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        String line = null;
        while ((line = br.readLine())!=null) {
            bw.write(line);
            bw.newLine();
            bw.flush();
        }
        bw.close();
        br.close();
    }

示例2-1 采用指定的编码读取文本文件

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

        //在IO流中,如果想指定编码读写数据,只能使用转换流。
        //采用指定编码从文本文件中读取内容
        BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("C:\\a.txt"), "UTF-8"));
        String line = null;
        while ((line=br.readLine())!=null) {
            System.out.println(line);
        }
        br.close();
    }

实例2-2 采用指定的编码输出文本文件

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

        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("C:\\a.txt"), "UTF-8"));
        bw.write("I am 君山");
        bw.close();
    }

转载            https://blog.csdn.net/u013905744/article/details/51924258/

原文地址:https://www.cnblogs.com/duanwandao/p/9794985.html

时间: 2024-08-24 21:14:13

Java IO中转换流的作用的相关文章

Java IO之处理流(缓冲流、转换流)

一.处理流: 增强功能,提供性能,在节点流之上. 二.节点流与处理流的关系 节点流(字节流.字符流)处于IO操作的第一线,所有操作必须通过它们进行: 处理流可以对其他流进行处理(提高效率或操作灵活性). 三.缓冲流 1.字节缓冲流 BufferedInputStream BufferedOutputStream package IOBuffer; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; im

Java IO结构各种流详解

花了两天时间研究了一下Java IO的流,对于各种流,加深了一下理解 首先看我做的思维导图 文件流 public class FileIO { public static void main(String[] args) throws Exception { File file1 = new File(System.getProperty("user.dir") + "/c.txt"); // 找到第一个文件的File // 找到目标文件路径 File file2

Java连接MySQL数据库实现用户名密码的验证方法 Java语句中sql查询语句'' ""作用

//方法一,可以验证登录,但方法不实用.package com.swift; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; public class Logi

IO【转换流,打印流,序列化】

编码: 把看的懂,变成看不懂的 String str = "中国"; byte[] bytes = str.getBytes(); System.out.println(Arrays.toString(bytes));解码: 把看不懂的内容,变成能看懂的 String s = new String(bytes); System.out.println(s); java.io.OutputStreamWriter extends Writer OutputStreamWriter:转换流

[学习笔记]Java IO之其他流及总结

1. 概述 SequenceInputStream是字节流的包装类,能够提供多个流序列输入功能. 序列流只有输入流,适合完成多个源一个目的的需求. SequenceInputStream支持枚举输入,若源的数量大于2个,那么需要先建立枚举再通过构造器创建序列输入流. SequenceInputStream的使用和其他流基本类似. SequenceInputStream本质属于字节流. 2. 构造器 SequenceInputStream(Enumeration<? extends InputSt

JAVA IO中的设计模式

在java语言 I/O库的设计中,使用了两个结构模式,即装饰模式和适配器模式.       在任何一种计算机语言中,输入/输出都是一个很重要的部分.与一般的计算机语言相比,java将输入/输出的功能和使用范畴做了很大的扩充.因此输入输出在java语言中占有极为重要的位置.       java语言采用流的机制来实现输入/输出.所谓流,就是数据的有序排列,流可以是从某个源(称为流源,或者 Source of Stream)出来,到某个目的(Sink of Stream)地去.根据流的方向可以将流分

Java IO:面向流、同步、堵塞式IO(BIO)

转载请注明出处:jiq?钦's technical Blog 备注:阅读此文之前,建议先看我这篇博文了解堵塞式IO和非堵塞式IO的基本概念. JAVA BIO是面向流(字节流.字符流)的,即从流中一次读取一个或者多个字节,读取和写入时都须要同步堵塞直至完毕. 一.流(Stream) 1.字节流 输入(InputStream) 介质流 FileInputStream 从文件里读取信息 PipedInputStream 产生用于写入相关PipedOutputStream的数据,实现"管道化"

java基础 关于转换流

转换流有两种:InputStreamReader:将字节流转换为字符流 OutputStreamWriter:将字符流转换为字节流 什么时候使用转换流?由以下分析: 流对象很多,首先要明确那个流对象. 通过三点来完成: 1.明确源和目的 源:输入流.InputStream Reader 目的:输出流. OutputStream Writer 2.操作的数据是否是纯文本. 是:字符流 否:字节流 3.当体系明确后,再明确要使用哪个具体的对象. 通过设备来进行区分: 源设备:内存,硬盘,键盘 目的设

《java与设计模式》之装饰模式详解&amp;Java IO中的装饰器模式

1 概述 在一个项目中,你会有非常多的因素考虑不到,特别是业务的变更,不时的冒出一个需求是很正常的情况.有三个继承关系的类:Father.Son.GrandSon,我们要在Son类上增强一些功能怎么办?给Son类增加方法吗?那对GrandSon的影响呢?特别是对GrandSon有多个的情况,你会怎么办?认真看完本文,你会找到你的答案. JavaIO中,像下面的嵌套语句是不是很常见,为什么要怎样定义呢?理解装饰模式后,你会找到答案. DataInputStream in = new DataInp