/**
* RandomAccessFile:既可以读又可以取的流,继承于字节流
* mode:
* r---只读(输入),不能自己创建文件
* rw---读取(输入输出),会创建文件
* rwd---读取(输入输出),可更新
* txt和png都可以正常复制
*/
@Test
public void test2() throws Exception {
//读,输入
//RandomAccessFile read = new RandomAccessFile("Test921复制文件.txt", "rw");
RandomAccessFile read = new RandomAccessFile("Test922示例图.png", "rw");
//取,输出
//RandomAccessFile write = new RandomAccessFile("Test926随机读取.txt", "rw");
RandomAccessFile write = new RandomAccessFile("Test922示例图复制.png", "rw");
int i ;
while (( i = read.read())!= -1){
write.write(i);
}
read.close();
write.close();
}
附加指定位置插入数据
/**
* 在原有的数据中插入xyz,我在里原有的数据为123456789
* 我要在3后面插入xyz
*/
@Test
public void test() throws Exception {
RandomAccessFile randomAccessFile = new RandomAccessFile("Test927.txt", "rw");
//指针指到索引为3的位置,实际在数组的4号位
randomAccessFile.seek(3);
byte[] bytes = new byte[2];
//可变的字符串,StringBuilder不同步,StringBuffer同步
//将索引后的所有数据以字符串的形式,储存,因为写入的时候会将后面的数据替换
//需要先复制后面的数据,添加xyz后在加上原来的数据
StringBuilder stringBuilder = new StringBuilder();
int len;
while ((len = randomAccessFile.read(bytes)) != -1) {
//将数据添加到stringBuilder的末尾(456789)
stringBuilder.append(new String(bytes, 0, len));
}
//打印复制的数据到控制台
System.out.println(stringBuilder);//456789
//调回指针,上面的指针已经到了末尾
randomAccessFile.seek(3);
//添加xyz从索引3的位置,且会替换掉之后的所有数据(456789)
randomAccessFile.write("xyz".getBytes());
//现在的指针在数据的末尾(123xyz),再将复制的字符串加入
randomAccessFile.write(stringBuilder.substring(0).getBytes());
//打印一下文件的内容到控制台
randomAccessFile.seek(0);
while ((len = randomAccessFile.read()) != -1) {
System.out.print((char) len);//123xyz456789
}
randomAccessFile.close();
}