zoukankan      html  css  js  c++  java
  • java 读写文件的两种方式

    1.情景展示

      在实际开发过程中,对于文件的读写操作也是经常碰到的,如何用java完成对文件的准确无误的读写呢?

    2.场景分析

      在java中,我们可以通过数据流(二进制)来完成对文件的操作;

      其中,数据流有2种,一种是字节流,一种是字符流,这两种流各有特点,都能实现对文件的操作。

      举个例子:

      已知日志文件sys.log,需要对将前7行的内容放到TXT文件中,如何实现?

    3.字符流

      使用字符流的方式,在网上比较常见,可以按字符(行)读取,也可以按字节读取;

      需要注意的是按行读取的时候,如果需要保留换行的话,需要自己手动添加换行符: ,否则的话,内容输出只有一行;

    public static void main(String[] args) {
        BufferedReader br = null;
        BufferedWriter bw = null;
        try {
            log.info("文件转字符输入流。。。");
            // 用字节输入流读取文件
            br = new BufferedReader(new InputStreamReader(new FileInputStream(new File("D:\workspace-idea\logs\bill\sys.log"))));
            // 用字节输出流输出文件
            // 原文件如果存在,内容会被重写;原文件不存在,会被自动创建
            bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream((new File("C:\Users\Marydon\Desktop\out2.txt")))));
    
            log.info("开始读取文件。。。");
            int lineNumber = 0;
            String lineText;
            // 按行读取
            while ((lineText = br.readLine()) != null) {
                log.debug("边读边写。。。");
    
                // 行号+1
                lineNumber++;
    
                // 非最后一行需要加换行符
                // 没有换行符的话,所有内容将会被输入到同一行
                lineText = (lineNumber > 6) ? lineText : lineText + "
    ";
                // 将行内容写入文件
                bw.write(lineText);
    
                if (lineNumber > 6) {
                    log.info("文件截取完毕。。。");
                    break;// 第7行写入完毕,终止读取
                }
            }
    
            log.info("文件写入完毕");
        } catch (Exception e) {
            e.printStackTrace();
            log.error("文件读取或写入失败:" + e.getMessage());
        } finally {// 关闭流
            try {
                if (null != br) {
                    br.close();
                }
                if (null != bw) {
                    bw.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    }  

      另外,如果遇到读写文件出现乱码的情况,通常是写入的文件含中文时出现乱码,使用字符流的好处就在于:

      它可以决定以什么样的字符集读取文件内容,以及以什么样的字符集输出到文件当中。(注意:不能决定输出文件本身的字符集哦)

      通过InputStreamReader和OutputStreamWriter进行指定  

    // 以指定字符集读取文件内容
    br = new BufferedReader(new InputStreamReader(new FileInputStream(new File("D:\workspace-idea\logs\bill\sys.log")),"UTF-8"));
    // 以指定字符集输出到文件中
    bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream((new File("C:\Users\Marydon\Desktop\out2.txt"))),"GB2312"));
    

      通过OutputStreamWriter输出文件时,需要说明的有两点:

      第一,当要生成的文件不存在时,会被自动创建;

      第二,当原文件已经存在是,原文件内容会被覆盖掉。

    4.字节流 

    public static void main(String[] args) {
        InputStream bis = null;
        OutputStream bos = null;
        try {
            // 用字节输入流读取文件
            bis = new BufferedInputStream(new FileInputStream(new File("D:\workspace-idea\logs\bill\sys.log")));
            // 用字节输出流输出文件
            // 原文件如果存在,内容会被重写;原文件不存在,会被自动创建
            bos = new BufferedOutputStream(new FileOutputStream((new File("C:\Users\Marydon\Desktop\out.txt"))));
    
            int len;
            // 创建一个用于接收文件流的数组
            byte[] tempFilebytesArray = new byte[1024];
    
            while ((len = bis.read(tempFilebytesArray)) != -1) {
                // 1024个字节所转成字符串
                String tempText = new String(tempFilebytesArray, "UTF-8");
                // 包含指定字符串,终止读取
                if (tempText.contains("接收到的请求参数:")) {
                    bos.write(tempText.substring(0, tempText.indexOf("接收到的请求参数:") + 9).getBytes("utf-8"));
                    break;
                } else {
                    bos.write(tempFilebytesArray, 0, len);
                }
            }
    
        } catch (Exception e) {
            e.printStackTrace();
        } finally {// 关闭流
            try {
                if (null != bis) {
                    bis.close();
                }
                if (null != bos) {
                    bos.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    }  

      实现效果与上方一样。

      通过BufferedOutputStream输出文件时,需要说明的有两点:

      第一,当要生成的文件不存在时,会被自动创建;

      第二,当原文件已经存在是,原文件内容会被覆盖掉。

      当然了,上面两种只是演示,在实际开发过程中,一般没有这么简单,但是,万变不离其宗,玩转了这两种方式,基本就没有问题了。     

    写在最后

      哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!

     相关推荐:

  • 相关阅读:
    APP性能测试工具GT的使用总结:app内存测试
    app专项测试:app静态测试(耗时、流量、内存、图片大小)
    沟通的重要性
    [改善Java代码]推荐覆写toString方法
    [改善Java代码]使用package-info类为包服务
    [改善Java代码]不要主动进行垃圾回收
    [改善Java代码]推荐使用String直接量赋值
    [改善Java代码]在接口中不要存在实现代码
    [改善Java代码]不要随便设置随机种子
    [改善Java代码]优先使用整型池
  • 原文地址:https://www.cnblogs.com/Marydon20170307/p/14768662.html
Copyright © 2011-2022 走看看