使用IO流写文件的一些骚操作
程序员文章站
2024-01-05 17:36:46
存储数据时,一行的数据字段之间使用Tab键隔开,行与行之间使用回车符隔开; ......
序言
当需要对文件进行操作时,使用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(); } } } }
推荐阅读
-
使用IO流写文件的一些骚操作
-
使用NumPy和pandas对CSV文件进行写操作的实例
-
使用NumPy和pandas对CSV文件进行写操作的实例
-
使用文件流与使用缓冲流完成文件的复制操作性能对比,文件流 FileInputStream FileOutputStream 缓冲流: BufferedInputStream BufferedOutputStream
-
操作系统实验:使用无缓冲的方式实现文件读\写
-
PHP操作文件的一些基本函数使用示例
-
使用java中的IO操作将指定源目录下的指定类型文件拷贝到指定目录中
-
PHP操作文件的一些基本函数使用示例
-
PHP操作文件的一些基本函数使用示例_PHP
-
Java 使用IO流实现大文件的分割与合并实例详解