在前几次已经写完的管理系统中,我们总会发现当程序重新运行时,我们之前所存储的用户都得重新注册,这是因为在程序运行中我们所定义的用户仅仅存放在内存中而没有读入磁盘里。要解决这一问题那就要学习今天的读写文件。
在读写文件之前,我们首先要创建一个file文件,然后找到并定义此文件所在路径。
1.首先创建一个文件:
2.鼠标右击userdata.bkf,点击Copy Path/Reference,选择第一个(绝对路径)或者第二个相对路径。
3.定义刚刚复制的路径,创建一个file文件。
String path = "C:\\Users\\bkf\\IdeaProjects\\SummerTest\\files\\userdata.bkf";
File file = new File(path);
FileWriter fw = null;
写文件
4.1.创建一个写文件的对象fw,fw.write()是写内容的函数,fw.flush()可以看做是一把刷子,简单理解就是将写的内容刷到文件中,写完记得关闭文件fw.close()。
FileWriter fw = null;
fw = new FileWriter(file);
fw.write("hello world");
fw.flush();
fw.close();
但是仅仅写完是远远不够的,试想一下我们在写文件中,如果突然遇到电脑卡死或者突然断电等这些突发情况时,我们的写入文件会突然中断,程序也会中断,这需要我们将以上的代码执行时抛出运行时异常,这样就会避免一些不可控因素导致的程序错乱。
try{//创建文件写入流
fw = new FileWriter(file);
fw.write("hello world");
fw.flush();
fw.close();
}catch (IOException e)//抛出运行时异常
{
throw new RuntimeException(e);
}
读文件
4.2.创建一个读文件的对象fr,(本文件中的内容均以换行符和逗号分隔),注意在读文件中,fr.read()只能读取一个字符,如果要全部读入就必须利用循环,再循环语句中,结束循环的条件是read函数本身读取完毕时会输出一个-1,将这个作为结束循环的标志。在read函数中的返回值是int类型,所以如果不是-1的情况下,就必须将read函数读取到的内容进行强制转换为char类型。
4.3.如果想要分割读取每一组字符串,那就首先定义一个空字符串line,在定义一个字符串数组userData,将line里面的所有字符串全部以逗号分割,这样就实现了分割字符串的效果。
注:读文件同样需要抛出运行时异常。
try{
FileReader fr = new FileReader(file);
String line = "";
for (int i = 0;;i++)//循环读取
{
int n = fr.read();//读取一个字符
if(n == -1)//判断是否读取完毕
{
break;
}
char c = (char)n;//转换为字符
if (c == '\n')//判断是否是换行符
{//是
System.out.println(line);
String [] userData = line.split(",");//分割字符串
for (String s:userData)//遍历字符串数组
{
System.out.println(s);//输出
}
line = "";//重置
}
else
{//不是
line += c;//拼接字符串
}
}
System.out.println(line);
}catch (IOException e)
{
throw new RuntimeException(e);
}
以上内容是实现了在文件中的写入,但是多运行几次写文件会发现,我们每次写入的hello world总会覆盖上一次运行的hello world,这就叫做覆盖写入,那么如何在以前的基础上进行追加呢,这就需要用到FileWriter中的第二个参数。
将第二个参数设置为true即可实现文件的追加。
public class FileIO {
public static void main(String[] args) {
String path = "files/userdata.bkf";
File file = new File(path);
try {
FileWriter fw = new FileWriter(file,true);
fw.write("hello world");
fw.flush();
fw.close();
}catch (IOException e)
{
throw new RuntimeException(e);
}
}
}
还可以利用PrintStream函数实现文件的覆盖写入。
public class FileIO {
public static void main(String[] args) {
String path = "files/userdata.bkf";
File file = new File(path);
//利用PrintStream实现文件写入
try {
PrintStream ps = new PrintStream(file);
ps.println("hello world");
}catch (IOException e)
{
throw new RuntimeException(e);
}
}
}