RandomAccessFile类不属于流,是Object类的子类
RandomAccess支持对随机访问文件的读取和写入。随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组。存在指向该隐含数组的光标或索引,称为文件指针;输入操作从文件指针开始读取字节,并随着对字节的读取而前移此文件指针。如果随机访问文件以读取/写入模式创建,则输出操作也可用;输出操作从文件指针开始写入字节,并随着对字节的写入而前移此文件指针。写入隐含数组的当前末尾之后的输出操作导致该数组扩展。该文件指针可以通过 getFilePointer 方法读取,并通过 seek 方法设置。
已有文件作为RandomAccessFile打开的时候,这个文件并不会被删除。
read方法只读流中的数据,字节数据在网络中传输,数据可能刚到接收端(存储在TCP接收缓冲区)的可能只是其中一部分数据,其他还在路上或还没发,read读到就走,接收到的可能只是数据的一部分。readFully方法会阻塞等待,知道数据缓冲区装满。不过如果不是确定要用特定长度的数据,还是用read方法去读取。
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
public class RandomAccessFileJava {
public static void main(String[] args) throws IOException {
//创建文件
String strFile = "d:" + File.separator + "javatest" + File.separator + "IO_RandomAccessFileTest.txt";
File f = new File(strFile);
try(RandomAccessFile raf = new RandomAccessFile(f, "rw");)
{
//byte[] b = "写入数据...".getBytes();
//raf.write(b);
//boolean b = true;
//直接打开文件看到的是乱码
//raf.writeBoolean(b);
//String s = "写入数据...";
//raf.writeUTF(s);
//System.out.println(raf.readUTF());
//readLine()方法读到的数据是ISO-8859-1,如果有中文会显示乱码,需要进行转码
//下面这样很可能读到的数据控制台输出的时候会产生漏行,因为readLine()每次读取一行,在while()条件中读取了一次,这里是不会输出的
//只有println方法中的println才会输出
while(raf.readLine() != null) {
System.out.println(new String(raf.readLine().getBytes("ISO-8859-1"),"utf-8"));
}
//所以要改为
String ss = null;
while((ss = raf.readLine()) != null) {
System.out.println(new String(ss.getBytes("ISO-8859-1"),"utf-8"));
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}