io - Java的DataInputStream的readUTF方法是怎么读取字符串的???
大家讲道理
大家讲道理 2017-04-18 10:08:37
0
2
440
大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

membalas semua(2)
左手右手慢动作

DataOutputStream

static int writeUTF(String str, DataOutput out) throws IOException {
    int strlen = str.length();
    int utflen = 0;
    int c, count = 0;

    /* use charAt instead of copying String to char array */
    for (int i = 0; i < strlen; i++) {
        c = str.charAt(i);
        if ((c >= 0x0001) && (c <= 0x007F)) {
            utflen++;
        } else if (c > 0x07FF) {
            utflen += 3;
        } else {
            utflen += 2;
        }
    }

    if (utflen > 65535)
        throw new UTFDataFormatException(
            "encoded string too long: " + utflen + " bytes");

    byte[] bytearr = null;
    if (out instanceof DataOutputStream) {
        DataOutputStream dos = (DataOutputStream)out;
        if(dos.bytearr == null || (dos.bytearr.length < (utflen+2)))
            dos.bytearr = new byte[(utflen*2) + 2];
        bytearr = dos.bytearr;
    } else {
        bytearr = new byte[utflen+2];
    }

    // 将字符串的字节长度写入流中
    bytearr[count++] = (byte) ((utflen >>> 8) & 0xFF);
    bytearr[count++] = (byte) ((utflen >>> 0) & 0xFF);

    int i=0;
    for (i=0; i<strlen; i++) {
       c = str.charAt(i);
       if (!((c >= 0x0001) && (c <= 0x007F))) break;
       bytearr[count++] = (byte) c;
    }

    for (;i < strlen; i++){
        c = str.charAt(i);
        if ((c >= 0x0001) && (c <= 0x007F)) {
            bytearr[count++] = (byte) c;

        } else if (c > 0x07FF) {
            bytearr[count++] = (byte) (0xE0 | ((c >> 12) & 0x0F));
            bytearr[count++] = (byte) (0x80 | ((c >>  6) & 0x3F));
            bytearr[count++] = (byte) (0x80 | ((c >>  0) & 0x3F));
        } else {
            bytearr[count++] = (byte) (0xC0 | ((c >>  6) & 0x1F));
            bytearr[count++] = (byte) (0x80 | ((c >>  0) & 0x3F));
        }
    }
    out.write(bytearr, 0, utflen+2);
    // 写入的长度在字符串中增加了2,即字节长度标识所占用的资源
    return utflen + 2;
}

DataInputStream

public final static String readUTF(DataInput in) throws IOException {
    // 读取字符串字节长度
    int utflen = in.readUnsignedShort();
    //...
}

Malah, apabila memanggil writeUTF untuk menulis, jdk secara dalaman menulis bilangan bait rentetan ke dalam strim Apabila membaca, panjang bait dibaca dahulu dan panjang bait dibaca mengikut panjang bait yang ditentukan rentetan yang sepadan.

左手右手慢动作

看源码,调用的第一句就获取了长度
int utflen = in.readUnsignedShort();
这个方法的Doc :

Membaca dua bait input dan mengembalikan nilai int dalam julat 0 hingga

  1. Biar a menjadi bait pertama dibaca dan b menjadi bait kedua. Nilai yang dikembalikan ialah:

(((a & 0xff) << 8) | (b & 0xff)) Kaedah ini sesuai untuk membaca
bait yang ditulis oleh kaedah writeShort antara muka DataOutput jika
hujah untuk writeShort bertujuan untuk menjadi nilai dalam julat 0
hingga 65535. Pengembalian: nilai 16-bit yang tidak ditandatangani dibaca. Lontaran:
EOFException - jika aliran ini sampai ke penghujung sebelum membaca semua

  1. IOException - jika ralat I/O berlaku.

bacaUTF的Doc:

Membaca daripada strim dalam perwakilan aksara Unikod
rentetan yang dikodkan dalam format UTF-8 yang diubah suai; rentetan aksara ini
kemudian dikembalikan sebagai Rentetan. Butiran perwakilan UTF-8
yang diubah suai adalah sama seperti kaedah readUTF
DataInput.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan