转换流:

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

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

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

    OutputStreamWriter 将字节流转换为字符流.是字节流通向字符流的桥梁.如果不指定字符集编码,该解码过程将使用平台默认的字符编码,如:UTF-8: 步骤: 1.创建流 子类对象  绑定数 ...

  2. IO流(二)字符流

    1.字符流:在字节流的基础上添加了编码机制.很大程度上和字节流操作一样的,字符流只能操作文本类文件,准确的说应该是纯文本类文件.例如.txt,.java,.cpp,.html等 编码:每一个国家都有自 ...

  3. java基础之io流总结四:字符流读写

    字符流读写只适用于字符文件. 基本字符流(转换流)读写文件 转换流本身是字符流,但是实例化的时候传进去的是一个字节流,所以叫做转换流 InputStreamReader isr = new Input ...

  4. Java基础知识强化之IO流笔记41:字符流缓冲流之复制文本文件案例02(使用 [ newLine() / readLine() ] )(重要)

    1. 使用字符流缓冲流的特殊功能 [ newLine() / readLine() ] 需求:把当前项目目录下的a.txt内容复制到当前项目目录下的b.txt中  数据源: a.txt -- 读取数据 ...

  5. Java基础知识强化之IO流笔记39:字符流缓冲流之复制文本文件案例01

    1. 字符流缓冲流之复制文本文件案例 需求:把当前项目目录下的a.txt内容复制到当前项目目录下的b.txt中 数据源: a.txt -- 读取数据 -- 字符转换流 -- InputStreamRe ...

  6. Java基础IO流(三)字符流

    字符流: 文本和文本文件: java的文本(char)是16位无符号整数,是字符的unicode编码(双字节编码)文件是byte byte byte....的数据序列,而文本文件是文本(char)序列 ...

  7. java基础45 IO流技术(输入字符流/缓冲输入字符流)

    一.输入字符流 1.1.输入字符流体系 ------| Reader:输入字符流的基类(抽象类)  ----------| FileReader:向指定文件读取数据的输入字符流(把硬盘上的数据读取到程 ...

  8. Day 16:输入输出字符流、缓冲输入字符流

    输入输出字节流输出字符时的常见问题 import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStre ...

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

    //字节流--->字符流 1. public class TestIO { public static void main(String[] args) throws IOException { ...

随机推荐

  1. 1、Fiddler 打断点 bpu

    一.fiddler 设置断点,可修改以下请求 可以修改HTTP请求头信息,如修改cookie,user-agent等 可以修改请求数据,突破表单限制,提交任意数字,如充值最大金额100,可修改为100 ...

  2. js instanceof和typeof的区别及简单用法

    js中判断一个变量的类型,通常的做法是用typeof方法,看它返回的是 什么,但是对于数组和对象它返回的都是object,ECMAScript引入了java中的instanceof 方法来弥补这一缺陷 ...

  3. shell脚本编程测试类型上

    一bash的条件测试 判断某需求是否满足,需要由测试机制来实现.专用的测试表达式需要由测试命令辅助完成测试过程. 评估布尔声明,以便用在条件性执行中.若真,则返回0:若假,则返回1. 测试命令:• t ...

  4. testNG之组测试

    @Test(groups = {""}) 在执行测试用例的时候,往往一个功能依赖多个测试用例,比如流程的测试,那么这个时候就可以用到组测试,把流程涉及到测试用例都分到同一组里,按组 ...

  5. hdu 6103 Kirinriki (枚举对称中心+双指针)

    Problem Description We define the distance of two strings A and B with same length n isdisA,B=∑(i=0 ...

  6. <自动化测试>之<Selenium API 的用法1>

    今天,简单,举例说一下在用python+selenium中元素定位的主要方法,第一部分是单个元素的操作,第二部分是一类元素的操作,实际操作中注意区分 #!/usr/bin/env python # - ...

  7. windows10下安装Mysql 5.6(zip格式安装包)

    5.6的安装包是一个zip文件,里面包含了data(有表空间文件和日志文件),bin等文件夹.不同于以往的只需要双击安装.msi就行了.因此,在此记录下安装包是.zip时的安装步骤. 1下载 进htt ...

  8. Linux下安装Tomcat服务器

    Linux下安装Tomcat服务器 一.总结 一句话总结: linux多用才能熟 1.阿里云上面我们买的服务器,怎么让它可以访问特定的端口? 就是给服务器的安全组添加规则:实例-->更多--&g ...

  9. ceph-报错日志

    由于时钟不一致问题,导致ceph存储有问题 clock skew时钟偏移overalladj. 全部的:全体的:一切在内的stampedadj. 铭刻的:盖上邮戳的:顿足的 beaconvt. 照亮, ...

  10. linux安装相关软件

    XShell上传jdk文件到Linux并安装配置1.yum -y install lrzsz2.sudo rz选文件3.sudo tar -zxvf jdk-8u131-linux-x64.tar.g ...