笑拥大明,抢劫起家身家千万,baocaoliu
当需要对文件进行操作时,使用io流是不能避免的操作;比如业务中需要存储一些请求的响应结果中的一些内容。当所需处理的文件过大时,如果频繁的关闭文件流,会造成很大的开销,何时关闭?往往会造成比较大的困扰。那么如何才能比较优雅的处理文件呢?
存储数据时,行与行之间使用回车符隔开;一行的数据字段之间使用tab
键隔开
https://github.com/mmzsblog/io-demo
使用apache提供的工具类ioutil
可以方便快捷的处理这个问题,这个工具类封装了很多方法
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(); } } } }
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
浅析我对 String、StringBuilder、StringBuffer 的理解
使用IDEA搭建SSM框架的详细教程(spring + springMVC +MyBatis)
Springboot整合freemarker 404问题解决方案
引入mybatis-plus报 Invalid bound statement错误问题的解决方法
网友评论