IO_RandomAccessFile

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();
		}
	}
}
原文地址:https://www.cnblogs.com/changzuidaerguai/p/9275896.html