我写的
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);
为什么官方要这么复杂?
分享到:
相关推荐
2. **定位与移动指针**:`RandomAccessFile`有一个名为`seek()`的方法,用于将文件读写指针移动到指定的位置。例如,要将指针移动到文件开头,可以调用`raf.seek(0)`。 3. **读写操作**: - **读操作**:可以使用`...
Java中的`RandomAccessFile`是一个非常重要的类,它允许我们以随机访问模式读写文件,这意味着我们可以自由地在文件的任何位置进行读写操作,而不仅仅是顺序地从头到尾处理文件。这个类提供了对文件内容进行高效定位...
此外,RandomAccessFile的`length()`方法返回文件的长度(以字节为单位),这在检查文件大小或确定读写位置时非常有用。`getFilePointer()`方法可以获取当前文件指针的位置,而`setLength(long newLength)`则允许你...
与传统的输入/输出流不同,`RandomAccessFile`可以任意位置开始读写,这使得它在处理大文件或需要定位到特定数据时非常有用。下面将详细介绍`RandomAccessFile`的用法、特性以及一些关键方法。 1. **创建...
#### 四、为什么 `write(String.getBytes())` 能正确写入中文? 1. **Java内部编码与文件系统编码差异**: - Java内部字符串采用Unicode编码。 - 文件系统通常采用本地编码(如GBK、GB18030等)。 - 当使用`...
下面我们将基于提供的代码片段,详细介绍如何利用`RandomAccessFile`类实现文件的读取与复制功能。 #### 一、`RandomAccessFile`简介 `RandomAccessFile`是Java标准库中用于处理文件的类之一,位于`java.io`包中。...
首先创建了一个`RandomAccessFile`对象,并指定文件模式为“rw”,表示可读可写。 ```java RandomAccessFile in = new RandomAccessFile("employee.dat", "rw"); ``` 然后计算出文件中有多少条记录,并创建一个新...
RandomAccessFile处理文件的案例
与标准的`FileInputStream`和`FileOutputStream`不同,`RandomAccessFile`不仅支持顺序读写,还能直接跳转到文件的任意位置进行读写,这得益于它的文件指针概念。 1. **RandomAccessFile类简介** `...
在处理大文件或需要高效访问特定位置数据的场景时,`RandomAccessFile`尤为有用。然而,使用时要注意文件的关闭,以确保数据被正确地写入磁盘,并释放系统资源。通常使用`finally`块或`try-with-resources`语句确保...
### RandomAccessFile 解决乱码 #### 背景与问题描述 在Java编程中,`RandomAccessFile` 类提供了一种方式来处理文件中的数据,允许程序随机访问文件的任何部分。但在处理中文或其他非ASCII字符时,可能会遇到乱码...
这些关键字是文件分类的依据,例如,如果一个文件内容中包含了某个关键字,那么该文件就会被移动到与该关键字对应的文件夹里。这一步骤可能涉及到XML解析技术,如DOM(文档对象模型)或SAX(简单API for XML)。 ...
文件操作——File 、 RandomAccessFile(上).mp4
RandomAccessFile(下).mp4
RandomAccessFile随机文本,使用多线程处理复制文件
NIO_RandomAccessFile_多线程读本地CSV文件(java==> google guava包ListenableFuture) reader里有个main函数,更改文件路径后,直接运行即可
然而,由于`RandomAccessFile`不是`InputStream`或`OutputStream`的子类,它无法直接与其他基于流的I/O类配合使用,因此在处理复杂的数据流时,可能需要额外的转换步骤。此外,`RandomAccessFile`在处理大文件时效率...
- 如果在读写过程中遇到错误,可能需要使用`setLength()`方法调整文件长度。 总结,`RandomAccessFile`是Java中一个非常实用的文件操作工具,尤其适用于需要高效、灵活地访问文件数据的场景。通过熟练掌握它的使用...
花1K内存实现高效I-O的RandomAccessFile类 ...我主要是用来优化Android上多线程断点下载的写文件效率 RandomAccessFile是操作硬盘的,比操作内存的数据慢了几百万倍, 所有有人做出优化,我特上传代码