RandomAccessFile
InputStream/OutputStream
FileInputStream/FileOutputStream
BufferedInputStream/BufferedOutputStream
DataInputStream/DataOutputStream
PrintStream
ByteArrayInputStream/ByteArrayOutputStream
ObjectInputStream/ObjectOutputStream
Reader/Writer
InputStreamReader/OutputStreamWriter
FileReader/FileWiter
BufferedReader/BufferedWriter
PrintWriter
java.io.RandomAccessFile
- 读写文件中的字节数据。(注:字符也都是字节值)
- 用下标,读写文件中指定位置的字节值
- 从磁盘读到内存是输入
创建对象:
//创建方式1 (读写)
1、RandomAccessFile raf=new RandomAccessFile(文件,“rw”);
//创建方式2 (只读)
2、1、RandomAccessFile raf=new RandomAccessFile(文件,“r”);
输出方法write:
输出到文件
write(int b)
输出int四个字节中的末尾字节,截取出末尾最后一个字节值(强转成byte类型,保存末尾最后一个字节),写到文件。
【1】【2】【3】【4】- write(byte[] buf)
输出数组中全部字节值。 - write(byte[] buf, int from, int n)
输出数组中从from开始的n个字节值 - writeInt(int i)
输出int类型的4个字节值 - writeDouble(double d)
输出double类型的8个字节值 - writeUTF(String s)
先输出2个字节值,标示字符串的字节长度,再输出字符串的这些字节值
案例:
import java.io.FileNotFoundException;
import java.io.RandomAccessFile;
public class Test1 {
public static void main(String[] args) {
/**
* write(int b)
* write(byte[])
* write(byte[],from,n) 注:从from开始的n个字节值
*/
try {
RandomAccessFile raf=new RandomAccessFile("d:/f2", "rw");
raf.write(97);// 00 00 00 61 -->61 输出整数值
raf.write(98);
raf.write(99);
raf.write(257);//00 00 01 01 -->01
//创建数组,数组里放一些字节值
byte [] buf={100,101,102,103,104,105,106,107,108,109};
raf.write(buf);
raf.write(buf,4,3);
raf.close();//关闭,释放系统资源
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//运行程序后再D盘找到f2文件,使用UltraEdit查询字符串工具打开
//注:在UltraEdit中使用crtl+F12进行切换编码格式
读取方法read:
- 读取文件到内存
- read()
读取一个字节值,然后补三个零字节,变成int类型
【4】–>【1】【2】【3】【4】
读取结束之后,再读取,返回-1 - read(byte[] buf)
根据指定数组长度,读取一批字节值,并放入指定的数组中,返回数组的字节数量
读取结束之后,再读取,返回-1 - seek(int position)
定位下标位置 - getFilePointer()
获得下标当前所在的位置 - readInt()
读取4个字节值转成int - readDouble()
读取8个字节值转成double - readUTF()
先读取两个字节值,来确定字符串的字符长度,再读取这些字节值,专程String
案例:
import java.io.FileNotFoundException;
import java.io.RandomAccessFile;
import java.lang.reflect.Array;
import java.util.Arrays;
public class Test1 {
public static void main(String[] args) {
/**
* write(int b)
* write(byte[])
* write(byte[],from,n) 注:从from开始的n个字节值
*/
try {
RandomAccessFile raf=new RandomAccessFile("d:/f2", "rw");
/**
* 写:
*/
raf.write(97);// 00 00 00 61 -->61 输出整数值
raf.write(98);
raf.write(99);
raf.write(257);//00 00 01 01 -->01
//创建数组,数组里放一些字节值
byte [] buf2={100,101,102,103,104,105,106,107,108,109};
raf.write(buf2);
raf.write(buf2,4,3);
/**
* 读取:
*/
//指针定位到0位置
raf.seek(0);
/**
* 单字节读取标准格式
*/
int b;
while ((b=raf.read())!=-1) {
//从头到尾读取每一个字节值
System.out.println(b);
}
//从新定位到0位置
raf.seek(0);
/**
* 批量读取标准格式
*/
byte[] buf=new byte[5];
int n;//每次的个数
while((n=raf.read(buf))!=-1){
System.out.println(n+": "+Arrays.toString(buf));
}
raf.close();//关闭,释放系统资源
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
练习:
求目录的总大小
文件加密解密
更改字节值
文件加密逻辑:从文件当中读取一个字节值,对字节值进行加密处理,加密之后字节值会被修改成其他的值,再把他写会之前位置。每一个字节值都这样处理。
注意:下标。文件当中取出字节值之后,下标就会向后移动到下一个了,我们想要把他写回刚才位置时,要把下标位置向前定义回位置。
代码
import java.io.RandomAccessFile;
import java.util.Scanner;
public class Test2 {
public static void main(String[] args) {
System.out.println("输入文件路径: ");
String s=new Scanner(System.in).nextLine();
System.out.println("输入Key值: ");
int key=new Scanner(System.in).nextInt();
try {
//加密解密方法
encript(s,key);
System.out.println("完成");
} catch (Exception e) {
System.out.println("失败");
//打印完整异常信息
e.printStackTrace();
}
}
/**
* 加密解密方法
* @param path 文件路径 d:/abc.txt
* @param key
*/
private static void encript(String path, int key) throws Exception{
RandomAccessFile raf=new RandomAccessFile(path,"rw");
/**
* 单字节写
*/
// int b;
// while((b=raf.read())!=-1){
//
// b^=key;
// //得到当前下标值,往回定位
// raf.seek(raf.getFilePointer()-1);
// raf.write(b);
// }
/**
* 批量写
* 1k,2k,3k,4k
* 1024,2048,4096,8192
*/
byte[] buf=new byte[8192];
int n;//每次的个数
while((n=raf.read(buf))!=-1){
//对每一字节值进行加密处理,处理前面的n个
for(int i=0;i<n;i++){
//改
buf[i]^=key;
}
//改完后写会文件
raf.seek(raf.getFilePointer()-n);
raf.write(buf,0,n);
}
raf.close();
}
}