Java第三阶段学习(三、字符流、转换流)

一、字节流读取中文时出现的问题:

 文件中有中文时,用字节流读取会出现乱码的问题,因为一个中文为两个字节

二、字符编码表

编码表:其实就是生活中字符和计算机二进制的对应关系表

1、ascii一个字节中的7位就可以表示。对应的字节都是正数。0-xxxxxxx

2、iso-8859-1:拉丁码表 latin用了一个字节用的8位。1-xxxxxxx  负数。

3、GB2312:简体中文码表。包含6000-7000中文和符号。用两个字节表示。两个字节第一个字节是负数,第二个字节可能是正数

      GBK:目前最常用的中文码表,2万的中文和符号。用两个字节表示,其中的一部分文字,第一个字节开头是1,第二字节开头是0

      GB18030:最新的中文码表,目前还没有正式使用。

4、unicode国际标准码表:无论是什么文字,都用两个字节存储

      Java中的char类型用的就是这个码表。char c = 'a';占两个字节。

      Java中的字符串是按照系统默认码表来解析的。简体中文版 字符串默认的码表是GBK。

5、UTF-8:基于unicode,一个字节就可以存储数据,不要用两个字节存储,而且这个码表更加的标准化,在每一个字节头加入了编码信息(后期到api中查找)。

能识别中文的码表:GBK、UTF-8;正因为识别中文码表不唯一,涉及到了编码解码问题。

对于我们开发而言,常见的编码 GBK  UTF-8  ISO-8859-1

文字--->(数字) :编码 “abc”.getBytes()  byte[]    //数字就是字节

(数字)--->文字  : 解码 byte[] b={97,98,99}  new String(b)  用new String 传一个字节数组

三、字符输入流  Reader类

Reader类:读取字符流的超类。

方法:

1.read():读取单个字符并返回

2.read():将数据读取到数组中,并返回读取的个数

四、字符输入类 FileReader类

Reader类的子类,用来读取字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的。

 构造方法:FileReader fr=new FileReader(文件路径/文件对象);

package com.oracle.demo01;
import java.io.FileReader;
import java.io.IOException;
//字符输入流
public class ReaderDemo {//因为是一个字符一个字符读取的,所以读取中文不会出现乱码,专门用来处理文本文件public static void main(String[] args) throws IOException {// 1.获取数据源FileReader fr=new FileReader("d:\\java\\writer.txt");//2.读取数据int len=0;while((len=fr.read())!=-1){System.out.println((char)len);}fr.close();}}

 

 五、字符输出流 Writer类

Writer是写入字符流的抽象类。其中描述了相应的写的动作。

 方法:

六、字符输出类 FileWriter类

Writer类的子类,用来写入字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是可接受的。

 构造方法:FileWriter fw=new FileWriter(文件路径/文件对象);

package com.oracle.demo01;import java.io.FileWriter;
import java.io.IOException;
//字符输出流   
public class WriteDemo {//字符流处理的是文本文件public static void main(String[] args) throws IOException {// 文本文件:打开人能看懂的就是文本文件//1.确定目的地FileWriter fw=new FileWriter("d:\\java\\writer.txt",true);//2.写入数据//fw.write(100);   // 如果不刷新,会保存在内存中
//        char[] ch={'猴','赛','雷'};   //字符数组
//        fw.write(ch,0,2);    //可以输出字符数组,也可以控制输出的长度fw.write("崔永元实话实说",0,3);     //单引号是  字符,双引号是字符串//3.刷新
        fw.flush();//4.释放资源
        fw.close();}}

 

 flush()方法与colse()方法的区别:

flush():将流中的缓冲区缓冲的数据刷新到目的地中,刷新后,流还可以继续使用,还可以继续输出。

close():关闭资源,但在关闭前会将缓冲区中的数据先刷新到目的地,否则丢失数据,然后再关闭流。关闭后流不可以使用。

注意:如果写入数据多,一定要一边写一边刷新,最后一次可以不刷新,由close完成刷新并关闭。

 练习题:用字符流复制文件

 

package com.oracle.demo01;import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
//用字符流复制文本文件,不要用来复制图片与视频等
public class Copy {public static void main(String[] args) throws IOException {// 1.获取数据源FileReader fr=new FileReader("e:\\java\\outint.PNG");//2.获取目标FileWriter fw=new FileWriter("D:\\java\\outin.png");//3.读取并写入int len =0;char[] ch=new char[1024];while((len=fr.read(ch))!=-1){fw.write(ch,0,len);}fw.flush();fr.close();fw.close();}}

 七、转换流

 如果需要指定编码和缓冲区大小时可以在字节流的基础上构造一个InputStreamReader或者OutputStreamWriter。比如,如果文件内为UTF-8格式,但是电脑系统默认的格式为GBK格式,直接读取的话会出现读取内容与文件内容不符的问题,这个时候就需要转换流来转换。

7.1输出转换类OutputStreamWriter类

 

OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的字符编码表,将要写入流中的字符编码成字节。它的作用的就是,将字符串按照指定的编码表转成字节再使用字节流将这些字节写出去

 

package com.oracle.demo01;import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
//转换流    输出
public class OutputStreamDemo {//结尾为Streatm的为字节流     结尾为reader或writer的为字符流public static void main(String[] args) throws IOException {//1.确定目的地//字节流输出对象FileOutputStream fos=new FileOutputStream("e:\\java\\writer.txt",true);//2.设置走哪个码表       码表是文本文件内容所使用的码表OutputStreamWriter osw=new OutputStreamWriter(fos,"utf-8");//3.写入数据//写入时就转换为了指定码表的字符流osw.write("野猪佩奇");osw.flush();osw.close();}}

 

OutputStreamWriter流对象,它到底如何把字符转成字节输出的呢?

其实在OutputStreamWriter流中维护自己的缓冲区,当我们调用OutputStreamWriter对象的write方法时,会拿着字符到指定的码表中进行查询,把查到的字符编码值转成字节数存放到OutputStreamWriter缓冲区中。然后再调用刷新功能,或者关闭流,或者缓冲区存满后会把缓冲区中的字节数据使用字节流写到指定的文件中。

7.2转换输入流 InputStreamReader类

InputStreamReader 是字节流通向字符流的桥梁它使用指定的字符编码表读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。

package com.oracle.demo01;import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;public class InputStreamDemo {
//转换流   先走码表,根据码表解析,然后再进行读写操作public static void main(String[] args) throws IOException {//1.获取数据源FileInputStream fis=new FileInputStream("e:\\java\\writer.txt");//2.设置走哪个码表InputStreamReader isr=new InputStreamReader(fis,"utf-8");//3.读取数据int len=0;while((len=isr.read())!=-1){System.out.print((char)len);}isr.close();}}

 

注意:在读取指定的编码的文件时,一定要指定编码格式,否则就会发生解码错误,而发生乱码现象。

 

7.3转换流和字符类区别

发现有如下继承关系:

父类:OutputStreamWriter:

                  子类:FileWriter:

父类:InputStreamReader:

     子类:FileReader;

OutputStreamWriter和InputStreamReader是字符和字节的桥梁:也可以称之为字符转换流。字符转换流原理:字节流+编码表

FileWriter和FileReader:作为子类,仅作为操作字符文件的便捷类存在操作的字符文件,使用的是默认编码表时可以不用父类,而直接用子类就完成操作了,简化代码

InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"));//默认字符集。

InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"),"GBK");//指定GBK字符集。

FileReader fr = new FileReader("a.txt");

这三句代码的功能是一样的,其中第三句最为便捷。

注意:一旦要指定其他编码时,绝对不能用子类,必须使用字符转换流。什么时候用子类呢?

条件:

1、操作的是文件。2、使用默认编码。

总结:

字节--->字符 : 看不懂的--->看的懂的。  需要读。输入流。 InputStreamReader

字符--->字节 : 看的懂的--->看不懂的。  需要写。输出流。 OutputStreamWriter

练习题:

 

package com.oracle.demo01;import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
//转换流复制文本文件
public class CopyTwo {public static void main(String[] args) throws IOException {FileInputStream fis=new FileInputStream("e:\\java\\writer.txt");InputStreamReader osr=new InputStreamReader(fis,"utf-8");FileOutputStream fos=new FileOutputStream("d:\\java\\writer.txt");OutputStreamWriter osw=new OutputStreamWriter(fos,"utf-8");int len=0;while((len=osr.read())!=-1){osw.write(len);}osr.close();osw.flush();osw.close();}}

 

 

 

转载于:https://www.cnblogs.com/0328dongbin/p/9223750.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/397621.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows下OpenSSL加密证书安装步骤与使用方法

OpenSSL加密证书一般用于签名认证,含私钥和公钥。在Linux系统中,OpenSSL一般是已经安装好了,可以直接使用。而在Windows系统中,是需要安装使用的。 最近在使用支付平台时,用到了OpenSSL,鉴于此分享给大家&a…

java源码影视源码搭建教程_新版千月影视app源码+搭建教程

使用notepad批量替换URL【http://】为你的域名(被替换的域名访问有成品不能发布 需要修改的到前台confing里面查询),替换名称【鲸鹰影视】为你的应用名称;服务端:1.将替换好的后端源码打包上传至站点根目录后解压;2.配置网站伪静态…

Uboot USB模式(RK3288变砖头的解决办法)

RK3288启动后有三种模式,可以分别进行操作。 第一种是normal也就是正常的启动模式。这个模式无法刷固件。一般板子通电就是这个模式 第二种是loader模式。就是刷固件模式。这个模式可以刷各种image。按住recover按键再通电,通过uboot的检测进入这个模式 …

DEV GridView嵌套

/// <summary> /// 绑定主表和明显表到GridView /// </summary> /// <param name"machineProduct">主表</param> /// <param name"configureData">字表</param> private void Mas…

局域网大型文件分发的可能解决方案

客户原来的做法是把文件上传到服务器&#xff0c;然后后形成一个普通的HTTP地址下入网站后台系统&#xff0c;然后客户端用户看到后&#xff0c;则下载下来。但是随着文件越来越大&#xff0c;客户端下载量增加&#xff0c;在局域内网环境中这种文件分发方式的弊端立现。服务器…

一个Option请求引发的深度解析

在当前项目中&#xff0c;前端通过POST方式访问后端的REST接口时&#xff0c;发现两条请求记录&#xff0c;一条请求的Request Method为Options&#xff0c;另一条请求的Reuest Method为Post。想要解决这个疑惑还得从以下3个概念说起。 Http Options Method RFC2616标准&#x…

ionic+AnjularJs实现省市县三级联动效果

建议对ionic和AnjularJs有一定了解的人可以用到&#xff0c;很多时候我们要用到选择省份、城市、区县的功能&#xff0c;现在就跟着我来实现这个功能吧&#xff0c;用很少的代码&#xff08;我这里是根据客户的要求&#xff0c;只显示想要显示的部分省份和其相对应的城市、区县…

Confluence 6 附件存储文件系统的分级

从 Confluence 3.0 开始&#xff0c;附件的存储方式有了重大的改变和升级。如果你是从 Confluence 2.10 及其早期版本升级上来的&#xff0c;请参考 Upgrading Confluence 页面中推荐的升级路径&#xff0c;同时请阅读 Confluence 3.0 文档中 Hierarchical File System Attachm…

你不知道的JavaScript-0

【数组】 删除数组的几种方法&#xff1a; https://www.cnblogs.com/Joans/p/3981122.html http://www.cnblogs.com/qiantuwuliang/archive/2010/09/01/1814706.html 【数字转换】 parseInt(num, radix): 【宽松相等和严格相等】 允许在相等比较中进行强制类型转换&#xff0c…

真是,原来可以这样啊

一下午&#xff0c;解决了两个问题。。。。。 先列上这两个真是Bug的问题&#xff1a; 1、数据库有个表book&#xff0c;里面有个字段 create_time Datetime类型的字段&#xff0c;这个字段是 not null 的。下午下代码往数据库里插入数据时&#xff0c;总是提示&#xff0c;cre…

java运行时异常中文_JAVA——运行时异常(RuntimeException)

Exception中有一个特殊的子类异常RuntimeException运行时异常。如果在函数内抛出该异常&#xff0c;函数上可以不用声明&#xff0c;编译一样通过。如果在函数上声明了该异常。调用者可以不用进行处理。编译一样通过。之所以不用在函数上声明&#xff0c;是因为不需要让调用者处…

JavaOne 2016——首日亮点

今年&#xff0c;为期5天的JavaOne会议中&#xff0c;4个会场的议题都进行了直播&#xff0c;演讲稿也在播出之后一并提供。\\来自Terracotta公司EHCache团队的Henri Tremblay&#xff0c;做了主题为《学习Java 8&#xff1a;Lambda表达式和函数式编程&#xff08;Learn Java 8…

Linux tr命令详解

tr是个简单的替换命令&#xff0c;从标准输入中替换、缩减和/或删除字符&#xff0c;并将结果写到标准输出。 tr常见命令参数 用法&#xff1a;tr [选项]... SET1 [SET2] 从标准输入中替换、缩减和/或删除字符&#xff0c;并将结果写到标准输出。-c, -C, --complement …

Android中插件开发篇总结和概述

刚刚终于写完了插件开发的最后一篇文章&#xff0c;下面就来总结一下&#xff0c;关于Android中插件篇从去年的11月份就开始规划了&#xff0c;主要从三个方面去解读Android中插件开发原理。说白了&#xff0c;插件开发的原理就是&#xff1a;动态加载技术。但是我们在开发插件…

java传入数据库生成柱状图_Java读取数据库数据生成柱状图

此案例是用swing显示数据的。须要引入jfreechart相关包。不同版本号可能包不同样。本人用的是此案例在ssi框架下会报错&#xff0c;不用框架就没问题。Java后台逻辑代码&#xff1a;public class BarChart {ChartPanel frame1;public BarChart() {CategoryDataset dataset get…

SVN系列操作(一)

SVN是什么&#xff1f; SVN是Subversion的简称&#xff0c;是一个开放源代码的版本控制系统&#xff0c;常用于软件开发项目中&#xff0c;实现代码、文档等的历史版本保存、共享和权限管理。 进入SVN本地目录&#xff0c;第一步操作就是update。 为什么呢&#xff1f;因为SVN是…

ubuntu-14.04.2-desktop使用方法

一、安装VMware Tools 1. 在VMware Workstation11.1.0下安装Ubuntu镜像&#xff1a;ubuntukylin-14.04.2-desktop-amd64.iso 2. 点击虚拟机菜单栏-安装VMware Tools。 3. 在Ubuntu系统光盘中找到VMwareTools-9.9.2-2496486.tar.gz&#xff0c;右键复制到“桌面”&#xff0c;然…

ubuntu 跟xshell的问题

有2个分析&#xff1a; 1&#xff1a;是windos的防火墙没有关闭 2&#xff1a;是虚拟机没有安装sshd服务器 ubuntu在CLI界面下输入&#xff1a;dpkg -l |grep ssh 因为是我安装过的sshd server 要是没有sshd server 就要输入 安装。 三&#xff1a;要是安装完之后 链接显示说…

Go语言基础之1--标识符、关键字、变量和常量、数据类型、Go的基本程序结构、Golang的特性...

一、前言 当我们项目较为简单时&#xff0c;我们在src目录下新建一个该项目目录&#xff0c;里面存放源码文件即可&#xff0c;见下图&#xff1a; 当我们一个项目较为复杂时&#xff0c;我们可以在src目录下新建一个该项目目录&#xff0c;在针对该项目不同模块创建不同目录&a…

ext springmvc mysql_基于ExtJs6前台,SpringMVC-Spring-Mybatis,resteasy,mysql无限极表设计,实现树状展示数据(treepanel)...

先从后台讲起1.表的设计2.mysql查询很容易&#xff0c;关键是要把id,text,parentId查出来/p>"http://mybatis.org/dtd/mybatis-3-mapper.dtd">SELECTbp.id,bb.name brandName,bp.name text,bp.photo_url photoUrl,bp.number,bp.add_time addTime,bp.modify_tim…