• DataInputStream和DataOutputStream使用方法细节探讨


    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进制方式打开文件例如以下:

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

    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能够免去程序员对于长度的考虑,由于这两个函数为我们攻克了长度问题。写入了文件。因此我们无需关心。但这样就使用了额外的空间去记录长度信息。

    
  • 相关阅读:
    C# FileStream 文件复制
    DataSnap Server 客户端调用 异常
    抛出异常 exception
    RAD Tokyo 10.2.2
    delphi ios info.plist
    sql 日期格式
    sql server 2014登录账号
    sql server导入excel数据
    dev16 cxgrid 在DLL里报0地址错
    sql server 查看所有表记录数
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5367612.html
Copyright © 2020-2023  润新知