IO(4)

来源:互联网 发布:销售管理系统源码 编辑:程序博客网 时间:2024/06/06 03:20
今天认真的重新的学习一下编码!
什么是编码呢?这个很好理解,比如英文,很多老外都可以看懂,那是他们多年的经验而对交流的一种编码方式,让他们一看到这种编码,就知道这个字什么意思。中文也是一种编码方式,我们都可以约定俗成一看就知道其代码其意思。
计算机也一样,从字节向字符的编码,每个国家都采用了不同的编码方式。在java中我们可以用:
import java.nio.charset.Charset;
import java.util.*;
public class demo6{
    public static void main(String[] args){
        Map<String,Charset> charsets = Charset.availableCharsets();
        for(String name:charsets.keySet())
            System.out.println(name);
        for(Charset value:charsets.values())
            System.out.println(value);
    }
}
进行打印出所有字符集的名字。
下面来介绍一下java.nio中的一个类CharSet类,先给出一个例子:
import java.nio.*;
import java.nio.charset.Charset;

public class demo{
    public static void main(String[] args){
        String s = "asdfasd";
        Charset cset = Charset.forName("ISO-8859-1");
        ByteBuffer buffer = cset.encode(s);
        byte[] bytes = buffer.array();
        System.out.println(bytes);
        CharBuffer cbuf = cset.decode(buffer);
        String str = cbuf.toString();
        System.out.println(str);
    }
}
CharSet类中有两个非常重要的方法:
public final ByteBuffer encode(CharBuffer cb)//ByteBuffer是字节缓冲区,CharBuffer是字符缓冲区
将此 charset 中的 Unicode 字符编码成字节的便捷方法。
参数:
   cb - 要编码的 char 缓冲区
返回:
   包含已编码字符的 byte 缓冲区
这个方法就是把字符重新编码为字节,方便下面这个方法对字节重新解码成为自己想要的那种字符。

public final CharBuffer decode(ByteBuffer bb)
将此 charset 中的字节解码成 Unicode 字符的便捷方法。
参数:
   bb - 要解码的 byte 缓冲区
返回:
   包含已解码字符的 char 缓冲区
这里就可以把字节解码成为你想要的那种字符,当前你必须先调用CharSet.forName(""),指定你想要的编码方式。

ByteBuffer是非阻塞通讯中一个非常重要的工具,在socket我再总结它,这里先稍微的记录一下它的简单用法先,如果把ByteBuffer转成byte和如何把byte包装成ByteBuffer:
public final byte[] array()
返回实现此缓冲区的 byte 数组

public static ByteBuffer wrap(byte[] array)
将 byte 数组包装到缓冲区中

public static ByteBuffer wrap(byte[] array,
                              int offset,
                              int length)

将 byte 数组包装到缓冲区中。
参数:
    array - 支持新缓冲区的数组
    offset - 要使用的子数组的偏移量;必须为非负且不大于 array.length。将新缓冲区的位置设置为此值。
    length - 要使用的子数组的长度;必须为非负且不大于 array.length - offset。将新缓冲区的界限设置为 offset + length。
返回:
    新的字节缓冲区

CharBuffer类:
public final char[] array()
返回实现此缓冲区的字符数组

public final char charAt(int index)
读取相对于当前位置的给定索引处的字符。

public String toString()
这个很简单.

这两个类都是继承Buffer类来的,在跟他们同级别的类还有DoubleBuffer, FloatBuffer, IntBuffer, LongBuffer, ShortBuffer其方法都跟前面两个大同小异,具体看API。
 

整理一下DataOutput和DataInput这两个接口,这两个接口比较简单。
DataOutput 接口用于将数据从任意 Java 基本类型转换为一系列字节,并将这些字节写入二进制流;
DataInput 接口用于从二进制流中读取字节,并根据所有 Java 基本类型数据进行重构;
但是从这两个接口继承出来的子类就具多了,可以对数据类型操作的,可以对对象操作的,可以对文件操作的,可以对图片操作等等.....
先把DataOutputStream和DataInputStream总结一下,其他都相似。
DataOutputStream:
writeChars
writeByte
writeInt
writeShort
writeLong
writeFloat
writeDouble
writeChar
writeBoolean
writeUTF

DataInputStream:
readInt
readShort
readLong
readFloat
readDouble
readChar
readBoolean
readUTF
原创粉丝点击