Java I/O流中众多流,都有各自的优点。那么今天所讲解的随机流又是怎样的一种读写操作呢?往下看:
随机流:
通过前面的讲解,我们已经知道,如果要对一个文件读取、写入内容我们需要创建两个流,一个输入流一个输出流。那有没有一种方法能够创建一个流就可以进行读取和写入操作呢?当然有了,这就是我们的随机流(RandomAccessFile类)。
RandomAccessFile类所创建的流就称为随机流。这种流的指向既可以作为流的源,也可以作为流的目的地。
能明白不?说明白点吧,就是创建这一个流既能读取文件中的内容,也能通过这个流写入文件中内容。不需要像之前一样,创建了输入流又要创建输出流。
要点一: 构造方法:
RandomAccessFile(String name,String mode);
参数name用来指定文件名,也就是指定流的源同时也是目的地。参数mode可以取r(只读)或者rw(可读写),这是决定流对文件的访问权利。
RandomAccessFile(File file,String mode);
参数file是传入一个File类的对象,也是用来指定流的源和目的地用的。参数mode与上面一样。
特别需要注意的是:RandomAccessFile流指向文件时,不刷新文件。所以即使文件中有内容,再往里添加内容,之前的内容也不会消失。
要点二: 我们通过构造方法创建好流之后,接着就是需要用方法来对文件进行读写操作了。
在RandomAccessFile类中方法有多种,下面我将给出常用方法以及对应的描述:
方法 描述
getFilePointer() 获取当前读写的位置
length() 获取文件的长度
close() 关闭文件
read() 从文件中读取一个字节的数据
readBoolean() 从文件中读取一个布尔值,0代表false,其他值代表true
readByte() 从文件中读取一个字节
readChar() 从文件中读取一个字符(2个字节)
readDouble() 从文件中读取一个双精度浮点值(8个字节)
readFloat() 从文件中读取一个单精度浮点值(4个字节)
readFully(byte b[]) 读b.length个字节放入数组b中,完全填满该数组
readInt() 从文件中读取一个int值(4个字节)
readLine() 从文件中读取一个文本行
readLong() 从文件中读取一个长整型(8个字节)
readShort() 从文件中读取一个短整型(2个字节)
readUnsignedByte() 从文件中读取一个无符号字节(1个字节)
readUnsignedShort() 从文件中读取一个无符号短型值(2个字节)
readUTF() 从文件中读取一个UTF字符串
seek(long position) 定位读写位置
setLength(long newlength)设置文件的长度
skipBytes(int n) 在文件中跳过给定数量的字节
write(byte b[]) 写b.length个字节到文件中
writeBoolean(boolean v)把一个布尔值作为单位字节值写入文件
writeByte(int v) 向文件写入一个字节
writeBytes(String s)向文件写入一个字符串
writeChar(char c) 向文件写入一个字符
writeChars(String s)向文件写入一个作为字符数据的字符串
writeDouble(double v)向文件写入一个双精度浮点值
writeFloat(float v) 向文件写入一个单精度浮点值
writeInt(int v) 向文件写入一个int值
writeLong(long v) 向文件写入一个长型int值
writeShort(int v) 向文件写入一个短型int值
writeUTF(String s) 向文件写入一个UTF字符串
下面我拿其中的几个方法来做个示例:
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Scanner;
public class Main{
public static void main(String[] args) throws IOException {
File file = new File("E:\\Java\\read.txt");
try {
RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw");
int len = (int) randomAccessFile.length();
byte[]a = new byte[len];
for (int i = 0; i < a.length; i++) {
a[i] = randomAccessFile.readByte();
}
randomAccessFile.close();
// String str = new String(a,"utf-8");
// System.out.println(str);
RandomAccessFile writeAccessFile = new RandomAccessFile("E:\\Java\\writer.txt", "rw");
for (int i = 0; i < a.length; i++) {
writeAccessFile.writeByte(a[i]);
}
System.out.println("数据成功复制到另一文件中。");
System.out.print("请输入要追加的内容:");
String input = new Scanner(System.in).nextLine();
byte b[] = input.getBytes("utf-8"); //把输入的内容转编码格式到byte数组里面,切记,数组设置编码只能是byte类型数组
for (int i = 0; i < b.length; i++) {
writeAccessFile.writeByte(b[i]);
}
// writeAccessFile.writeUTF(input);
writeAccessFile.close();
System.out.println("追加成功!");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}