1、转换流

转换流是将字节流变成字符流的流。

OutputStreamWriter:将字节输出流转换成字符输出流。

public class OutputStreamWriter extends Writer

提供的构造方法:

public OutputStreamWriter(OutputStream out)

InputStreamReader:将字节输入流转换成字符输入流。

public class InputStreamReader extends Reader

提供的构造方法:

public InputStreamReader(InputStream in)


  1. /*
  2. * 字节流与字符流的转化
  3. * */
  4. public class Test2{
  5. public static void main(String[] args) throws IOException {
  6. String singal = File.separator;
  7. //1.根据文件路径创建File对象
  8. File file = new File("C:"+singal+"Users"+singal+"lenovo"+singal+"DeskTop"+singal+"Test.txt");
  9. if(!file.getParentFile().exists()) {
  10. file.getParentFile().mkdirs();
  11. }
  12. OutputStream outputStream = new FileOutputStream(file);
  13. //字节流转化成字符流
  14. Writer writer = new OutputStreamWriter(outputStream);
  15. String string = "有点淡淡的忧伤";
  16. writer.write(string);
  17. writer.close();
  18. }
  19. }

这种操作在实际开发中并没有多么大的意义,我们主要用来分析FileOutputStream、FileInputStream及FileWriter、 FileReader之间的继承关系。

该类继承是典型的装饰者设计模型

优点:灵活,被装饰者可灵活组装需要的类。

缺点:类结构复杂,含有大量的其他类。

2、字符编码

1、常用的字符编码

(1)GBK、gb2312:描述的是中文编码,其中gb2312中只含有简体中文,而GBK中可包含有繁体中文。

(2)UNICODE编码:是java语言中的默认编码,16进制编码,支持世界上所有语言的编码,缺点就是占用的内存过大,会造成网络传输的负担。

(3)UTF-8:支持所有的语言,通用编码。

(4)ISO8859-1:国际通用拜编码,不支持中文,浏览器页面默认使用此编码。

2、乱码分析:

要对乱码进行分析首先我们应该先明确的知道当前操作系统上使用的是什么编码(java默认编码):


  1. public class Test2{
  2. public static void main(String[] args) throws UnsupportedEncodingException, IOException {
  3. //查看当前系统的字符编码(可以发现采用GBK编码)
  4. System.getProperties().list(System.out);
  5. OutputStream outputStream = new FileOutputStream("G:\\lemon\\testIO\\TestIO.java");
  6. //向文件中写入下列内容,并转化成ISO8859-1编码格式
  7. outputStream.write("hello你好!".getBytes("ISO8859-1"));
  8. outputStream.close();
  9. }
  10. }

通过结果可以发现,出现了乱码,正是因为ISO8859-1不支持中文编码,所以导致有中文的地方出现了乱码。所以我们可以得出下列结论:

乱码产生的原因:编码与解码的字符编码不一致。

JavaIO——转换流、字符编码的更多相关文章

  1. java 输入输出IO 转换流-字符编码

    编码和其产生的问题: 计算机中储存的信息都是用二进制数表示的,而我们在屏幕上看到的数字.英文.标点符号.汉字等字符是二进制数转换之后的结果. 按照某种规则,将字符存储到计算机中,称为编码 .反之,将存 ...

  2. JAVASE(十六) IO流 :File类、节点流、缓冲流、转换流、编码集、对象流

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 1.File类型 1.1.File类的理解 File类是在java.io包下 File可以理解成一个文件 ...

  3. python学习Day7 数据类型的转换,字符编码演变历程

    一.数据类型的转换 1.1.1.字符转列表:lst1 = str.split(默认空格,也可依据指定字符分界),若无分界字符,就没法拆分,这时可以直接放进list转成列表 ----> s1 = ...

  4. 批量转换文件字符编码(GBK转UTF-8)

    今天收到一份代码,拖到IDE中发现乱码,看来下编码是GBK的(

  5. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_08 转换流_2_编码引出的问题_FileReader读取GBK格式文件

    IDEA默认的编码格式是UTF-8 新建一个txt文件.输入你好 ANSI就是系统默认编码.保存即可. 通过IDE打开是乱码的,因为默认打开的方式是UTF-8 转换为char类型 输出了乱码

  6. javaSE学习笔记(15) ---缓冲流、转换流、序列化流

    javaSE学习笔记(15) ---缓冲流.转换流.序列化流 缓冲流 昨天复习了基本的一些流,作为IO流的入门,今天我们要见识一些更强大的流.比如能够高效读写的缓冲流,能够转换编码的转换流,能够持久化 ...

  7. Java-IO流之转换流的使用和编码与解码原理

    一.理论: 1.字符流和字节流区别是什么? 字符流=字节流+编码集,在实际读取的时候其实字符流还是按照字节来读取,但是会更具编码集进行查找编码集字典解析相应的字节,使得一次读取出一个字符: 2.什么是 ...

  8. Java精选笔记_IO流(转换流、常用流、流操作规律、字符编码)

    IO流 用来处理设备之间的数据传输,java对数据的操作是通过流的方式,java用于操作流的对象都在IO包中 按操作数据分为:字节流和字符流:按流向分为:输入流和输出流. 程序从输入流中读取数据,向输 ...

  9. java 节点流(字符流,字节流)和包装流(缓冲流,转换流)

    结点流:直接对File类进行操作的文件流 package stream; import java.io.File; import java.io.FileNotFoundException; impo ...

随机推荐

  1. Linux 文本三剑客之 grep

    Linux 系统中一切皆文件. 文件是个文本.可以读.可以写,如果是二进制文件,还能执行. 在使用Linux的时候,大都是要和各式各样文件打交道.熟悉文本的读取.编辑.筛选就是linux系统管理员的必 ...

  2. 17.彻底解决Jmap在mac版本无法使用的问题

    彻底解决Jmap在mac版本无法使用的问题 看了网上很多帖子,都说一半,说的都是大家说过的,根本没有解决问题.说jdk8不行,换成jdk9或者jdk11,我都试了,还是不行,最后说是mac的问题.换成 ...

  3. sql sever 约束

    SQLServer中有五种约束,Primary Key约束.Foreign Key约束.Unique约束.Default约束和Check约束 1.Primary Key约束在表中常有一列或多列的组合, ...

  4. codeql初探

    CodeQL初探 环境搭建 基于Windows 基于Mac 下载codeql https://github.com/github/codeql-cli-binaries/releases/latest ...

  5. c++学习笔记(四)

    动态内存分配 使用new分配内存 1.指针的用处是在运行阶段分配未命名的内存以储存值. 2.在此情况下,只能通过指针来访问内存. int *ptr_int=new int;//在内存阶段为一个int值 ...

  6. Python基础(获取对象信息)

    import types print(type('abc') == str)#True print(type(123) == int)#True def f1(): pass print(type(f ...

  7. 大爽Python入门教程 3-5 习题

    大爽Python入门公开课教案 点击查看教程总目录 1 求平方和 使用循环,计算列表所有项的平方和,并输出这个和. 列表示例 lst = [8, 5, 7, 12, 19, 21, 10, 3, 2, ...

  8. 菜鸡的Java笔记 第三十六 - java 函数式编程

    StudyLambda    Lambda 指的是函数式编程,现在最为流行的编程模式为面向对象,很多的开发者并不认可面向对象,所以很多的开发者宁愿继续使用 C 语言进行开发,也不愿意使用java,c+ ...

  9. Windows11 如何让开始菜单出现休眠选项(Windows11如何开启休眠功能?)Windows家庭版

    1. Windows11新版的菜单找不到调休眠的选项了,所以我们可以用win+r键调出运行,输入control,回车调出「控制面板」 配图: 2. 我的电脑系统是家庭版的Windows11,其它版本这 ...

  10. 提升开发效率的notepad++一些快捷方法(实体类的创建和查询sql语句的编写)

    新手要创建数据库表中,对应字段名的实体类,是不是感觉很麻烦,可以用notepad++快速的把实体类中的字段名进行排版,随后直接粘入idea使用 下面是navicat的演示 选择一个表,右键选择设计表 ...