`
大器晚成
  • 浏览: 52808 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

RandomAccessFile readUTF与我自己写的方法对比,官方为什么那么复杂?

阅读更多
我写的
RandomAccessFile raf=。。。
int len=raf.readShort()&0xffff;
byte[] name=new byte[len];
raf.read(name);
return new String(name,"utf-8");


readUTF源码
int utflen = in.readUnsignedShort();
        byte[] bytearr = null;
        char[] chararr = null;
        if (in instanceof DataInputStream) {
            DataInputStream dis = (DataInputStream)in;
            if (dis.bytearr.length < utflen){
                dis.bytearr = new byte[utflen*2];
                dis.chararr = new char[utflen*2];
            }
            chararr = dis.chararr;
            bytearr = dis.bytearr;
        } else {
            bytearr = new byte[utflen];
            chararr = new char[utflen];
        }

        int c, char2, char3;
        int count = 0;
        int chararr_count=0;

        in.readFully(bytearr, 0, utflen);

        while (count < utflen) {
            c = (int) bytearr[count] & 0xff;      
            if (c > 127) break;
            count++;
            chararr[chararr_count++]=(char)c;
        }

        while (count < utflen) {
            c = (int) bytearr[count] & 0xff;
            switch (c >> 4) {
                case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
                    /* 0xxxxxxx*/
                    count++;
                    chararr[chararr_count++]=(char)c;
                    break;
                case 12: case 13:
                    /* 110x xxxx   10xx xxxx*/
                    count += 2;
                    if (count > utflen)
                        throw new UTFDataFormatException(
                            "malformed input: partial character at end");
                    char2 = (int) bytearr[count-1];
                    if ((char2 & 0xC0) != 0x80)
                        throw new UTFDataFormatException(
                            "malformed input around byte " + count); 
                    chararr[chararr_count++]=(char)(((c & 0x1F) << 6) | 
                                                    (char2 & 0x3F));  
                    break;
                case 14:
                    /* 1110 xxxx  10xx xxxx  10xx xxxx */
                    count += 3;
                    if (count > utflen)
                        throw new UTFDataFormatException(
                            "malformed input: partial character at end");
                    char2 = (int) bytearr[count-2];
                    char3 = (int) bytearr[count-1];
                    if (((char2 & 0xC0) != 0x80) || ((char3 & 0xC0) != 0x80))
                        throw new UTFDataFormatException(
                            "malformed input around byte " + (count-1));
                    chararr[chararr_count++]=(char)(((c     & 0x0F) << 12) |
                                                    ((char2 & 0x3F) << 6)  |
                                                    ((char3 & 0x3F) << 0));
                    break;
                default:
                    /* 10xx xxxx,  1111 xxxx */
                    throw new UTFDataFormatException(
                        "malformed input around byte " + count);
            }
        }
        // The number of chars produced may be less than utflen
        return new String(chararr, 0, chararr_count);


为什么官方要这么复杂?
0
0
分享到:
评论

相关推荐

    java的RandomAccessFile对文件进行读写操作

    2. **定位与移动指针**:`RandomAccessFile`有一个名为`seek()`的方法,用于将文件读写指针移动到指定的位置。例如,要将指针移动到文件开头,可以调用`raf.seek(0)`。 3. **读写操作**: - **读操作**:可以使用`...

    JAVA随机存储流(RandomAccessFile)的应用

    Java中的`RandomAccessFile`是一个非常重要的类,它允许我们以随机访问模式读写文件,这意味着我们可以自由地在文件的任何位置进行读写操作,而不仅仅是顺序地从头到尾处理文件。这个类提供了对文件内容进行高效定位...

    RandomAccessFile类的用法.doc

    此外,RandomAccessFile的`length()`方法返回文件的长度(以字节为单位),这在检查文件大小或确定读写位置时非常有用。`getFilePointer()`方法可以获取当前文件指针的位置,而`setLength(long newLength)`则允许你...

    RandomAccessFile的用法

    与传统的输入/输出流不同,`RandomAccessFile`可以任意位置开始读写,这使得它在处理大文件或需要定位到特定数据时非常有用。下面将详细介绍`RandomAccessFile`的用法、特性以及一些关键方法。 1. **创建...

    RandomAccessFile向文件中写入中文

    #### 四、为什么 `write(String.getBytes())` 能正确写入中文? 1. **Java内部编码与文件系统编码差异**: - Java内部字符串采用Unicode编码。 - 文件系统通常采用本地编码(如GBK、GB18030等)。 - 当使用`...

    使用RandomAccessFile流将一个文本文件读出,并导致写入到另一个文件当中。

    下面我们将基于提供的代码片段,详细介绍如何利用`RandomAccessFile`类实现文件的读取与复制功能。 #### 一、`RandomAccessFile`简介 `RandomAccessFile`是Java标准库中用于处理文件的类之一,位于`java.io`包中。...

    体会RandomAccessFile

    首先创建了一个`RandomAccessFile`对象,并指定文件模式为“rw”,表示可读可写。 ```java RandomAccessFile in = new RandomAccessFile("employee.dat", "rw"); ``` 然后计算出文件中有多少条记录,并创建一个新...

    randomaccessfile例子

    RandomAccessFile处理文件的案例

    Java使用RandomAccessFile类对文件进行读写

    与标准的`FileInputStream`和`FileOutputStream`不同,`RandomAccessFile`不仅支持顺序读写,还能直接跳转到文件的任意位置进行读写,这得益于它的文件指针概念。 1. **RandomAccessFile类简介** `...

    【IT十八掌徐培成】Java基础第16天-01.RandomAccessFile.zip

    在处理大文件或需要高效访问特定位置数据的场景时,`RandomAccessFile`尤为有用。然而,使用时要注意文件的关闭,以确保数据被正确地写入磁盘,并释放系统资源。通常使用`finally`块或`try-with-resources`语句确保...

    RandomAccessFile 解决乱码

    ### RandomAccessFile 解决乱码 #### 背景与问题描述 在Java编程中,`RandomAccessFile` 类提供了一种方式来处理文件中的数据,允许程序随机访问文件的任何部分。但在处理中文或其他非ASCII字符时,可能会遇到乱码...

    基于RandomAccessFile文件分类的小程序

    这些关键字是文件分类的依据,例如,如果一个文件内容中包含了某个关键字,那么该文件就会被移动到与该关键字对应的文件夹里。这一步骤可能涉及到XML解析技术,如DOM(文档对象模型)或SAX(简单API for XML)。 ...

    JAVA文件操作——File 、 RandomAccessFile(上).mp4

    文件操作——File 、 RandomAccessFile(上).mp4

    RandomAccessFile(下).mp4

    RandomAccessFile(下).mp4

    RandomAccessFile随机文本,使用多线程处理

    RandomAccessFile随机文本,使用多线程处理复制文件

    NIO_RandomAccessFile_多线程_按行读本地CSV文件(java==> google guava包ListenableFuture)

    NIO_RandomAccessFile_多线程读本地CSV文件(java==&gt; google guava包ListenableFuture) reader里有个main函数,更改文件路径后,直接运行即可

    Java RandomAccessFile 指定位置实现文件读取与写入

    然而,由于`RandomAccessFile`不是`InputStream`或`OutputStream`的子类,它无法直接与其他基于流的I/O类配合使用,因此在处理复杂的数据流时,可能需要额外的转换步骤。此外,`RandomAccessFile`在处理大文件时效率...

    dnzyz.rar_RandomAccessFile_java 文件管理_文件操作

    - 如果在读写过程中遇到错误,可能需要使用`setLength()`方法调整文件长度。 总结,`RandomAccessFile`是Java中一个非常实用的文件操作工具,尤其适用于需要高效、灵活地访问文件数据的场景。通过熟练掌握它的使用...

    花1K内存实现高效I-O的RandomAccessFile类

    花1K内存实现高效I-O的RandomAccessFile类 ...我主要是用来优化Android上多线程断点下载的写文件效率 RandomAccessFile是操作硬盘的,比操作内存的数据慢了几百万倍, 所有有人做出优化,我特上传代码

Global site tag (gtag.js) - Google Analytics