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

常用的静态变量

在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方法的效果:

@Testpublic 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)

比如:

@Testpublic 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: 11at 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)

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

 @Testpublic void readLinesTest(){try{InputStream is = new FileInputStream("D://test1.txt");List<String> lines = IOUtils.readLines(is);for(String line : lines){System.out.println(line);}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}

输出内容:

hello
worldnihao
ioutils

skip

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

skip(inputstream,skip_length)
skip(ReadableByteChannel,skip_length)
skip(reader,skip_length)

例如:

@Testpublic 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)

例如

@Testpublic 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)

例如

@Testpublic 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)

例如

@Testpublic void writeLinesTest() throws IOException {List<String> 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)

例如

@Testpublic 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)

Java程序员的日常—— IOUtils总结相关推荐

  1. Java程序员的日常—— 垃圾回收中引用类型的作用

    在Java里面,是不需要太过于关乎垃圾回收,但是这并不意味着开发者可以不了解垃圾回收的机制,况且在java中内存泄露也是家常便饭的事情.因此了解垃圾回收的相关知识就显得很重要了. 引用,在垃圾回收中是 ...

  2. JAVA程序员的日常工作是什么?一文告诉知道!

    由于Java的企业需求热度,想学习Java并获得就业安排的学员也只增不减.而对于Java工程师来说,每天的工作内容是怎样的呢?本篇带大家了解一下Java开发者的日常工作,希望会有所收获. 首先对于一个 ...

  3. JAVA程序员的日常工作是什么?一文告诉知道

    由于Java的企业需求热度,想学习Java并获得就业安排的学员也只增不减.而对于Java工程师来说,每天的工作内容是怎样的呢?本篇带大家了解一下Java开发者的日常工作,希望会有所收获. 首先对于一个 ...

  4. java程序员的日常_Java程序员的日常——经验贴(纯干货)

    工作当中遇到的事情比较杂,因此涉及的知识点也很多.这里暂且记录一下,今天遇到的知识点,纯干货~ 关于文件的解压和压缩 如果你的系统不支持tar -z命令 如果是古老的Unix系统,可能并不认识tar ...

  5. Java程序员的日常

    工作当中遇到的事情比较杂,因此涉及的知识点也很多.这里暂且记录一下,今天遇到的知识点,纯干货~ 转自https://my.oschina.net/u/3518116/blog/979024?ref=m ...

  6. Java程序员的日常—— 《编程思想》关于类的使用常识

    Java虽然利用JVM,让程序员可以放心大胆的使用,可是仍然会出现内存泄露等问题.世上没有绝对的银弹,因此也不能完全把所有的任务都交给JVM,了解Java中的初始化与垃圾回收还是必不可少的知识. 关于 ...

  7. java程序员的日常小感悟

    转眼间,毕业已经快4年了.自己也已经渐渐的离新手这个词越来越远了,至少在别人眼里是这样的,其实真实的专业水平只有自己清楚,还是小白一个:虽然技术很菜,但是通过实际的工作,自己也有一些自己的感受与总结: ...

  8. Java程序员的日常—— Arrays工具类的使用

    这个类在日常的开发中,还是非常常用的.今天就总结一下Arrays工具类的常用方法.最常用的就是asList,sort,toStream,equals,copyOf了.另外可以深入学习下Arrays的排 ...

  9. Java程序员的日常 —— 响应式导航Demo

    这两天想要做响应式的页面,于是本着重复造轮子的想法,模仿Bootstrap官网,精简了一个响应式导航的Demo. 效果 代码 <!DOCTYPE html> <html> &l ...

最新文章

  1. 看板与Scrum:哪个更适合你的团队?
  2. 在windows中python安装sit-packages路径位置 在Pycharm中导入opencv不能自动代码补全问题
  3. vue仿今日头条_黄圣依荣获“时代气质明星”,头条时尚盛典她的“天鹅妆”美出圈!...
  4. 单例模式的七种写法(转)
  5. CentOS下桥接模式连不上网
  6. C编程语言中16位整型数据的取值范围介绍
  7. 统计思维如何帮助大数据应用从人工走向智能?(上)
  8. 用计算机弹飞云直下,飞云之下-韩红/林俊杰-和弦谱-《弹吧》官网tan8.com-和弦谱大全,学吉他,秀吉他...
  9. SOS Dynamic Programming
  10. 整理出的安卓国家码,简称,语言的Json文件,可以一一对应国旗
  11. 大型商超连锁企业5大核心业务、20+文件电子签场景
  12. IEEE trans使用latex模板部分字体是黑色,部分变成了绿色
  13. 作宾语,不定式与动名词的区别——脑动词和手动词
  14. 报错解决——ValueError: row index was 65536, not allowed by .xls format
  15. python getopt使用_Python命令行参数解析模块getopt使用实例
  16. ❤️ 炒 股 实 战丨原 地 起 飞 ❤️
  17. 微信小程序编写一个试卷demo
  18. android 黑白色主题、滤镜效果(公祭日、追悼日)
  19. ajax异步请求刷新
  20. JAVA类和对象(构造方法、方法重载、this关键字)

热门文章

  1. R12.2.6 installation failed with - Unable to rename database
  2. 01.备份crm源码
  3. 关于Android(Java)创建匿名线程
  4. 【数据结构】栈的存储实现
  5. Coherence Step by Step 第三篇 缓存(一) 介绍(翻译)
  6. 靠谱测试人员需具备沟通表达能力
  7. 靠谱测试人员需具备逻辑思考能力
  8. c++取临时文件夹_电脑C盘不足?学会删除这5个文件夹,能节省10G空间
  9. 面试问php学得怎么样,php面试常问的问题及回答
  10. struct interface_今天就谈谈go中的接受 interface 参数,返回 struct