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. cefSharp在XP下使得程序崩溃记录

    前言:这是一个奇葩的问题,到现在自己还没有搞明白问题出现在哪里,但是从问题总算是解决了,希望看到此文章的大牛,如果知道问题出在什么地方,可以告知一下. [一个在XP系统下面应用程序崩溃问题] 资源: ...

  2. 任务(Tasks)

    在Eclipse中用TODO标签管理任务,利用这个功能可以方便地将项目中一些需要处理的任务记录下来.我们可以通过在java注释里添加任务标签来标记一个任务,任务可以通过Tasks(任务)视图来察看. ...

  3. 2014搜狗前端面经【B事业部】

    本来就投了一份简历,后来又收到了个B事业部的面试电话,今天刚面完一面,总体感觉还是很基础的,其中一名面试官帅到不行啊!另一个也不差,真是幸胡...(sorry,跑题了...) 上来先做了份笔试题,超级 ...

  4. C++中string 的使用

    string类的构造函数:string(const char *s);    //用c字符串s初始化string(int n,char c);     //用n个字符c初始化此外,string类还支持 ...

  5. 两个实用的Python的装饰器

    两个实用的Python的装饰器 超时函数 这个函数的作用在于可以给任意可能会hang住的函数添加超时功能,这个功能在编写外部API调用 .网络爬虫.数据库查询的时候特别有用 timeout装饰器的代码 ...

  6. (转)QR二维码生成及原理

    二维码又称QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型:比如:字符,数字, ...

  7. html5 canvas图片渐变

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  8. openjdk sunjdk区别

    使用过LINUX的人都应该知道,在大多数LINUX发行版本里,内置或者通过软件源安装JDK的话,都是安装的openjdk,那么到底什么是openjdk,它与sun jdk有什么关系和区别呢? 历史上的 ...

  9. Linux下oracle导入(exp)导出(imp)出现"Failed to open ...for reader/write"错误

  10. 第二百三十二天 how can I 坚持

    早上竟然飘起了大学,可是就下了一会,没有一点学的痕迹. 博客园真不知道怎么回事了,字真的好小了. 晚上回来心情好不好,感觉好累,最近不知道怎么了,约罗娜出来吃个饭怎么都约不出来,咋办呢.哎,愁人. 最 ...