DataInputStream和DataOutputStream都是Java中输入输出流的装饰类,用起来非常方便。今天就来讨论一下使用该类时候遇到的编码问题。



package com.vincent.example;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException; public class TestDataStream {
public static void main(String[] args) {
// 使用DataInputStream,DataOutputStream写入文件且从文件里读取数据。 try {
// Data Stream写到输入流中
DataOutputStream dos = new DataOutputStream(new FileOutputStream(
"datasteam.txt"));
dos.writeBytes("世界"); //按2字节写入,都是写入的低位
dos.writeChars("世界"); // 依照Unicode写入
// 依照UTF-8写入(UTF8变长,开头2字节是由writeUTF函数写入的长度信息。方便readUTF函数读取)
dos.writeUTF("世界");
dos.flush();
dos.close(); // Data Stream 读取
DataInputStream dis = new DataInputStream(new FileInputStream(
"datasteam.txt"));
// 读取字节
byte[] b = new byte[2];
dis.read(b);
System.out.println(new String(b, 0, 2)); // 读取字符
char[] c = new char[2];
for (int i = 0; i < 2; i++) {
c[i] = dis.readChar();
}
System.out.println(new String(c, 0, 2)); // 读取UTF
System.out.println(dis.readUTF()); dis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

使用16进制方式打开文件例如以下:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZmlzaHdqeQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast">

能够看出,第一个“世界”已经被截断,两个汉字都仅仅被写入了低位。因此肯定乱码。

package com.vincent.example;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException; public class TestDataStream {
public static void main(String[] args) {
// 使用DataInputStream,DataOutputStream写入文件且从文件里读取数据。
try {
// Data Stream写到输入流中
DataOutputStream dos = new DataOutputStream(new FileOutputStream(
"datasteam.txt"));
dos.write("世界".getBytes()); // 按UTF8编码(我的系统默认编码方式)写入
//dos.write("世界".getBytes("GBK")); //指定其它编码方式
dos.writeChars("世界"); // 依照Unicode写入
// 依照UTF-8写入(UTF8编码长度可变。开头2字节是由writeUTF函数写入的长度信息,方便readUTF函数读取)
dos.writeUTF("世界");
dos.flush();
dos.close(); // Data Stream 读取
DataInputStream dis = new DataInputStream(new FileInputStream(
"datasteam.txt"));
// 读取字节
byte[] b = new byte[6];
dis.read(b);
System.out.println(new String(b, 0, 6)); // 读取字符
char[] c = new char[2];
for (int i = 0; i < 2; i++) {
c[i] = dis.readChar();
}
System.out.println(new String(c, 0, 2)); // 读取UTF
System.out.println(dis.readUTF()); dis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

文件打开例如以下:



能够看出,读取前6字节并依照UTF-8解码就能够避免乱码。

值得注意的是。String构造函数也能够指定对byte数组作其它编码方式的解码。比如:new String(b,0,6,"GBK")。同一时候使用writeUTF和readUTF能够免去程序员对于长度的考虑,由于这两个函数为我们攻克了长度问题。写入了文件。因此我们无需关心。但这样就使用了额外的空间去记录长度信息。



DataInputStream和DataOutputStream使用方法细节探讨的更多相关文章

  1. [十一]JavaIO之DataInputStream 和 DataOutputStream

    功能简介 DataInputStream和DataOutputStream 继承了各自的FilterInputStream以及FilterOutputStream 使用装饰器模式对InputStrea ...

  2. 将如下三组不同类型的数据利用DataInputStream和DataOutputStream写入文件,然后从文件中读出

    三组数据如下: {19.99 , 9.99 , 15.99 , 3.99 , 4.99} {12 , 8 , 13 ,29 ,50} {"Java T-shirt" , " ...

  3. Java之IO(四)DataInputStream和DataOutputStream

    转载请注明源出处:http://www.cnblogs.com/lighten/p/6986155.html 1.前言 DataInputStream和DataOutputStream分别继承了Fil ...

  4. Java IO(十一) DataInputStream 和 DataOutputStream

    Java IO(十一) DataInputStream 和 DataOutputStream 一.介绍 DataInputStream 和 DataOutputStream 是数据字节流,分别继承自 ...

  5. CPU利用率异常的分析思路和方法交流探讨

    CPU利用率异常的分析思路和方法交流探讨在生产运行当中,经常会遇到CPU利用率异常或者不符合预期的情况,此时,往往暗示着系统性能问题.那么究竟是核心应用的问题?是监控工具的问题?还是系统.硬件.网络层 ...

  6. java下DataInputStream与DataOutputStream写入数据的同时写入数据类型

    package cn.stat.p2.demo; import java.io.DataInputStream; import java.io.DataOutputStream; import jav ...

  7. 【转载】Xpath定位方法深入探讨及元素定位失败常见情况

    一.Xpath定位方法深入探讨 (1)常用的Xpath定位方法及其特点 使用绝对路径定位元素. 例如: driver.findElement(By.xpath("/html/body/div ...

  8. Xpath定位方法深入探讨及元素定位失败常见情况

    一.Xpath定位方法深入探讨 (1)常用的Xpath定位方法及其特点 使用绝对路径定位元素. 例如: driver.findElement(By.xpath("/html/body/div ...

  9. java代码----------实现创建DataInputStream和DataOutputStream进行读写

    总结: 主要是 捕获异常 package com.a.b; import java.io.*; public class testData { public static void main(Stri ...

随机推荐

  1. grails下的httpclient

    httpclient已经发布到4.3版本了,其中的API发生了巨大的变化,尤其是对于关闭连接显得更加容易理解,比如引入了CloseableHttpResponse. 然而grails2.3.2中自带了 ...

  2. 怎样下载完整的Spring包

    自从3.2版本以后,Spring不再提供包含所有库的文件下载了只有Sping自身的最基本库,所依赖的东西需要自己搞定首先, 这个链接 包含了Spring自身和所用到的所有东西   这个 是上述链接的说 ...

  3. POJ 3164 Command Network (最小树形图)

    [题目链接]http://poj.org/problem?id=3164 [解题思路]百度百科:最小树形图 ]里面有详细的解释,而Notonlysucess有精简的模板,下文有对其模板的一点解释,前提 ...

  4. air for ios

    在 Adobe AIR 中为不同屏幕尺寸的多种设备提供支持 使用Flash Builder 4.5进行多平台游戏开发 手机屏幕触控技术与提升AIR在Android上的触控体验 AIR Native E ...

  5. [Cocos2d-JS] 安卓机器的几个按钮

    cc.eventManager.addListener({ event:cc.EventListener.KEYBOARD, onKeyPressed:function(keycode,event){ ...

  6. 第三百五十五天 how can I 坚持

    快一年了,三百五十五天了,等写个程序算算时间,看看日期和天数能不能对的上,哈哈. 计划还是未制定,天气预报还是没有写完,立马行动,发完这个博客,立马行动. 计划:设计模式1个月,三大框架3个月,计算机 ...

  7. 第一百九十六天 how can I 坚持

    老妈邮的咸菜到了,美味啊,买不到,哈哈. 以后要勤给鱼换水啊,10天不换,水都臭了,拒绝懒惰. 明天要回济南了,刘松结婚,估计又没法发博客了. 两条鱼,一条罗娜,一条我,哈哈. 睡觉.

  8. 文本读写vs二进制读写

    [文本读写vs二进制读写] 在学习C语言文件操作后,我们都会知道打开文件的函数是fopen,也知道它的第二个参数是 标志字符串.其中,如果字符串中出现'b',则表明是以打开二进制(binary)文件, ...

  9. linux 课后作业

    第一章 第一单元 : 安装linux 系统:已完成 第二单元: 略 第三单元: 1) 要求以root用户登录系统,右击桌面打开终端,查看当前登陆Linux系统所使用的用户名2) 查看哪些用户在系统上工 ...

  10. JQuery与GridView控件结合示例

    JQuery是一种非常强大的客户端JS编程技术,这里不想过多阐述它的相关背景知识,只想简单演示一下如何与asp.net的控件结合开发. 比如,我们要做一个下面如图所示的功能,效果是状态.编号.数字1. ...