随机存取文件流
RandomAccessFile类支持“随机访问”的方式,程序可以直接跳到文件的任意地方来读写文件
支持只访问的部分内容
可以向已存在的文件后追加内容
RandomAccessFile对象包含一个记录指针,用以标志当前读写处的位置。RandomAccessFile类对象可以自由移动记录指针:
long getFilePointer():获取文件记录指针的当前位置
void seek(long pos):将文件记录指针定位到pos位置
构造器
public RandomAccessFile(File file,String mode)
public RandomAccessFile(String name,String mode)
mode有四种:
r:以只读方式打开
rw打开以便读取和写入
rwd打开以便读取和写入:同步文件内容的更新
rws打开以便读取和写入:同步文件内容和元数据的更新
package IO;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.concurrent.locks.ReadWriteLock;
import org.junit.Test;
/*
* RandomAccessFile:支持随机访问
* 1.既可以充当一个输入流,又可以充当一个输出流
* 2.支持从文件的开头读取、写入
* 3.支持从任意位置读取或写入(插入)
* */
public class TestRandomAccessFile {
// 重构test3使得插入更通用(不止是一行的,整个文章的特定位置插入)
@Test
public void test4() {
RandomAccessFile randomAccessFile = null;
try {
randomAccessFile = new RandomAccessFile(new File("HelloIO"), "rw");
randomAccessFile.seek(3);
// String string = randomAccessFile.readLine();
// 将文章后面的字节,以每10个为单位添加到sb中
StringBuffer sBuffer = new StringBuffer();
byte[] bs = new byte[10];
int len;
while ((len = randomAccessFile.read(bs)) != -1) {
// sBuffer.append(bs);//不对,因为bs是字节数组,而append参数应该是字符串
sBuffer.append(new String(bs, 0, len));
}
randomAccessFile.seek(3);
randomAccessFile.write("xy".getBytes());
randomAccessFile.write(sBuffer.toString().getBytes());
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (randomAccessFile != null) {
try {
randomAccessFile.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
// 在文件的某个位置完成插入:
/*
* 先把指针移动对应位置 读出指针后面的一行到一个字符串中 把指针移到插入位置 写入操作(此时指针在写入后的最后位置正好) 把字符串写入
*
*/
@Test
public void test3() {
RandomAccessFile randomAccessFile = null;
try {
randomAccessFile = new RandomAccessFile(new File("HelloIO"), "rw");
randomAccessFile.seek(3);
String string = randomAccessFile.readLine();
randomAccessFile.write("xy".getBytes());
randomAccessFile.write(string.getBytes());
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (randomAccessFile != null) {
try {
randomAccessFile.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
// 在文件的某个位置进行覆盖的效果
@Test
public void test2() {
RandomAccessFile randomAccessFile = null;
try {
randomAccessFile = new RandomAccessFile(new File("HelloIO"), "rw");
randomAccessFile.seek(3);
randomAccessFile.write("xy".getBytes());
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (randomAccessFile != null) {
try {
randomAccessFile.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
// 进行文件的读取和写入
@Test
public void test1() {
// 进行文件的读取和写入
RandomAccessFile r1 = null;
RandomAccessFile r2 = null;
try {
// 读取的文件必须是存在的
r1 = new RandomAccessFile(new File("hadi.txt"), "r");
r2 = new RandomAccessFile(new File("file.txt"), "rw");
byte[] bs = new byte[20];
int len;
while ((len = r1.read(bs)) != -1) {
r2.write(bs, 0, len);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (r2 != null) {
try {
r2.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (r1 != null) {
try {
r1.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}