DataInputStream和DataOutputStream使用方法细节探讨
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进制方式打开文件例如以下:
能够看出,第一个“世界”已经被截断,两个汉字都仅仅被写入了低位。因此肯定乱码。
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能够免去程序员对于长度的考虑,由于这两个函数为我们攻克了长度问题。写入了文件。因此我们无需关心。但这样就使用了额外的空间去记录长度信息。
相关文章
- Golang方法接收者
- 【架构师(第八篇)】脚手架之 commander 框架使用方法
- 【Linux 查看端口的方法】(linux产看端口)
- 历史探索Linux命令历史——简单方法搞定(如何查看linux命令)
- 时间探究Redis中Java设置过期时间的方法(redisjava过期)
- MySQL:修改配置文件的正确方法(mysql修改配置文件)
- SQL Server中修改列的方法(sqlserver改列)
- 文件Linux系统下创建文本文件的简便方法(linux创建一个文本)
- Mysql数据库迁移至C盘方法分享(mysql下到c盘了)
- Oracle中个位取整的方法(oracle个位取整)
- 研究Oracle NFS性能优化方法(oracle nfs性能)
- 如何让access自动编号从1开始排序实现方法
- .NET创建、删除、复制文件夹及其子文件的实例方法
- 防止浏览器记住用户名及密码的简单实用方法
- Javascript解析URL方法详解
- ThinkPHP实现一键清除缓存方法
- node.js中的fs.lstat方法使用说明
- C#窗体编程不显示最小化、最大化、关闭按钮的方法