1、

计算机中文件、数据底层都是基于二进制的。

计算机底层并没有文本文件、图片文件之分,它只是记录着每个文件的二进制序列。

字符集:包含着字符和二进制序列之间的对应关系,一个字符对应一个二进制序列。

编码(Encode):把人能看懂的明文转换为计算机能理解二进制序列。

解码(Decode):把计算机中的二进制序列转换为人能看懂的明文。

乱码:解码方式与编码方式不同,即编码、解码使用的字符集不一致。

Windows中文本文件的默认字符集是GBK。

2、

字节的文件输出流可以指定写入模式:

FileOutputStream fos=new FileOutputStream(String/File file);
FileOutputStream fos=new FileOutputStream(String/File file,boolean b);     //第二个参数指定是否是追加模式,true——追加,false——覆盖。

字符的文件流可以指定字符集:

FileWriter fw=new FileWriter(String/File file);
FileReader fr=new FileReader(String/File file);
 //指定字符集
FileWriter fw=new FileWriter(String/File file, String/Charset charset);
FileReader fr=new FileReader(String/File file, String/Charset charset);
//字符的文件输出流还可以指定写入模式
FileWriter fw=new FileWriter(String/File file, boolean b ); //是否是追加模式
FileWriter fw=new FileWriter(String/File file, String/Charset charset, boolean b);

2个转换流可以指定编码/解码的字符集:

InputStreamReader isr=new InputStreamReader(InputStream is, String/Charset  charset);   //指定解码字符集
OutputStreamWriter osr=new OutputStreamWriter(OutputStream os, String/Charset charset); //指定编码字符集

3、NIO中的Charset类

   //创建Charset对象,指定编码/解码用的字符集
Charset charset=Charset.forName("GBK"); //创建编码器
CharsetEncoder encoder=charset.newEncoder();
//使用编码器进行编码。编码是把字符序列转换为字节序列,参数只能是CharBuffer类型,返回值是ByteBuffer类型
ByteBuffer byteBuffer=encoder.encode(CharBuffer charBuffer); //创建解码器
CharsetDecoder decoder=charset.newDecoder();
//使用解码器进行解码。解码是把字节序列转换为字符序列,参数为ByteBuffer类型,返回值是CharBuffer类型
CharBuffer charBuffer=decoder.decode(ByteBuffer byteBuffer);

也可以不创建编码器、解码器:

    //创建Charset对象,指定编码/解码用的字符集
Charset charset=Charset.forName("GBK"); //编码
ByteBuffer byteBuffer=charset.encode(String str); //此处可使用String做参数
ByteBuffer byteBuffer=charset.encode(CharBuffer charBuffer); //解码
CharBuffer charBuffer=charset.decode(ByteBuffer byteBuffer);

更加简单。

String类的对象还可以使用以下方法将String(字符序列)编码为byte[](字节序列):

  • byte[]  getBytes()     //使用平台默认的字符集
  • byte[]  getBytes(String/Charset  charset)     //使用指定的字符集

返回编码好的字节序列。

Java 字符集,编码、解码的更多相关文章

  1. 有关Java字符集编码的问题

    在Java语言中,下列关于字符集编码(Character set encoding)和国际化(i18n)的问题,哪些是正确的? A.每个中文字符占用2个字节,每个英文字符占用1个字节 B.假设数据库中 ...

  2. Java Base64编码解码实现

    我尝试过两种方式:java自带的sun.misc的工具类,还有commons-codec.jar 1.sun.misc的工具类 String encoderStr = null; BASE64Enco ...

  3. Java Base64 编码解码方案总结

    Base64是一种能将任意Binary资料用64种字元组合成字串的方法,而这个Binary资料和字串资料彼此之间是可以互相转换的,十分方便.在实际应用上,Base64除了能将Binary资料可视化之外 ...

  4. java base64编码解码

    第一种.DatatypeConverter 使用JDK自带DatatypeConverter.java类实现,JDK版本必须>=1.6 /** * @Description base64编码 * ...

  5. java字符集编码乱码问题

    博客分类: web javajspservlet  最近做网页这块时碰到了正文字符乱码问题.别看这小小的一个问题,对我来说却花费了好长一段时间.现在让我慢慢分析它吧(说实话.这些有部分是从网上找的,但 ...

  6. JAVA基础---编码解码

    所谓编码 即char->byte 所谓解码 即byte->char ISO-8859-1 中文字符会被黑洞吸收 全部变为"?" GB2312 汉字可以被编码为双字节 但 ...

  7. java URI 编码解码

    import java.io.UnsupportedEncodingException; /** * url转码.解码 */ public class UrlUtil { private final ...

  8. Java 字符集编码

    一.字符编码实例1.NioTest13_In.txt文件内容拷贝到NioTest13_Out.txt文件中 public class NioTest13 { public static void ma ...

  9. 常用的js、java编码解码方法

    前言 前后端直接传输数据进行交互不就行了吗,为什么还要进行编码解码?正常情况下直接交互没问题,但当有类似以下情况出现时就需要进行编码再进行传输: 1.编码格式难以统一,导致数据交互过程出现中文乱码等问 ...

随机推荐

  1. loj2045 「CQOI2016」密钥破解

    CQOI 板子大赛之 pollard rho #include <iostream> #include <cstdio> using namespace std; typede ...

  2. 虚拟机安装教程(linux、centOS)

    前提: Windows7系统 64位 VMware-workstation-full-11.0.0-2305329.exe CentOS-6.6-x86_64-bin-DVD1.iso 安装步骤: 看 ...

  3. uncompyle2反编译python的.py文件

    前几天学用github,一不小心把a.py文件给删除了,由于1天没有提交,也无法找回.突然发现同a.py文件生成的编译文件a.pyc还在,逐去搜索一番反编译的方法. 查询得知python比较好的工具u ...

  4. MCMC 浅谈

    # MCMC 浅谈 1. 采样(sampling)是什么 MCMC在采样算法中有着举足轻重的地位,那么什么是采样?采样就是根据某种分布生成样本.举个例子,线性同余发生器就是根据均匀分布生成样本,这就很 ...

  5. 菜鸟之路——Linux基础::计算机网络基础,Linux常用系统命令,Linux用户与组权限

    最近又重新安排了一下我的计划.准备跟着老男孩的教程继续学习,感觉这一套教程讲的很全面,很详细.比我上一套机器学习好的多了. 他的第一阶段是Python基础,第二阶段是高等数学基础,主要将机器学习和深度 ...

  6. shell之常用命令

    一些技巧 ctrl+alt+f1切换至命令行模式 ctrl+alt+f7切换至图形界面 命令行编辑: 光标跳转 ctrl+a 行首 ctrl+e 行尾 ctrl+d 删除 ctrl+u 删除光标至行首 ...

  7. cf 853 A planning [贪心]

    题面: 传送门 思路: 一眼看得,这是贪心[雾] 实际上,我们要求的答案就是sigma(ci*(ti-i))(i=1~n),这其中sigma(ci*i)是确定的 那么我们就要最小化sigma(ci*t ...

  8. bzoj 4131: 并行博弈 (parallel)

    bzoj 4131: 并行博弈 (parallel) Description lyp和ld在一个n*m的棋盘上玩翻转棋,游戏棋盘坐标假设为(x, y),1 ≤ x ≤ n,1 ≤ y ≤ m,这个游戏 ...

  9. Java代码添加背景音乐

    太心塞!弄了很久才终于把Java添加背景音乐实现了.不过还是很Happy! 这次介绍的办法,是只要一打开Java Application,便可直接听到背景音乐.代码保存,方便以后再次利用. packa ...

  10. PE

    不是projecteuler,我想说的是projecteuclid..似乎是一个有很多数学文献的网站..? PE541似乎是一道很有趣的题目,有一个暴力大概就是首先转化一下模型变成找\(\sum_{x ...