当前位置: 移动技术网 > IT编程>开发语言>Java > 使用IO流写文件的一些骚操作

使用IO流写文件的一些骚操作

2019年01月04日  | 移动技术网IT编程  | 我要评论

笑拥大明,抢劫起家身家千万,baocaoliu

序言

当需要对文件进行操作时,使用io流是不能避免的操作;比如业务中需要存储一些请求的响应结果中的一些内容。当所需处理的文件过大时,如果频繁的关闭文件流,会造成很大的开销,何时关闭?往往会造成比较大的困扰。那么如何才能比较优雅的处理文件呢?

使用案例

情景

存储数据时,行与行之间使用回车符隔开;一行的数据字段之间使用tab键隔开

代码地址

https://github.com/mmzsblog/io-demo

解决方案一:

使用apache提供的工具类ioutil可以方便快捷的处理这个问题,这个工具类封装了很多方法

  • 引入apache工具类ioutil的依赖包
    <dependencies>
        <!-- apache提供的一个io工具类 -->
        <dependency>
            <groupid>commons-io</groupid>
            <artifactid>commons-io</artifactid>
            <version>2.4</version>
        </dependency>
    </dependencies>

    <repositories>
        <repository>
            <id>alimaven</id>
            <name>aliyun maven</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
  • 主要代码如下:
public static void main(string[] args) {

    list<string> list = new arraylist();
    list.add("hello");
    list.add("third");
    list.add("method");
    list.add("io");
    list.add("util");
    outputstream os = null;
    file filepath = new file("d:\\" + dateutil.getcurrentdate("yyyymmdd") + ".txt");

    try {
        os = new fileoutputstream(filepath, true);
        //一行中的字段用tab隔开
        ioutils.writelines(list,"\t",os);
        //行与行之间用回车隔开
        ioutils.write("\n", os);
    } catch (filenotfoundexception e) {
        e.printstacktrace();
    } catch (ioexception e) {
        e.printstacktrace();
    }
}

解决方案二:

  • 主要代码如下:
    public static void main(string[] args) {

        file filepath = new file("d:\\" + dateutil.getcurrentdate("yyyymmdd") + ".txt");

        //将数据保存到stringbuffer中后再存储到文件中
        list<string> list = new arraylist();
        list.add("hello");
        list.add("second");
        list.add("method");
        list.add("io");
        list.add("util");
        //因为此处不涉及线程安全问题,所以用了stringbuilder
        stringbuilder sb = new stringbuilder();
        iterator<string> iterator = list.iterator();
        while (iterator.hasnext()) {
            string item = iterator.next();
            sb.append(item).append("\t");
        }
        string newtxt = sb.deletecharat(sb.length()-1).append("\n").tostring();

        bufferedwriter bw = null;
        try {
            //true表示文件写入方式为追加;flase表示是覆盖
            bw = new bufferedwriter(new filewriter(filepath, true));
            bw.write(newtxt);
        } catch (ioexception e) {
            e.printstacktrace();
        }finally {
            if (null != bw) {
                try {
                    bw.flush();
                    bw.close();
                } catch (ioexception e) {
                    e.printstacktrace();
                }
            }
        }
    }

解决方案三:

  • 主要代码如下:
public class iofirst {

    /**
     * description: 最复杂,但也是比较考验基本功的写法
     * author: mmzsit
     * date: 2018/12/27 17:45
    */
    public static void main(string[] args)
    {
        file log=new file("d:\\"+dateutil.getcurrentdate("yyyymmdd") +".txt");
        list<string> list = new arraylist();
        list.add("hello");
        list.add("first");
        list.add("method");
        list.add("io");
        list.add("util");
        //因为此处不涉及线程安全问题,所以用了stringbuilder
        stringbuilder sb = new stringbuilder();
        iterator<string> iterator = list.iterator();
        while (iterator.hasnext()) {
            string item = iterator.next();
            sb.append(item).append("\t");
        }
        string newlog = sb.deletecharat(sb.length()-1).tostring();
        //调用appendlog方法执行文件写入操作
        appendlog(log,newlog);
    }

    /**
     * description: 此种方式是自己写的类,想怎么操作按自己的意思来
     * author: mmzsit
     * date: 2018/12/27 17:42
    */
    public static void appendlog(file filepath,string newtxt)
    {
        scanner sc=null;
        printwriter pw=null;
        try{
            isexists(filepath);
            sc=new scanner(filepath);
            stringbuilder sb=new stringbuilder();
            //先读出旧文件内容,并暂存sb中;
            while(sc.hasnextline())
            {
                sb.append(sc.nextline());
                //换行符作为间隔,扫描器读不出来,因此要自己添加.
                sb.append("\t\n");
            }
            if (0 != sb.length()) {
                //解决每次多余的空行
                sb.deletecharat(sb.length()-1);
            }
            sc.close();

            pw=new printwriter(new  filewriter(filepath),true);
            //a、写入旧文件内容.
            pw.println(sb.tostring());
            //b、写入新文件内容
            pw.println(newtxt);
            /*
             * 如果先写入a,最近写入在文件最后.
             * 如是先写入b,最近写入在文件最前.
             */
            pw.close();
        }
        catch(ioexception ex)
        {
            ex.printstacktrace();
        }
    }

    /**
     * description: 保证文件夹的存在
     * author: mmzsit
     * date: 2018/12/27 17:42
    */
    public static void isexists(file filepath){
        //如果文件不存在,则新建.
        if(!filepath.exists())
        {
            file parentdir=new file(filepath.getparent());
            //如果所在目录不存在,则新建.
            if(!parentdir.exists()) {
                parentdir.mkdirs();
            }
            try {
                filepath.createnewfile();
            } catch (ioexception e) {
                e.printstacktrace();
            }
        }
    }
}

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网