java ioutils 写入文件_文件输入输出流工具: IOUtils使用总结

序言

以前写文件的复制很麻烦,需要各种输入流,然后读取line,输出到输出流...其实apache.commons.io里面提供了输入流输出流的常用工具方法,非常方便。下面就结合源码,看看IOUTils都有什么用处吧!

常用的静态变量

在IOUtils中还是有很多常用的一些变量的,比如换行符等等

public static final char DIR_SEPARATOR_UNIX = '/';

public static final char DIR_SEPARATOR_WINDOWS = '\\';

public static final char DIR_SEPARATOR;

public static final String LINE_SEPARATOR_UNIX = "\n";

public static final String LINE_SEPARATOR_WINDOWS = "\r\n";

public static final String LINE_SEPARATOR;

static {

DIR_SEPARATOR = File.separatorChar;

StringBuilderWriter buf = new StringBuilderWriter(4);

PrintWriter out = new PrintWriter(buf);

out.println();

LINE_SEPARATOR = buf.toString();

out.close();

}

常用方法

copy

这个方法可以拷贝流,算是这个工具类中使用最多的方法了。支持多种数据间的拷贝:

copy(inputstream,outputstream)

copy(inputstream,writer)

copy(inputstream,writer,encoding)

copy(reader,outputstream)

copy(reader,writer)

copy(reader,writer,encoding)

copy内部使用的其实还是copyLarge方法。因为copy能拷贝Integer.MAX_VALUE的字节数据,即2^31-1。

copyLarge

这个方法适合拷贝较大的数据流,比如2G以上。

copyLarge(reader,writer) 默认会用1024*4的buffer来读取

copyLarge(reader,writer,buffer)

内部的细节可以参考:

public static long copyLarge(Reader input, Writer output, char [] buffer) throws IOException {

long count = 0;

int n = 0;

while (EOF != (n = input.read(buffer))) {

output.write(buffer, 0, n);

count += n;

}

return count;

}

这个方法会用一个固定大小的Buffer,持续不断的读取数据,然后写入到输出流中。

read

从一个流中读取内容

read(inputstream,byte[])

read(inputstream,byte[],offset,length)

//offset是buffer的偏移值,length是读取的长度

read(reader,char[])

read(reader,char[],offset,length)

这里我写了个小例子,可以测试read方法的效果:

@Test

public void readTest(){

try{

byte[] bytes = new byte[4];

InputStream is = IOUtils.toInputStream("hello world");

IOUtils.read(is, bytes);

System.out.println(new String(bytes));

bytes = new byte[10];

is = IOUtils.toInputStream("hello world");

IOUtils.read(is, bytes, 2, 4);

System.out.println(new String(bytes));

} catch (IOException e) {

e.printStackTrace();

}

}

得到的结果是:

hell

□□hell□□□□

readFully

这个方法会读取指定长度的流,如果读取的长度不够,就会抛出异常

readFully(inputstream,byte[])

readFully(inputstream,byte[],offset,length)

readFully(reader,charp[])

readFully(reader,char[],offset,length)

比如:

@Test

public void readFullyTest(){

byte[] bytes = new byte[4];

InputStream is = IOUtils.toInputStream("hello world");

try {

IOUtils.readFully(is,bytes);

System.out.println(new String(bytes));

} catch (IOException e) {

e.printStackTrace();

}

}

输出

hell

但是如果读取20个byte,就会出错了

java.io.EOFException: Length to read: 20 actual: 11

at org.apache.commons.io.IOUtils.readFully(IOUtils.java:2539)

at org.apache.commons.io.IOUtils.readFully(IOUtils.java:2558)

at test.java.IOUtilsTest.readFullyTest(IOUtilsTest.java:22)

...

readLines

readLines方法可以从流中读取内容,并转换为String的list

readLines(inputstream)

readLines(inputstream,charset)

readLines(inputstream,encoding)

readLines(reader)

这个方法极大简化了之前原始的读取方法:

@Test

public void readLinesTest(){

try{

InputStream is = new FileInputStream("D://test1.txt");

List lines = IOUtils.readLines(is);

for(String line : lines){

System.out.println(line);

}

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

输出内容:

hello

world

nihao

ioutils

skip

这个方法用于跳过指定长度的流,

skip(inputstream,skip_length)

skip(ReadableByteChannel,skip_length)

skip(reader,skip_length)

例如:

@Test

public void skipTest(){

InputStream is = IOUtils.toInputStream("hello world");

try {

IOUtils.skip(is,4);

System.out.println(IOUtils.toString(is,"utf-8"));

} catch (IOException e) {

e.printStackTrace();

}

}

skipFully

这个方法类似skip,只是如果忽略的长度大于现有的长度,就会抛出异常

skipFully(inputstream,toSkip)

skipFully(readableByteChannel,toSkip)

skipFully(inputstream,toSkip)

例如

@Test

public void skipFullyTest(){

InputStream is = IOUtils.toInputStream("hello world");

try {

IOUtils.skipFully(is,30);

System.out.println(IOUtils.toString(is,"utf-8"));

} catch (IOException e) {

e.printStackTrace();

}

}

write

这个方法可以把数据写入到输出流中

write(byte[] data, OutputStream output)

write(byte[] data, Writer output)

write(byte[] data, Writer output, Charset encoding)

write(byte[] data, Writer output, String encoding)

write(char[] data, OutputStream output)

write(char[] data, OutputStream output, Charset encoding)

write(char[] data, OutputStream output, String encoding)

write(char[] data, Writer output)

write(CharSequence data, OutputStream output)

write(CharSequence data, OutputStream output, Charset encoding)

write(CharSequence data, OutputStream output, String encoding)

write(CharSequence data, Writer output)

write(StringBuffer data, OutputStream output)

write(StringBuffer data, OutputStream output, String encoding)

write(StringBuffer data, Writer output)

write(String data, OutputStream output)

write(String data, OutputStream output, Charset encoding)

write(String data, OutputStream output, String encoding)

write(String data, Writer output)

例如

@Test

public void writeTest(){

try {

OutputStream os = new FileOutputStream("E:/test.txt");

IOUtils.write("hello write!",os);

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

writeLines

这个方法可以把string的List写入到输出流中

writeLines(Collection> lines, String lineEnding, OutputStream output)

writeLines(Collection> lines, String lineEnding, OutputStream output, Charset encoding)

writeLines(Collection> lines, String lineEnding, OutputStream output, String encoding)

writeLines(Collection> lines, String lineEnding, Writer writer)

例如

@Test

public void writeLinesTest() throws IOException {

List lines = new ArrayList();

lines.add("hello");

lines.add("list");

lines.add("to");

lines.add("file");

OutputStream os = new FileOutputStream("E:/test.txt");

IOUtils.writeLines(lines,IOUtils.LINE_SEPARATOR,os);

}

close

关闭URL连接

close(URLConnection conn)

closeQuietly

忽略nulls和异常,关闭某个流

close(URLConnection conn)

closeQuietly(Closeable... closeables)

closeQuietly(Closeable closeable)

closeQuietly(InputStream input)

closeQuietly(OutputStream output)

closeQuietly(Reader input)

closeQuietly(Selector selector)

closeQuietly(ServerSocket sock)

closeQuietly(Socket sock)

closeQuietly(Writer output)

contentEquals

比较两个流是否相同

contentEquals(InputStream input1, InputStream input2)

contentEquals(Reader input1, Reader input2)

例如

@Test

public void contentEqualsTest(){

InputStream is1 = IOUtils.toInputStream("hello123");

InputStream is2 = IOUtils.toInputStream("hello123");

try {

System.out.println(IOUtils.contentEquals(is1,is2));

} catch (IOException e) {

e.printStackTrace();

}

}

contentEqualsIgnoreEOL

比较两个流,忽略换行符

contentEqualsIgnoreEOL(Reader input1, Reader input2)

lineIterator

读取流,返回迭代器

lineIterator(InputStream input, Charset encoding)

lineIterator(InputStream input, String encoding)

lineIterator(Reader reader)

toBufferedInputStream

把流的全部内容放在另一个流中

toBufferedInputStream(InputStream input)

toBufferedInputStream(InputStream input, int size)

toBufferedReader

返回输入流

toBufferedReader(Reader reader)

toBufferedReader(Reader reader, int size)

toByteArray

返回字节数组

toByteArray(InputStream input)

toByteArray(InputStream input, int size)

toByteArray(InputStream input, long size)

toByteArray(Reader input)

toByteArray(Reader input, Charset encoding)

toByteArray(Reader input, String encoding)

toByteArray(String input)

toByteArray(URI uri)

toByteArray(URL url)

toByteArray(URLConnection urlConn)

toCharArray

返回字符数组

toCharArray(InputStream is)

toCharArray(InputStream is, Charset encoding)

toCharArray(InputStream is, String encoding)

toCharArray(Reader input)

toInputStream

返回输入流

toInputStream(CharSequence input)

toInputStream(CharSequence input, Charset encoding)

toInputStream(CharSequence input, String encoding)

toInputStream(String input)

toInputStream(String input, Charset encoding)

toInputStream(String input, String encoding)

toString

返回字符串

toString(byte[] input)

toString(byte[] input, String encoding)

toString(InputStream input)

toString(InputStream input, Charset encoding)

toString(InputStream input, String encoding)

toString(Reader input)

toString(URI uri)

toString(URI uri, Charset encoding)

toString(URI uri, String encoding)

toString(URL url)

toString(URL url, Charset encoding)

toString(URL url, String encoding)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/536843.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

权限组件(6):权限分配的角色管理

效果图: 为了方便开发,先把中间件注释掉,要不还要在角色-权限表中添加对应关系。又因为二级菜单和面包屑导航需要中间件的变量,所以要在layout.html里面把这两个也注释掉。setting.py# rbac.middlewares.rbac.RbacMiddleware layo…

java 面试700问_JAVA面试700问(一)

1、Java环境中的字节码是什么?由Java 编译器生成的一种代码。由JVM生成的一种代码。Java源文件(Java Source File)的别名。一种写在类的实例方法中的代码。答案:由Java 编译器生成的一种代码。2、什么是Java垃圾回收机制?操作系统周期性的删除…

02-Django基础知识

一、内容回顾 1、web应用程序 2、HTTP协议 a、http协议特性 b、http请求格式 c、http响应格式 3、wsgiref模块 4、Django下载与简单应用 a、Django简介(MTV) b、下载django命令 c、创建项目命令 d、创建app应用 e、启动项目   二、今日概要 1、路由层&…

java条码大小_java - ML Kit条形码扫描:无效的图像数据大小

我想在捕获的图像中检测条形码。我使用android的camera2捕获图像。此后,将检索图像的元数据并将图像保存到设备。元数据全部传递到下一个活动,该活动是应用程序尝试检测条形码的地方。下一个活动是从先前保存的文件创建一个byte []。接下来,使…

MongoDB数据库泄露8亿电邮地址;微软开源Windows计算器;Linux 5.0 Kernel发布丨Q新闻...

本周要闻:华为正式宣布起诉美国政府;360 首席安全官谭晓生宣布离职;阿里开源 Flutter 应用框架 Fish Redux;微软开源 Windows 计算器;Linux 5.0 Kernel 发布;电邮验证服务泄漏 8 亿电邮地址;Chr…

mysql 视图 分页_mysql查看所有存储过程,函数,视图,触发器,表,分页

查询数据库中的存储过程和函数方法一:select name from mysql.proc where db your_db_name and type PROCEDURE //存储过程select name from mysql.proc where db your_db_name and type FUNCTION //函数方法二:show procedure status; //存储过程sh…

postman里测试文件上传(MultipartFile)

1、后台方法: Override PostMapping("/importNumberSpaceData") public DataImportOutDTO importNumberSpaceData(MultipartFile file) throws Exception { return dataImportOutDTO; } 2、启用postman 1、POST方法; 2、Body-form-data,key为后…

java解析上的jar包里的pom_Maven引入本地Jar包并打包进War包中的方法

1.概述在平时的开发中,有一些Jar包因为种种原因,在Maven的中央仓库中没有收录,所以就要使用本地引入的方式加入进来。2. 拷贝至项目根目录项目根目录即pom.xml文件所在的同级目录,可以在项目根目录下创建文件夹lib,如下…

持续集成之 Spring Boot 实战篇

本文作者: CODING 用户 - 何健 这次实战篇,我们借助「CODING 持续集成」,实现一个简单的 Spring Boot 项目从编码到最后部署的完整过程。本教程还有 B 站视频版,帮助读者更好地学习理解。 思路 在线上环境构建、测试、部署 这种情…

java静态工厂方法模式_设计模式:简单工厂模式(静态工厂方法模式)

简单工厂的构成包括三个角色:1)抽象产品类2)具体产品类(继承抽闲产品类)3)工厂类(生产具体产品)具体代码实现1、抽象产品类/*** 抽象类*/public abstract class Car {/*** 产品抽象方法,将会由具体产品类实现*/public abstract void driving();}2、具体产…

Kibana中的Coordinate Map地图报索引错误的问题

今天做地图定位展示,展示的是ApacheWeb服务器的访问日志文件中的来源IP。但是中间出现了报错环节,说是索引不能匹配到geo_point类型,实在是不懂这是在说什么,后来在网站找了方法就解决了。主要报错如下: 报错信息&…

mysql数据库安装在unix_Linux下的数据库二:在Linux/Unix平台安装MySQL

推荐使用RPM工具来进行Linux下的MySQL数据库安装。目前的MySQLrpm安装文件包是在SuSE Linux7.3系统平台上打造而成的,但是在绝大多数支持RPM和glibc的其他Linux平台中也可以进行安装。如果选择通用的RPM安装包,那么RPM将静态链接到Linux的线程中。下面步…

mysql时区设置gmt_将MySQL数据库时区设置为GMT

不,不可能在MySQL实例中更改单个数据库的时区.您可以检索服务器和客户端time_zone设置:SELECT global.time_zone, session.time_zone;您还可以更改整个MySQL实例的客户端时区或时区.但要敏锐地了解现有客户端连接的含义,以及如何解释已存储在实例中的DATETIME和TIME…

javaSE知识点汇总

javaSE知识点汇总Java基础知识精华部分写代码:1,明确需求。我要做什么?2,分析思路。我要怎么做?1,2,3。3,确定步骤。每一个思路部分用到哪些语句,方法,和对象。4,代码实现…

java中412是什么错_HTTP 412 错误 – 先决条件失败 (Precondition failed)

HTTP 412 错误 – 先决条件失败 (Precondition failed)介绍您的 Web 服务器认为,该服务器检测到客户端发送的 HTTP 数据流包括一个没有满足的‘先决条件’规范。HTTP 循环中的 412 错误任何客户端 ( 例如您的浏览器或我们的 CheckUpDown 机器人 ) ,都需要…

细谈页面回流与重绘

你将了解到: 什么是回流 什么是重绘 回流何时发生 重绘何时发生 如何避免回流和重绘 复制代码带着上面的问题,我们一探究竟 什么是回流 回流:英文是reflow 当render tree中的一部分(或全部),因为元素的规模尺寸、布局、隐藏等改变…

安卓 java中改布局_android-选项卡布局中的地图视图throwing,java....

我创建了一个具有选项卡布局的应用程序,单击选项卡后,我将打开一个使用Web视图的新活动.另外另一个选项卡使用地图视图,列表视图,图像视图.现在,我在Samsung Galaxy Y上安装了我的应用程序-运行正常.当我在Samsung Galaxy Tab 2上安装相同的应用程序时,当我第一次打开地图视图,…

怎么样修改PuTTY的默认字体和字符集

1.在窗口标题上点击右键,选择 Change Settings...2.在打开的配置窗口左边选择 Appearance,在右边点 Font settings 里面的 Change 按钮,选择好中文字体,比如:宋体、新宋体之类的3.选择配置窗口左边的 Translation&…

python 元组比较大小_为什么元组比列表更快?

所报道的“build设速度”比率只适用于常量元组(项目用文字表示)。 仔细观察(并在机器上重复 – 只需在shell /命令窗口input命令!)…:$ python3.1 -mtimeit -sx,y,z1,2,3 [x,y,z] 1000000 loops, best of 3: 0.379 usec per loop $ python3.1 -mtimeit […

windows软链接的建立及删除

2019独角兽企业重金招聘Python工程师标准>>> 1.建立举例 # 建立d:develop链接目录,指向远程的目标服务器上的e盘的对应目录。 mklink /d d:\develop \\138.20.1.141\e$\develop# 建立d:develop链接目录,指向远程的目标服务器上的e盘的对应目录…