JavaIO流中如何对文件进行读出,写入,修改和删除详解版(新)

文章介绍

前面写的那篇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

4942ba540f9544908ee8b23b9c7daf49.png

 

是不是很简短呢?

这里我直接在方法体外面抛出了异常,所以就不需要一个一个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();
    }
}

看看效果:

60608bd2a3e44926bcb9c2b3526dda10.png

 

这里,我们将从控制台输入的字符串赋值给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();
    }
}

看看效果:

5a081a355a1942f684e49a1492460cbf.png

 

这个类比较复杂,因为我们要做两部操作,读出来再写进去。

因为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();
    }
}

看看效果:

2e855090af9e4c9e84734c7f73d1b3f1.png

这个代码和修改几乎一样,唯一区别就是对要删除的那一行内容将它变成空,像  “”  这样,就相当于你把它删除了。

如果还有不懂的话,或者有其它想法的可以私信我。

我看到就会及时回复的!

 

  • 12
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值