程序在运行期间,大部分都在内存中进行操作,当程序结束或关闭时,这些数据将要消失 。如果需要永久保存这些数据,可以使用文件输入输出流 与指定的文件建立连接,数据将永久保存到文件中。这种操作也成为数据持久化。
一、FileInputStream类与FileOutputStream类
1. FileInputStream 类常用的构造方法
(1) FileInputStream(String name):使用给定的文件名 name 创建一个 FileInputStream 对象。
(2) FileInputStream(File file):使用 File 对象创建 FileInputStream对象,该方法允许再把文件连接输入流之前对文件做进一步分析。
2. FileOutputStream 类常用的构造方法
(1) FileOutputStream(File file):创建一个向指定File对象表示的文件中写入数据的文件输出流,数据会覆盖文件原来内容。
(2) FileOutputStream(File file,boolean append):如果第二个参数为 true,将字节写入文件末尾,不覆盖文件原来内容。
(3) FileOutputStream(String name):创建一个向具有指定文件名称的文件中写入数据的 输出文件流。
(4) FileOutputStream(String name,boolean append):创建一个向具有指定文件名称的 文件中写入数据的输出文件流。如果第二个参数为 true,将字节写入文件末尾,不覆盖文件原来内容。
3.代码演示如下:
package com.aiit.book.file;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileStreamTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
File file = new File("E:\\word.txt");//创建文件对象
try {
//创建FileOutputStream对象,用来向文件夹中写入数据
FileOutputStream out = new FileOutputStream(file,true);
String content = "我家大门常打开,开怀送抱等你来";
//创建字节数组,把将要写入的内容转换为字节数组
byte[] buy = content.getBytes();
try {
out.write(buy);//将数组中的信息写到文件中
out.close();//将流关闭
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
FileInputStream in = new FileInputStream(file);
//创建数组,来存储读取到的内容
byte[] byt = new byte[1024];
try {
/*
* 如果读到最后没有数据。则返回-1
* int read() 读取一个字节,并返回读取的字节
* int read(byte[] b) 读取多个字节,并存储到数组b中,从数组b的索引为0的地方开始存储,返回读取了几个字节
* int read(byte[] b,int off,int len)读取len个字节,从数组b的索引为off的地方开始存储
*/
//从文件中读出信息并存在字节数组中
int len = in.read(byt);
//将文件中的信息输出
System.out.println("文中的信息是:"+new String(byt, 0 ,len));
in.close();//关闭流
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
控制台输出结果及word.txt内容:
4.总结
FileInputStream FileOutputStream可以操作磁盘上文件的输入流字节流,在构造的时候给出文件的完整路径名。
缺点:在读取文本的时候非常不方便,需要按照字节进行操作,这也是字符流出现的原因。
优点:字节流不仅可以操作文本,还可以操作读取其他媒体:如mp3,图片,还有视频,这些都可以使用字节流进行操作。
FileInputStream字节流常用的API
fis.skip(len);//跳过一定字节
fis.read();//按照字节逐个读取
fis.read(byte[]);//从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中
fis.read(byte[],off,len);//将输入流中最多len个数据字节读入byte数组的偏移位置off处
fis.close();//关闭输入流
FileOutputStream字节流常用的API
write(byte[] b);//将 b.length 个字节写入此输出流
write(byte[] b, int off, int len);//将指定byte数组中从偏移量off开始的len个字节写入此输出流
write(int b);//将指定byte写入此输出流
void flush();//刷新此输出流,并强制将所有已缓冲的输出字节写入该流中
close()关闭流
二、FileReader类与FileWriter类
使用 FileOutputStream 类 向文件中写入数据与使用 FileInputStream 类从文件中将内容读出来,都存在一点不足,这两个类都只存在了对字节和字节数组的读取方法。但是汉字在文件中占用两个字节,因此采用字节流可能会出现乱码现象,因此采用 Reader或 Writer 类 。FileReader流读取文件,只要流不关闭,每次调用read()方法按顺序读取文件中的内容。FileWriter用于写入字符流 。
代码演示如下:
package com.aiit.book.file;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;
public class ReaderAndWriter {
public static void main(String[] args) {
// TODO Auto-generated method stub
while(true) {//设置无限循环,实现控制台多次输入
File file = new File("E:\\word.txt");
if(!file.exists()) {//如果文件不存在
try {
file.createNewFile();//创建文件
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("请输入要执行的操作步骤:(1.写入文件;2.读取文件)");
Scanner sc = new Scanner(System.in);
int choice = sc.nextInt();
switch(choice) {
case 1:
System.out.println("请输入要写入的内容");
String tempStr = sc.next();
try {
//FileWriter(file)写入文件中会替代文件中所有的信息
//FileWriter(file,true);创建可扩展的文件输出流,向文件中写入新数据时不覆盖已经存在的信息
FileWriter fw = new FileWriter(file,true);
fw.write(tempStr+"\r\n");//写入内容 并换行
fw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("上述内容已经写入文本中");
break;
case 2:
FileReader fr = null;
if(file.length()==0) {//如果文件没有内容
System.out.println("文本中的字符数为0!");
}else {
try {
fr = new FileReader(file);
char [] cbuf = new char[1024];//创建一个数组,用来存储读取的字符数的缓冲区
int hasread = -1;
try {
while((hasread = fr.read(cbuf))!=-1) {
System.out.println("文件内容:"+new String(cbuf,0,hasread));
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
fr.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
break;
default:
System.out.println("请输入符合要求的数字");
}
}
}
}
运行结果及word.txt文件内容: