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
75. InputStreamReader和OutputStreamWriter(转换流--字节流转换成字符流)相关推荐
- 如何将字节流转换成字符流
如何将字节流装饰成字符流 使用情况: 当编程时需大量读写,并不知文件格式时,采用字节流进行读写,再进行转换. 将字节流转换成字符流的过程被叫作转换流. 使用装饰者设计模式. 转换流: InputStr ...
- .dat文件写入byte类型数组_文件字节流、文件字符流、缓冲字节流、缓冲字符流字节数组流、数据流、转换流、对象流...
一.实操名称: 描述如下流的基本作用:文件字节流.文件字符流.缓冲字节流.缓冲字符流字节数组流.数据流.转换流.对象流二.描述1.文件字节流:包括:FileInputStream,FileOutput ...
- java 字符流与字节流区别_JAVA 字符流与字节流的区别
Java 流在处理上分为字符流和字节流.字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符.字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组. Java 内用 U ...
- IO流:输入字节流:InputStream 、 输出字节流:OutputStream 、输入字符流:Reader 、输出字符流:Writer、 BufferedInputStream
## 1_ IO流的介绍及其分类 * IO流: * I: Input 输入 * O: Output 输出 ...
- 20170118:File类与IO流,File类,IO流的基本原理,IO流的分类,文件字节流与文件字符流
一.File类 1.java.io.File类代表系统文件(文件和目录) 访问文件属性步骤 1). 创建文件对象:File file = new File(String pathname); 2). ...
- Java笔记整理六(File类,递归,字节流IO,字符流IO,流中的异常处理,属性集Properties,缓冲流,转换流,序列化,打印流)
1.File类 java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建.查找和删除等操作. 文件和目录路径名的抽象表示 java把文件和文件夹封装位为一个File类,我们可 ...
- java读取字节效率最高_java中字节流读写和字符流读写怎么理解?哪个效率更高...
我们java中的io流分为两大类,字节流和字符流. 可是在具体使用的时候怎么视情况进行使用? 怎么使用更加有效率? 有两个例子,帮忙看看解释一下,用哪种比较有效率以及适用情况. 下面是用字符流进行读写 ...
- java 文件字节流_Java:文件字符流和字节流的输入和输出
最近在学习Java,所以就总结一篇文件字节流和字符流的输入和输出. 总的来说,IO流分类如下: 输入输出方向: 输入流(从外设读取到内存)和输出流(从内存输出到外设) 数据的操作方式: 字节流 ...
- java字符流写入式乱码_字节流乱码与字符流乱码
本文总结自:https://blog.csdn.net/mingliangniwo/article/details/44178491 前提:数据展示过程:数据写入response容器,浏览器解析res ...
最新文章
- EOS 源代码解读 (2)插件-流程
- 周期性取count请求是如何在前台setup的 - Tile count
- rpm如何卸载mysql_Linux下卸载和安装MySQL[rpm包]
- linux 划ext4,linux – 有没有像ext4这样的’快速’格式?
- java 自定义 钩子_使用现有钩子的函数不能使用自定义do_action钩子
- 【BZOJ4517】排列计数,组合数+错排
- spring mvc项目在IDEA下使用jrebel热部署报错!!
- 计算机犯罪法律,计算机犯罪的构成要件
- 查看Linux服务器架构是x86还是arm
- MongoDB存在使用Mongo Shell和Java驱动程序的示例
- PHP把商品详情数据加入到商品数据,如果商品有多个详情只展示一次商品数据
- Matlab 输入输出操作
- 武汉好地科技为您解析CMMI3和CMMI5的区别
- conda和pip卸载包的注意事项
- 服务器vmware新建虚拟机教程,如何创建虚拟机教程全解
- 电磁场与仿真软件(18)
- 百度Java二面面经
- Linux 内核软死锁(soft lockup)记录
- Kata Containers介绍
- Python:实现一个Pangram字符串至少包含一次所有字母算法(附完整源码)
热门文章
- markdown编辑模式添加除水印图片方法
- cordova自定义一个简单的alert的插件(android平台)
- 白话详细解读(四)-----FCN
- STM32F4 HAL库开发 -- DMA
- 八皇后问题 回溯法hdu2553
- 资源隔离之 Linux namespace
- 以太坊代币标准: ERC20、ERC223的介绍与比较
- java axisclient超时_调用webservice接口超时
- tensorflow命令行安装失败_2019-1 强化学习入坑记之ancanda安装
- JZOJ 5699. 【gdoi2018 day1】涛涛接苹果(appletree)