首页 > 其他分享 >文件写入读取

文件写入读取

时间:2022-12-01 01:44:38浏览次数:51  
标签:文件 字节 fis 写入 数组 new 读取

File类

操作文件的方法

createNewFile()		//创建新文件。
delete();		//直接从磁盘上删除
exists();		//查询磁盘中的文件是否存在
getAbsolutePath();	//获取绝对路径
getPath();		//获取相对路径
getName();		//获取文件名相当于调用了一个toString方法。
isFile();		//判断是否是文件
length();		//查看文件中的字节数
isHidden();		//测试文件是否被这个抽象路径名是一个隐藏文件。

操作目录的方法

exists();		//查询目录是否存在
isDirectory();		//判断当前路径是否为目录
mkdir();		//创建目录
getParentFile();	//获取当前目录的父级目录。
list();			//返回一个字符串数组,包含目录中的文件和目录的路径名。
listFiles();		//返回一个File数组,表示用此抽象路径名表示的目录中的文件。

IO流类的体系

  1. File:对文件或目录进行包装的类,使用io流以文件作为数据源或目的地时,需要用到File对其指定;

  2. RandomAccessFile:只能对文件进行读写操作的随机访问;

  3. FileInputStream:节点流,以字节为单位直接操作 "文件";

  4. ByteArrayInputStream:节点流,以字节为单位直接操作 "字节数组对象";

  5. ObjectInputStream:处理流,以字节为单位直接操作 "对象";

  6. DataInputStream:处理流,以字节为单位直接操作 "基本数据类型与字符串类型";

  7. FlieReader:节点流,以字符为单位直接操作 "文本文件";

  8. BufferedReader:处理流,将Reader对象进行包装,增加缓存功能,提高读写效率;

  9. BufferedInputStream:处理流,将InputStream对象进行包装,增加缓存功能,提高读写效率;

  10. InputStreamReader:处理流,将字节流对象转化为字符流对象;

  11. PrintStream:将OutputStream包装,更加灵活、方便的输出字符;

操作文件流

FileInputStream

FileInputStream fis = null;
fis = new FileInputStream("D:/test.txt"); //字节流读取字符文件时结果是ASCII码
int  temp = 0;
while((temp = fis.read()) != -1){
    System.out.println(temp);
}

字节流缓冲区

手动指定缓冲区

方式一:分批读取

创建一个指定长度的字节数组,适用于读取内存占用很大文件时,缓冲区长度定义在2的整数幂,一般是1024。效率慢,空间节省。

// todo 创建出FileInputStream(fis)
byte[] buff = new byte[1024]; // 字符缓存区只需定义char数组即可,其余不变
while ((temp = fis.read(buff)) != -1){ //之前是一次读一个字节,现在一次读一批
    fos.write(buff,0,temp); // 从buff读取字节,从0开始到temp结束
}
fos.flush(); // 将数据从内存写入磁盘
// todo 关闭流

方式二:一次性读取

创建一个指定长度的字节数组,长度由available()返回当前文件的预估长度,适用于读取内存占用不是很大的文件。效率快,空间浪费。

// todo 创建出FileInputStream(fis)
byte[] buff = new byte[fis.available()]; // 返回当前文件的预估大小,一次读完,不需要while
fis.read(buff); // 读取文件存入buff
fos.write(buff); // 将buffer数据写出
fos.flush(); // 将数据从内存写入磁盘
// todo 关闭流

字节缓冲流

BufferedInputStream和BufferedOutputStream,在字节流或处理流上添加缓冲功能的流,是处理流,通过内部缓存数组(默认长度8192==2的13次幂)来提高效率。

// 读取文件
fis = new FileInputStream("D:/test.txt");
bis = new BufferInputStream(fis);
// 写入文件
fos = new FileOutputStream("D:/test1.txt");
bos = new BufferOutputStream(foa);
int temp = 0;
// bis字节缓冲流里面自带缓存数组
while((temp=bis.read()) != -1){
    bos.write(temp);
}
bos.flush();
// todo 关闭流

字符缓冲流

BufferedReader / BufferedWriter,用此处理流包装节点流,使用readLine()方法,按行读取,newLine()换行,writer()按行写入。

FileWriter()默认覆盖原数据,指定参数true则开启追加模式。

写入:

FileWriter fileWriter = new FileWriter(new File(path));
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
bufferedWriter.write(strBean);
bufferedWriter.flush();
// 关闭流
bufferedWriter.close();
fileWriter.close();

读取:

FileReader fileReader = new FileReader(new File(path));
BufferedReader bufferedReader = new BufferedReader(fileReader);
String strBean = bufferedReader.readLine();
// 关闭流
bufferedReader.close();
fileReader.close();

转换流

注:为什么有转换流,作用是什么?https://blog.csdn.net/qq_43511405/article/details/108328792

InputStreamReader / OutputStreamWriter :将字节流转化字符流

使用场景:

实现从键盘按行输入,需要用到System.in字节流,而readLine()又需要Reader对象;

实现按行输出到显示器,需要用到System.out字节流,而Writer()又是Reader对象;

BufferedReader br = null;
BufferedWriter bw = null;
br = new BufferedReader(new InputStreamReader(System.in));
bw = new BufferedWriter(new OutputStreamWriter(System.out));
String s = br.readLine();
bw.write(s);

字符输出流

PrintWriter对象:println(String str)方法,自动刷新缓冲字符流,自动换行。

PrintWriter pw = new PrintWriter("d:/test.txt");
pw.println("我是一行字符");

字节数组流

ByteArrayInputStream / ByteArrayOutputStream

常用在流和字节数组转化的情况。

在网络传输的时候会用到字节数据流将流中数据写到字节数组,字节数组经过Datagrampacket包装在网络中传递。

 byte[] arr = "abcdefg".getBytes();
 ByteArrayInputStream bis = null; // 输入流
 ByteArrayOutputStream bos = null; // 输出流
 bis = new ByteArrayInputStream(arr); // 字节数组arr作为数据源读取数据 
 bos = new ByteArrayOutputStream;
 int i = 0;
 while((i = bis.read()) != -1){
 	bos.write(i);
 }
 byte[] bytes = bos.toByteArray(); // 转化成字节数组
 for(byte b : bytes){
 	System.out.println(b);
 }

数据流

处理流,DtatInputStream / DataOutputStream,将基本数据类型和字符串类型作为数据源,操作 int、double时可以使用字节流、操作String时可以使用字符流,这就导致操作时需要类型转化处理,数据流解决了这一麻烦。读取数据的时候注意按照写入的顺序读取,否则不能正确读取数据。

FileOutputStream fos = new FileOutputStream("D:/data.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos);
DataOutputStream dos = new DataOutputStream(bos);
dos.writeInt(10);
dos.writeChar("a");

对象流

  1. 可以实现对Java基本数据类型的读写,还可对对象进行读写;
  2. ObjectOutputStream:对象输出流,writeObject(Object obj)可对指定参数对象进行序列化,得到的字节序列写入目标输出流。
  3. ObjectInputStream:对象输入流,readObject()读取字节序列,并反序列化,返回对象。

序列化:把Java对象转化成字节序列,实现在网络上的对象传输,也可以存储在硬盘,实现持久化。

反系列化:接收网络传输的字节序列,恢复成Java对象。

只有实现Serializable接口的类的对象才能被序列化和反序列化,空接口,标识作用。

序列化:将字符序列写到 D:/TestSerializable.txt

ObjectOutputStream oos = null;
oos = new ObjectOutputStream(new FileOutputStream("D:/TestSerializable.txt"));
User user = new User("zyg",18);
oos.writeObject(user);
oos.flush();
// todo 关闭流

反序列化:

ObjectInputStream ois = null;
ois = new ObjectInputStream(new FileInputStream("D:/TestSerializable.txt"));
User user = (User)ois.readObject();
// todo 关闭流

Apache-IO

FileUtils

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>
// 写入
FileUtils.writeStringToFile(file, str, StandardCharsets.UTF_8, false); // false:拒绝追加
// 读取
String s = FileUtils.readFileToString(new File("d:/RandomAccessFile.txt"), "utf-8");

标签:文件,字节,fis,写入,数组,new,读取
From: https://www.cnblogs.com/zygln/p/16940279.html

相关文章