java 读取写入文件文本内容的多种方式及推荐

java 读取写入文件文本内容的多种方式及推荐

写入操作

  1. Java使用OutputStream写入文本文件

  2. Java使用PrintWriter写入文本文件

  3. Java使用FileWriter写入文本文件

  4. Java使用BufferedWriter写入文本文件

1.使用java.io.OutputStream写入文本文件

File file =new File("D:"+ File.separator+"testFileContent.txt");
        if(!file.getParentFile().exists()){//文件不在
            file.getParentFile().mkdirs();//创建父路径
        }
        try {
            
           OutputStream outputStream=new FileOutputStream(file,false);//true表示拼接
            String str1 ="菜鸟教程\r\n";
            //outputStream.write(str.getBytes());//只能输出字节数组
            //outputStream.write(str.getBytes("ISO8859-1"));//只能输出字节数组
            outputStream.write(str1.getBytes("UTF-8"));//只能输出字节数组
            String str2 ="www.runoob.com\r\n";
            outputStream.write(str2.getBytes("UTF-8"));//只能输出字节数组

            String str3 ="姓名:%s,年龄:%d,收入:%9.2f\r\n";
            outputStream.write(str3.getBytes("UTF-8"));//只能输出字节数组
        } catch (IOException e) {
            e.printStackTrace();
        }

利用字节流进行处理的时候,并不会使用到缓冲区,只能输出字节数组。不推荐!

2.使用java.io.PrintWriter写入文本文件

File file=new File("D:"+ File.separator+"testFileContent.txt");//定义操作文件
        PrintWriter pu=new PrintWriter(new FileOutputStream(file));
        String name="小童子";
        int age=78;
        double salary=72800;
        //pu.printf("姓名:%s,年龄:%d,收入:%9.2f",name,age,salary);
        pu.write("菜鸟教程");
        pu.write("www.runoob.com");
        pu.write("姓名:%s,年龄:%d,收入:%9.2f");
        pu.close();

  PrintWriter:是具有自动行刷新的缓冲字符输出流,这是一个高级流。所谓的自动行刷新,意思就是说:在构造函数中指定autoFlush的值为true时,则 println()printf() 或 format() 方法将自动刷新输出缓冲区(自动调用flush()方法),但是,自动行刷新无疑会增加写出次数而降低写出效率。

  从PrintWeiter的构造方法中我们就可以知道,该高级流很灵活,接下来我们会介绍BufferedWriter/BufferedReader这一对字符缓冲流,但是,由于BufferedWriter没有PrintWriter使用灵活,所以在实际的操作中,我们往往会使用PrinterWriter/BufferedReader这种组合。

PrintStream也可以代替PrintWriter,比较一下PrintStream与PrintWriter的区别

          在操作对象上

         PrintStream主要操作字节流,也就是说打印出来所有字符按照平台的编码转换为字节,所以一般用于二进制文件。(文本文件也是可以的)。字符串转换为字节流是平台相关的,也就是说 不同的系统或者环境,可能对于同一份字符串的输出字节流会有差异,不能够跨平台

          PrintWriter主要操作字符,可以创建指定的字符集,一般用来读取文本文件,因为默认用unicode编码,所以PrintWriter的跨平台性要比PrintStream好,也就是说PrintWriter可用于操作中文。

        在自动刷新方面

          PrintStream在遇到换行符的时候就会自动刷新,即在调用了println()方法,或者文本中出现“\n”,就会自动flush

          PrintWriter则不会,要在构造方法中设置自动刷新,或者手动flush。参考这个方法设置自动更新:PrintWriter(OutputStream out, boolean autoFlush) 。autoFlush,该参数为boolean值,该值为true时,则具有了自动行刷新功能。

所以,PrintWriter不但能接收字符流,也能接收字节流。推荐!

3.使用java.io.FileWriter写入文本文件

File file =new File("D:"+ File.separator+"testFileContent.txt");
        if(!file.getParentFile().exists()){//文件不在
            file.getParentFile().mkdirs();//创建父路径
        }
try {
            //字符流,优势:中文处理方便!
            Writer out=new FileWriter(file);
            String str ="菜鸟教程\n";
            out.write(str);//可以输出字符串
            out.append("www.runoob.com\n");//追加输出字符串
            out.append("姓名:%s,年龄:%d,收入:%9.2f\n");//追加输出字符串
            out.close();//字符输出流必须关闭
        } catch (IOException e) {
            e.printStackTrace();
        }

4.使用java.io.BufferedWriter写入文本文件

//创建一个字符缓冲输出流对象
        BufferedWriter bw = new BufferedWriter(new FileWriter("D:"+ File.separator+"testFileContent.txt")) ;
        //写数据
        bw.write("菜鸟教程\r\n");
        bw.write("www.runoob.com\n");
        bw.write("姓名:%s,年龄:%d,收入:%9.2f\r\n");
        //刷新流
        bw.flush();
        //关闭资源
        bw.close();

BufferedWriter:字符缓冲输出流(高级流),将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。 可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。BufferedWriter只能对字符流进行操作。

PrintWriter和BufferedWriter都是继承java.io.Writer,所以很多功能都一样。不过PrintWriter提供println()方法可以写不同平台的换行符,而BufferedWriter可以任意设定缓冲大小。OutputStream可以直接传给PrintWriter(BufferedWriter不能接收)。

Socket编程中,尽量用PrintWriter取代BufferedWriter,下面是PrintWriter的优点:

1. PrintWriter的print、println方法可以接受任意类型的参数,而BufferedWriter的write方法只能接受字符、字符数组和字符串;

2. PrintWriter的println方法自动添加换行,BufferedWriter需要显示调用newLine方法;

3. PrintWriter的方法不会抛异常,若关心异常,需要调用checkError方法看是否有异常发生;

4. PrintWriter构造方法可指定参数,实现自动刷新缓存(autoflush);

5. PrintWriter的构造方法更广。

 

读取操作

  1. Java read text file using FileInputStream class
    Java使用FileInputStream读取文本文件
  2. Java read text file using Files class
    Java使用Files类读取文本文件
  3. Read text file in java using FileReader
    使用FileReader读取Java中的文本文件
  4. Java read text file using BufferedReader
    Java使用BufferedReader读取文本文件
  5. Using Scanner class to read text file in java
    使用Scanner类读取Java中的文本文件

首先准备文档,路径:D:\testFileContent.TXT

菜鸟教程
www.runoob.com
姓名:%s,年龄:%d,收入:%9.2f

1.使用java.io.FileInputStream在Java中读取文本文件:

File file =new File("D:"+ File.separator+"testFileContent.txt");
        InputStream input=new FileInputStream(file) ;
        byte data[]=new byte[1024]; //开辟一个缓冲区读取数据
        int len=input.read(data);
        System.out.println("【"+new String(data)+"】");
        input.close();

输出(输出结果相同,下面例子省略...)

菜鸟教程
www.runoob.com
姓名:%s,年龄:%d,收入:%9.2f

最原始的方法,利用字节流读取数据,而且必须开辟缓冲区。不建议

 

2.Java使用java.nio.file.Files读取文本文件:

String fileName = "D:"+ File.separator+"testFileContent.txt";
        Path path = Paths.get(fileName);
        byte[] bytes = Files.readAllBytes(path);
        List<String> allLines = Files.readAllLines(path, StandardCharsets.UTF_8);
        for (int i = 0; i < allLines.size(); i++) {
            System.out.println(allLines.get(i));
        }

我们可以使用Files类将文件的所有内容读入字节数组。 Files类还具有一种读取所有行到字符串列表的方法。 Files类是Java 7中引入的,如果要加载所有文件内容,则很好。 仅在处理小型文件并且需要所有文件内容在内存中时,才应使用此方法

 

3.使用java.io.FileReader在Java中读取文本文件:

String fileName = "D:"+ File.separator+"testFileContent.txt";
        File file = new File(fileName);
        FileReader fr = new FileReader(file);
        BufferedReader br = new BufferedReader(fr);
        String line;
        while((line = br.readLine()) != null){
            //process the line
            System.out.println(line);
        }

您可以使用FileReader获取BufferedReader,然后逐行读取文件。 FileReader不支持编码,并且与系统默认编码一起使用,因此,这不是在Java中读取文本文件的非常有效的方法

 

4.Java使用java.io.BufferedReader读取文本文件:

String fileName = "D:"+ File.separator+"testFileContent.txt";
        File file = new File(fileName);
        FileInputStream fis = new FileInputStream(file);
        InputStreamReader isr = new InputStreamReader(fis);
        BufferedReader br = new BufferedReader(isr);

        String line;
        while((line = br.readLine()) != null){
            //process the line
            System.out.println(line);
        }
        br.close();

如果要逐行读取文件并对其进行处理,则BufferedReader很好。 这对于处理大文件非常有用,并且还支持编码。BufferedReader是同步的,因此可以安全地从多个线程完成对BufferedReader的读取操作。 BufferedReader的默认缓冲区大小为8KB。推荐

 

5.使用扫描仪Scanner读取Java中的文本文件:

 Scanner scan=new Scanner(new File("D:"+ File.separator+"testFileContent.txt"));
        scan.useDelimiter("\n");//设置读取分隔符
        while(scan.hasNext()){
            System.out.println(scan.next());
        }
        scan.close();

如果要逐行或基于某些Java正则表达式读取文件,则使用Scanner类。扫描程序使用定界符模式将其输入分为令牌,默认情况下,该模式与空格匹配。 然后,可以使用各种下一种方法将生成的令牌转换为不同类型的值。 扫描器类未同步,因此不是线程安全的。

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dmlcq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值