序言

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

使用案例

情景

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

代码地址

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

解决方案一:

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

更多使用方法请参考IOUtils使用总结

官方文档请参考:官方Api

  • 引入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流写文件的一些骚操作的更多相关文章

  1. Java基础 IO流的文件和目录的五类主要操作

    笔记: /** IO流的 文件和目录的操作 * 1.路径需要 需要两个反斜杠 或者一个单斜杠! * 绝对路径:包括盘符在内的完整的路径名! * 相对路径:在当前目录文件下的路径! * 2.File 是 ...

  2. Java:IO流与文件基础

    Java:IO流与文件基础 说明: 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列的对象 ...

  3. 38、使用IO流进行文件拷贝

    使用IO流进行文件拷贝 需求:在项目的根目录里面创建一个java.txt的文件,然后将这个文件拷贝到file文件夹里面并且重命名为good.txt文件先以流的方式将java.txt文件读取到内存中,然 ...

  4. Java基础教程:IO流与文件基础

    Java:IO流与文件基础 说明: 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列的对象 ...

  5. java io流 对文件夹的操作

    java io流 对文件夹的操作 检查文件夹是否存在 显示文件夹下面的文件 ....更多方法参考 http://www.cnblogs.com/phpyangbo/p/5965781.html ,与文 ...

  6. java io流 创建文件、写入数据、设置输出位置

    java io流 创建文件 写入数据 改变system.out.print的输出位置 //创建文件 //写入数据 //改变system.out.print的输出位置 import java.io.*; ...

  7. java 后台通过IO流把文件传到前端并下载

    我的业务需求是两个不同的web程序放在不同的服务器上,web程序A要访问到web程序B上传上来的文件,所以用到了这一个IO读取文件的接口 JAVA代码(排版有点问题  已经尽力补救了(:3_ヽ)_) ...

  8. IO流的文件输入输出效率问题

    IO流的文件输入输出效率问题 第一种方法 我用使用一个数组,把FIleInputStream获取到的二进制数存入这个数组,然后使用FIleOutputStream进行输出 缺点:速度慢 优点:不消耗内 ...

  9. Python中对 文件 的各种骚操作

    Python中对 文件 的各种骚操作 python中对文件.文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块. 得到当前工作目录,即当前Python脚本工作的目录路径: os.getc ...

随机推荐

  1. BZOJ_2242_[SDOI2011]计算器_快速幂+扩展GCD+BSGS

    BZOJ_2242_[SDOI2011]计算器_快速幂+扩展GCD+BSGS 题意: 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p, ...

  2. 虚拟机console基础环境部署——系统基础环境

    1. 概述2. 工具类安装2.1 安装vim2.2 安装tree2.3 安装expect2.4 安装lsof3. 编译环境类安装 1. 概述 本系列博客是在最小化安装CentOS6.5的基础上,通过配 ...

  3. python 将os.getcwd()获取路径中的\替换成\\

    通过os.getcwd()获取的路径为:D:\Auto\test\mobule,实际需要修改为:D://Auto//test//mobule 代码实现如下: import osb = os.getcw ...

  4. appium 常用API使用总结!

    将常用函数进行适用总结,后期在使用的过程中直接查找调用即可 获取界面属性.控件属性 1.current_activity:获取activity名称 device.current_activity 2. ...

  5. 用keras实现人脸关键点检测(2)

    上一个代码只能实现小数据的读取与训练,在大数据训练的情况下.会造内存紧张,于是我根据keras的官方文档,对上一个代码进行了改进. 用keras实现人脸关键点检测 数据集:https://pan.ba ...

  6. Java转Ruby【快速入门】

    最近参加实习了,公司的技术栈中需要用到 Ruby 以及 Rails 框架,所以算是开始了踩坑之旅吧.. Ruby 简介 网上的简介要搜都能搜到,具体涉及的包括历史啦之类这里不再赘述,提几个关键词吧: ...

  7. Solr 17 - Solr的时间为什么比本地少8小时 (附修改方法)

    目录 1 为什么少8小时 2 如何查看Solr的时区 3 修改Solr的时区 3.1 Solr从数据库中同步数据的原理 3.2 为什么要修改时区 3.3 如何修改时区 1 为什么少8小时 (1) 原因 ...

  8. Java基础面试知识点总结

    微信公众号[程序员江湖] 作者黄小斜,斜杠青年,某985硕士,阿里 Java 研发工程师,于 2018 年秋招拿到 BAT 头条.网易.滴滴等 8 个大厂 offer,目前致力于分享这几年的学习经验. ...

  9. windows,分割路径.得出目录

    #include <windows.h> #include <vector> #include <stdio.h> #include <string> ...

  10. 如何使用vs将asp.net core项目添加容器支持并发布docker镜像到私有dockerhub和添加k8s/helm管理

    这篇文章介绍一下,如何使用VS2017给asp.net core添加容器支持,并发布镜像到私有docker hub,然后用chart管理容器镜像的操作流程. 话不多说,just do it. 新建项目 ...