6.4(java学习笔记)转换流
一、乱码问题
我们来看下列例子:
public class ConStream {
//当前平台默认采用GBK
public static void main(String[] args){
String str = "依风";
byte[] by = new byte[48];
byte[] bz = new byte[48];
try {
by = str.getBytes("UTF-8");//设置编码方式为utf-8,即将依风以utf-8的个数转换为byte
bz = str.getBytes("GBK");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(new String(by));//解码,默认采用平台默认格式,此处为GBK,与编码格式不同会产生乱码
System.out.println(new String(bz,0,3));//编码与解码采用格式相同,但解码的字节缺少,会出现乱码
System.out.println(new String(bz));//编码解码格式相同,且字符为缺少,解码正常不会出现乱码 }
}
运行结果:
渚濋
依?
依风
eclipse采用的编码格式,在菜单栏点击Windows-->Preferences-->General-->Workspace 查看默认编码方式
可以看到上面出现乱码的主要原因有两个:
1.编码和解码格式不统一。
2.字节丢失。
而转换流主要就是解决第一个问题的,它可以在读取和写入时指定编码格式,这样统一后就可以避免乱码问题。
二、 InputStreamReader & OutputStreamWtriter
InputStreamReader是从字节流到字符流的桥梁:它读取字节并使用指定的字符集(UTF-8、GBK等)将它们解码成字符。
OutputStreamWriter是从字符流到字节流的桥梁:写入其中的字符使用指定的字符集(UTF-8、GBK等)编码为字节。
三、构造方法
OutputStreamWriter(OutputStream out, String charsetName)
InputStreamReader(InputStream in, String charsetName)
初始化传递进去的是输入输出流对象,charseName是指定的编码格式。
剩下的操作方法与输入输出流类似。
四、例子
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter; public class ConStream {
public static void main(String[] args){
// File f = new File("F:\\依风\\Desktop\\UTF-8.txt");
File f = new File("F:\\依风\\Desktop\\test.txt");
String write = "依风\n依风\n依风";
String read;
try {
char []c = new char[1024];
//字节输入输出流-->转换流-->字符缓冲流
//以一种编码格式写入
OutputStream w = new FileOutputStream(f);
OutputStreamWriter ow = new OutputStreamWriter(w,"GBK");//将字符转换为GBK格式的字节码并写入
BufferedWriter buffW = new BufferedWriter(ow);
buffW.write(write);
buffW.flush();
buffW.close();
w.close();
//将写入的数据
InputStream r = new FileInputStream(f);//字节流
InputStreamReader ir = new InputStreamReader(r,"UTF-8");//将读入GBK格式的字节码,并用UTF-8格式转换为字符
BufferedReader buffR = new BufferedReader(ir);//字符缓冲流
while(null != (read = buffR.readLine())){
System.out.println(read);
}
buffR.close();
r.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
运行结果:
????
????
????
先将字符串以GBK方式编码成字节,然后将GBK格式的字节写入文件。
然后将GBK格式的字节以UTF-8格式解码成字符。
上列代码运行后显示的是乱码,因为写入和读取采用的编码方式不一样。
看个图更好理解:
可见转换流主要就两个功能:
1、字节流与字符流字节转换的桥梁
2、指定字节转换为字符的编码方式
如果把上述代码中的读、写编码格式一致,则不会出现乱码。反之则会出现乱码。
还要一点需要注意:
文件打开时采取的解码方式与程序写入时的编码方式无关。
举个例子,假如我是将字符串转换为GBK格式的字节,然后将GBK格式的字节写入记事本(*.txt)。
我们打开记事本时记事本首先要解码(将二进制的字节转换为字符),但此时采用的解码规则不一定是GBK。
可能是GBK,也可能是UTF-8。记事本采取的解码规则是记事本本身绝对的,记事本会根据本身存储的字节信息进行判断,
然后选取对应的编码,这个判断大多数情况下时准确的但也有例外。
例如在记事本中写入“连通”,然后另存为指定下编码规则为ANSI,即在windows平台是采用下GBK编码规则。
然后再次打开记事本会发现显示的是乱码。因为“连通”的GBK格式编码和UTF-8格式的编码“类型”,所以记事本会用UTF-8的方式进行解码。
采用GBK编码方式的字节码用UTF-8编码方式解码就会出现乱码问题。
输入连通
另存为,修改编码规则为ANSI(GBK)
保存退出,然后再次打开该文本。
我们再次点击另存为:
编码中显示的UTF-8就代表记事本当前的编码规则。
也就是说我们输入“连通”然后用GBK格式保存,记事本自己判断这个编码是UTF-8,然后采用UTF-8方式解码,然后我们看到的就是乱码。
当然这只是个例,换一些别的字符采用上述操作不会出现乱码。
6.4(java学习笔记)转换流的更多相关文章
- java 学习笔记之 流、文件的操作
ava 学习笔记之 流.文件的操作 对于一些基础的知识,这里不再过多的解释, 简单的文件查询过滤操作 package com.wfu.ch08; import java.io.File; import ...
- Java 学习笔记 IO流与File操作
可能你只想简单的使用,暂时不想了解太多的知识,那么请看这里,了解一下如何读文件,写文件 读文件示例代码 File file = new File("D:\\test\\t.txt" ...
- java学习笔记--IO流
第十二章大纲: I/O input/output 输入/输出 一.创建文件,借助File类来实现 file.createNewFile() : 创建文件 file.exists() : 判断文件是否存 ...
- java学习笔记——IO流部分
IO流常用的有:字符流.字节流.缓冲流.序列化.RandomAccessFile类等,以上列出的都是开发中比较常用的. 1.字节流: 字节流包含:FileInputStream/FileOutputS ...
- java学习笔记 --- IO流小结
IO流 |--字节流 |--字节输入流 InputStream int read():一次读取一个字节 int read(byte[] bys):一次读取一个字节数 ...
- java学习笔记16--I/O流和文件
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note16.html,转载请注明源地址. IO(Input Output)流 IO流用来处理 ...
- Java学习笔记六(I/O流)
1.介绍 在实际开发过程中经常会用到数据的输入/输出操作,本篇博客着重分析一下,java中经经常使用到的有关IO操作的类.而在java中能够将经常使用的流分为两个部分:字节流和字符流. 1.流的抽象基 ...
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
- 20145330第六周《Java学习笔记》
20145330第六周<Java学习笔记> . 这周算是很忙碌的一周.因为第六周陆续很多实验都开始进行,开始要准备和预习的科目日渐增多,对Java分配的时间不知不觉就减少了,然而第十和十一 ...
- Java学习笔记4
Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...
随机推荐
- 使用http_load网站压力测试
http_load用以测试web服务器的吞吐量与负载.但是它不同于大多数压力测试工具, 它可以以一个单一的进程运行,一般不会把客户机搞死.它可以自定义测试的URL列表 下载:http://acme.c ...
- notepad++中快速插入当前时间方法
转载自:http://blog.csdn.net/donghustone/article/details/7436483 在notepad++中快速插入当前时间方法: 插件是notepad++的一大优 ...
- 纯手工 CheckboxTree 实现
数据结构及页面显示格式: INSERT INTO AS_CombRules VALUES('', '', '', '', '', '', '') 实现 CheckboxTree 功能: html代码: ...
- 浅析 nth-child(n) 和 nth-of-type(n)
首先看一个例子 <div> <p>第一个段落</p> <p>第二个段落</p> </div> p:nth-child(2) { ...
- 通俗解释IOC原理
1. IoC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 图1:软件系统中耦合的对象 如果我们打开机 ...
- Spring - IoC(10): 生命周期
Spring 容器可以管理 singleton 作用域 Bean 的生命周期,容器能够跟踪 Bean 实例的创建.销毁.管理 Bean 生命周期行为主要有两个时机: 注入 Bean 的依赖关系之后 即 ...
- 【CodeForces】841C. Leha and Function(Codeforces Round #429 (Div. 2))
[题意]定义函数F(n,k)为1~n的集合中选择k个数字,其中最小数字的期望. 给定两个数字集A,B,A中任意数字>=B中任意数字,要求重组A使得对于i=1~n,sigma(F(Ai,Bi))最 ...
- python imageai 对象检测、对象识别
imageai库里面提供了目标识别,其实也可以说是目标检测,和现在很多的收集一样就是物体识别.他可以帮你识别出各种各样生活中遇见的事物.比如猫.狗.车.马.人.电脑.收集等等. 感觉imageai有点 ...
- 【跑马灯】纯css3跑马灯demo
我们写跑马灯一般都是用js控制定时器不断循环产生,但是定时器消耗比较大,特别是程序中很多用到定时器的时候,感觉有的时候比较卡.但是css3样式一般不会.这里主要的思路就是用css3代替js定时器实现一 ...
- pool.map的第二个参数想传入多个咋整?
from functools import partial from multiprocessing import Pool as ThreadPool pageurls=[] if maxpage: ...