• 输入输出流操作同一个文件的问题及解决办法


    1、问题场景
    由于需要对文本文件的部分内容进行更新操作,具体操作是需要先将文本文件内容读取出来,暂以字符串形式保存,然后进行匹配替换,并将字符串重新写入原文本文件中。

    2、代码规划
    规划使用BufferedReader进行读取,使用PrintWriter进行写入操作

    BufferedReader br = null;
    PrintWriter pw = null;
    StringBuilder sqlMapConf = new StringBuilder();
    try {
        File sqlMapConfFile = new File(sqlMapConfPath, name);
        br = new BufferedReader(new InputStreamReader(
                        new FileInputStream(sqlMapConfFile), "UTF-8"));
         pw = new PrintWriter(sqlMapConfFile,"UTF-8");
        String str = "";
        while ((str = br.readLine())!=null) {
            sqlMapConf.append(str+"
    ");
        }
        str = sqlMapConf.toString().replaceFirst("\*sqlMap映射文件\*", config);
        pw.write(str);
        System.out.println(str);
    } catch (FileNotFoundException e) {
        throw new RuntimeException(name+"文件未找到!");
    } catch (IOException e) {
        e.printStackTrace();
        throw new RuntimeException(name+"文件IO处理异常!");
    } catch (Exception e) {
        e.printStackTrace();
        throw new RuntimeException(name+"文件处理出现未知异常!");
    }finally {
        if (pw!=null) {
            pw.close();
        }
        if (br!=null) {
            try {
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

    3、问题现象
    测试时发现,原文本文件内容会被清空,且未有内容写入,也无异常报错信息

    4、分析推测
    通过分析推测,输入流未关闭的情况下,输出流操作同一路径文件,会造成冲突,输入流会认为该文件不存在并重新创建同名文件覆盖原文件,而后输入流实际读取的是一个空文件,那么输出流写入的内容也为空,最后造成文件内容置空的现象。

    5、错误纠正
    在输入流操作完该文件后,输出流再进行文件操作,代码纠正如下:

    BufferedReader br = null;
    PrintWriter pw = null;
    StringBuilder sqlMapConf = new StringBuilder();
    try {
        File sqlMapConfFile = new File(sqlMapConfPath, name);
        br = new BufferedReader(new InputStreamReader(
                        new FileInputStream(sqlMapConfFile), "UTF-8"));
    //    pw = new PrintWriter(sqlMapConfFile,"UTF-8");
        String str = "";
        while ((str = br.readLine())!=null) {
            sqlMapConf.append(str+"
    ");
        }
        str = sqlMapConf.toString().replaceFirst("\*sqlMap映射文件\*", config);
        pw = new PrintWriter(sqlMapConfFile,"UTF-8");//纠正增加的代码
        pw.write(str);
        System.out.println(str);
    } catch (FileNotFoundException e) {
        throw new RuntimeException(name+"文件未找到!");
    } catch (IOException e) {
        e.printStackTrace();
        throw new RuntimeException(name+"文件IO处理异常!");
    } catch (Exception e) {
        e.printStackTrace();
        throw new RuntimeException(name+"文件处理出现未知异常!");
    }finally {
        if (pw!=null) {
            pw.close();
        }
        if (br!=null) {
            try {
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    为了目标奋斗
  • 相关阅读:
    [leetcode]Reverse Words in a String
    *[topcoder]ChooseTheBestOne
    priority_queue c++
    [topcoder]BoxesDiv2
    *[topcoder]IncrementingSequence
    [topcoder]HappyLetterDiv2
    c++ stl 使用汇总(string,vector,map,set)
    2014找工作总结-机会往往留给有准备的人 (转,后台开发面经)
    2015互联网校招总结—一路走来 (移动端开发面经,另有面经汇总)
    通过金矿模型介绍动态规划(转)
  • 原文地址:https://www.cnblogs.com/Rosemajor/p/13369745.html
Copyright © 2020-2023  润新知