文章介绍
前面写的那篇IO流博客属实是刚自学完就乱写的,所以写的很乱并且没有写清楚。
因此,特意补上新的一篇博客,详细地讲解一下如何对文件进行操作。
首先,我们要知道对文件操作要用流。
因为我所写的案例是纯文本内容,所以我就直接用字符流操作文件了。但是如果有人想知道怎么用字节流的话可以私信我。人多的话,我就用字节流再写一篇。
字节流能够操作所有文件,利用它,我们可以对任意文件进行复制粘贴。
比如,我们可以将一张照片复制到另一个文件中去,或者将音乐复制到其它文件去。
然后我们就开始操作文件啦。
1.主类
import java.io.File;
import java.io.IOException;
import java.util.Scanner;
public class Test {
public static final File file=new File("user.txt");
static {
if(!file.exists()){
try {
file.createNewFile();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
public static void main(String[] args) {
System.out.println("请输入您的命令:");
System.out.println("0.退出 1.写入用户信息 2.读出用户信息 3.修改用户信息 4.删除用户信息");
Scanner in=new Scanner(System.in);
String order=in.nextLine();
while(!order.equals("0")){
if(order.equals("1")){
try {
new Add().add(file);
System.out.println("用户信息已保存至文件中!");
} catch (Exception e) {
System.out.println("用户信息写入失败!");
}
}else if(order.equals("2")){
try {
new Read().read(file);
} catch (Exception e) {
System.out.println("用户信息读出失败!");
}
}else if(order.equals("3")){
try {
new Read().read(file);
} catch (Exception e) {
System.out.println("用户信息读出失败!");
}
System.out.println("请输入您要修改的行数:");
int countLine=in.nextInt();
String xiushou=in.nextLine();
System.out.println("请输入您要修改的内容:");
String user=in.nextLine();
try {
new Update().update(file,countLine,user);
System.out.println("修改成功!");
} catch (Exception e) {
System.out.println("修改失败!");
}
}else if(order.equals("4")){
try {
new Read().read(file);
} catch (Exception e) {
System.out.println("用户信息读出失败!");
}
System.out.println("请输入您要删除的行数:");
int countLine=in.nextInt();
String xiushou=in.nextLine();
try {
new Delete().delete(file,countLine);
System.out.println("删除成功!");
} catch (Exception e) {
System.out.println("删除失败!");
}
}else{
break;
}
System.out.println();
System.out.println("0.退出 1.写入用户信息 2.读出用户信息 3.修改用户信息 4.删除用户信息");
order=in.nextLine();
}
System.out.println("谢谢使用!");
}
}
这个代码就是程序的起始,由它来调用各种方法,比如读取,修改,写入等等。
其实,对文件的操作只有两种,一是读出来,而是写进去。
其它所谓的,比如修改:不过是我们将文件读出来后,将它放到一个缓冲区域里进行修改再写进去而已。
我们先来看看从读取文件的代码
2.读取类
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
public class Read {
public void read(File file) throws Exception {
FileReader fr=new FileReader(file);
BufferedReader br=new BufferedReader(fr);
String line;
int count=0;
while( ( line=br.readLine() ) !=null){
count++;
System.out.println(count+":"+line);
}
br.close();
fr.close();
}
}
我们先看看效果:文件中已经存在了一行内容——ssad
是不是很简短呢?
这里我直接在方法体外面抛出了异常,所以就不需要一个一个try-catch了。
这里的read方法传进来一个file对象,这个对象就是我们要操作的文件。
其中 FileReader 就是字符读出流,将文件里的内容读出来。
BufferedReader 就是缓冲流,它相当于一个中间区域,它可以储存一定量的内容。
我们把文件里的内容读到缓冲区来,再打印出来。
其实,我们可以直接用FileReader 的Read方法,它可以直接读出字符串出来。
但是,BufferedReader中有一个按行读方法,readLine(),它一次可以刚好读出一行。
是一个非常好用的方法,所以我建议你们使用这种方法。
3.写入类
import java.io.*;
import java.util.Scanner;
public class Add {
public void add(File file) throws Exception {
FileWriter fw=new FileWriter(file,true);
BufferedWriter br=new BufferedWriter(fw);
Scanner in=new Scanner(System.in);
System.out.println("请输入用户信息:");
String user=in.nextLine();
br.write(user+"\n");
br.close();
fw.close();
}
}
看看效果:
这里,我们将从控制台输入的字符串赋值给String 对象user,然后将它作为参数传给write方法。
write方法就可以将这内容写进去。就相好比你输入进去一样。
为了能使每次输入的内容分开,我们可以给user字符串拼接一个"\n"。
这样子可以实现写入文件换行的效果。
4.修改类
import java.io.*;
public class Update {
public void update(File file,int lineCount,String user) throws Exception{
FileReader fr=new FileReader(file);
FileWriter fw=new FileWriter(file,true);
BufferedReader br=new BufferedReader(fr);
BufferedWriter bw=new BufferedWriter(fw);
String line;
int count=0;
while( ( line=br.readLine() ) !=null){
count++;
if(count!=lineCount){
bw.append(line+"\n");
}else{
bw.append(user+"\n");
}
}
FileWriter fwClean=new FileWriter(file,false);
fwClean.close();
bw.close();
br.close();
fr.close();
fw.close();
}
}
看看效果:
这个类比较复杂,因为我们要做两部操作,读出来再写进去。
因为IO本身是没有修改这种方法的,所以我们不得不将原来的文件读出来后,再找到自己要修改的那一行,修改后再写进去。
这里我们还传给了一个int参数,它是我们要修改的行数。
而那个String对象就是我们要修改的内容
这样我们就能实现对某一行的精准修改。
不过,还有很重要的一点。
有人私信问我为什么对文件修改会造成内容全部丢失。
这可能是因为修改文件时没有这样:
FileWriter fw=new FileWriter(file,true);
FileWriter是对文件进行写入的流,如果你只传一个文件对象进去,那么它默认就是将文件覆写。也就是在上面 true 的位置默认是false。
什么意思呢?就是将文件原来的内容全部清空后再从新写进去。
或者,还有可能是修改顺序出了问题。
在这个修改类中,我们先是将文件读出来,然后如果发现是自己要修改的内容就修改后写到缓冲区去,不是的话就原封不动地写到缓冲区去。
append方法就是将内容追加到缓冲流里面去,它不会删除之前的内容。
接着,我们要注意顺序!!!
到了这一步,我们只是将文件写到缓冲区而已,并没有写到文件中去。
想要写到文件中去,我们可以调用 BufferedWriter 的flush()方法。它就是缓冲区的内容写到文件中区的方法。
或者,我们将流关闭,也就是调用BufferedWriter的close()方法,close方法会调用flush方法。
不过,我们还不能把这些写到文件中去。
因为我们文件中还有旧的文件内容,我们要把它清除掉。
所以我们可以new一个新的流对象:FileWriter fw=new FileWriter(file,false);
new完之后立刻关闭,它就可以清空文件里的内容。
因为你给的是false参数,或者说不写这个参数也是一样的。
5.删除类
import java.io.*;
public class Delete {
public void delete(File file, int lineCount) throws Exception{
FileReader fr=new FileReader(file);
FileWriter fw=new FileWriter(file,true);
BufferedReader br=new BufferedReader(fr);
BufferedWriter bw=new BufferedWriter(fw);
String line;
int count=0;
while( ( line=br.readLine() ) !=null){
count++;
if(count!=lineCount){
bw.append(line+"\n");
}else{
bw.append("");
}
}
FileWriter fwClean=new FileWriter(file,false);
fwClean.close();
bw.close();
br.close();
fr.close();
fw.close();
}
}
看看效果:
这个代码和修改几乎一样,唯一区别就是对要删除的那一行内容将它变成空,像 “” 这样,就相当于你把它删除了。
如果还有不懂的话,或者有其它想法的可以私信我。
我看到就会及时回复的!