Java中使用IO Stream直接操作文件的,但是当我们使用这些的时候,往往要经过很多步骤,比如打开文件,关闭文件。很多时候,我们会记得打开文件,但是最后还是一个close()过程,我们总是容易忽略。
一.文件操作Util类
Guava建议我们定义所有的IO实体时都使用InputSupplier和OutputSupplier进行包装,这样,我们就不用考虑那么多事情了,简化了操作。
我们知道java IO包里面将文件流分为字节流(InputStream or OutputStream)和字符流(Reader or Writer),guava里面的ByteStreams and CharStreams分别提供了util方法,用来对字节流和字符流进行处理。主要包含的方法如下:
此外,Files类提供了很多static的方法来对文件进行操作,其中有2个方法可以把文件使用InputSupplier或者OutputSupplier进行封装,使用封装后的对象就不会忘记关闭文件了。
static InputSupplier<T> newInputStreamSupplier(File) 可以将file对象使用InputSupplier进行封装。
static OutputSupplier<T> newOutputStream(File) 可以将file对象使用OutputSupplier进行封装。
其实Files功能和ByteStreams and CharStreams差不多,其他的重要方法包括,:
toString():读取文件内容
copy():文件内容拷贝,包含多种参数形式
move():文件移到,可以重命名
getFileExtension():获取文件后缀名
getNameWithoutExtension():返回不含后缀的文件名
readLines(File, Charset, LineProcessor):每读取一行就交给LineProcessor进行处理
map(File):把文件映射到内存区块,返回java.nio. MappedByteBuffer
createParentDir(File):如果父目录不存在,则创建之。
simplifyPath(String):把路径格式化
二.关闭文件
在JDK7以前,对文件操作,我们需要时刻注意用完后关闭文件。
InputStream in = null;
try {
in = openInputStream();
OutputStream out = null;
try {
out = openOutputStream();
// do something with in and out
} finally {
if (out != null) {
out.close();
}
}
} finally {
if (in != null) {
in.close();
}
}
可以看到,这段代码真是太复杂了,一不小心就出错了。
可喜的是JDK7有了新的措施来解决这类问题,那就是try-with-resources 语句,如:
try (
java.util.zip.ZipFile zf =
new java.util.zip.ZipFile(zipFileName);
java.io.BufferedWriter writer =
java.nio.file.Files.newBufferedWriter(outputFilePath, charset)
) {
// Enumerate each entry
for (java.util.Enumeration entries =
zf.entries(); entries.hasMoreElements();) {
// Get the entry name and write it to the output file
String newLine = System.getProperty("line.separator");
String zipEntryName =
((java.util.zip.ZipEntry)entries.nextElement()).getName() +
newLine;
writer.write(zipEntryName, 0, zipEntryName.length());
}
}
基本语法是:try(…) {} ,try里面所有实现接口java.lang.AutoCloseable,包括java.io.Closeable的对象,在{}的语句块执行完毕后都会自动的close。
那JDK7以前的版本怎么办呢,guava给我们提供了方法。我们可以把Closeable 的对象注册到Closer对象上,资源使用完毕后,调用closer的close方法,就可以把所有注册了的资源安全的close掉。这个方法虽然没有try-with-resources好用,但是比起传统的jdk做法,要好很多了。
Closer closer = Closer.create();
try {
InputStream in = closer.register(openInputStream());
OutputStream out = closer.register(openOutputStream());
// do stuff with in and out
} catch (Throwable e) { // must catch Throwable
throw closer.rethrow(e);
} finally {
closer.close();
}
三.Source和Sink
此外,guava还提供了Source和Sink来对文件流进行操作。
Files提供了方法,从File对象得到Source和Sink。
stati c ByteSource Files.asByteSource
static CharSource Files.asCharSource
static ByteSink Files.asByteSink
static CharSink Files.asCharSink
Source实现了InputSupplier,表示可读的输入流,但是跟InputSupplier不同,它是一个不可变化的supplier实例。
Source分为ByteSource 和CharSource,分别用来处理字节流和字符流。
Source提供了方法openStream() 返回一个新创建的输入流,可以使用这个流来读取文件内容,读取完毕后调用方要负责关闭掉。
此外,Source还提供了一些快捷操作的方法,如copyTo,调用这样的方法,操作完毕后会自动关闭文件,不用考虑手动关闭文件的问题。
与Source对应,Sink实现了OutputSupplier,表示可写的输出流,它也是一个不可变的supplier实例。
Sink也分为ByteSink和CharSink,分别用来处理字节流和字符流。
Sink也提供了方法openStream()返回一个新创建的输出流,可以使用这个流来写文件,完成后调用方要记得关闭掉流。
Sink里面有些快捷操作方法,如writeLines,writeFrom操作完成后也是会自动关闭文件的。
Source和Sink用起来还是很方便的,如下面一句话就可以实现文件复制了,完全不用考虑文件的关闭。
Files.asByteSource(new File("d:/1.txt")).copyTo(Files.asByteSink(new File("d:/2.txt"),FileWriteMode.APPEND));
相关推荐
10. **源码阅读**:学习和理解一些开源项目的源码,如Apache Commons、Guava等。 这份"java校招学习笔记"应该是一个全面的参考资料,帮助求职者巩固Java知识,提高解决问题的能力,以应对面试中的各种挑战。同时,...
Guava Joda-time Log4j Java 8 容器 Tomcat 1、Java 语言基础和JDK源码阅读 Java 语言基础 编号 名称 1 基本 2 运算符 3 数据类型 4 类 对象 接口 5 数组 6 枚举 7 异常处理 8 注解 9 范型 其他 编号 名称 1 Object...
例如,“对手分布函数库”可能指的是在Java中使用不同的库(如Apache Commons或Guava)来处理数据分布或算法;“空间不能快速的纪念版”可能是指内存管理或性能优化问题;“上课了半年”暗示了作者正在进行长期的...
它旨在帮助开发者通过Markdown格式整理和分享他们的学习笔记,同时也涵盖了其他技术领域如Vue.js、Node.js、Android学习以及Guava库的常用解析。 【描述】该项目可能是正在进行中的工作,因为提到了"可能未完结",...
Java提供了java.io和java.nio包来处理二进制数据,如文件读写、网络流等。例如,FileInputStream和FileOutputStream用于基本的文件操作,DataInputStream和DataOutputStream则支持二进制数据的读写。同时,BitSet类...
10. **工具类与库**:例如Apache Commons、Guava等,以及JUnit测试框架,Maven或Gradle构建工具等。 这些知识点是Java开发者必备的基础技能,熟练掌握并能够灵活运用,将有助于在笔试和面试中脱颖而出。对于每个...
收藏——IO模型的4张经典图例(一看就懂) ] () java技术系列文章 [ java swing 界面统一设置字体样式 ] () [ Google Java 编程风格指南 ] () [ Quartz应用与集群原理分析 ] () [ heavyz的Tomcat学习笔记(包括启动流程...
NIO,IO 注解 [笔记] dagger2: Retrofit和ButterKnife的注解怎么实现 反射 JOOR [ClassLoader==>字节码,apk] Socket==>openfire==>netty 设计模式:都在源码里 更好的使用java: [Json] Gson: [xml==>webservice] ...
笔记 Java 语言相关的API,第三方库和计算机基础理论等知识的学习和整理 更多 : | | 目录 资源 详细目录 Java语言和JDK源码 Java语言的基础理论知识 并发编程 Java并发编程相关的内容,并发包源码分析等 集合框架 ...
这个压缩包中可能包含了大量的教程、示例代码、笔记文档和其他相关材料,为初学者和经验丰富的开发者提供了丰富的学习资源。 1. **基础语法**:Java的基础语法是学习的起点,包括数据类型(如基本类型和引用类型)...
Java语言的特点包括跨平台性(得益于"一次编写,到处运行"的JVM)、强大的库支持(如Apache Commons、Google Guava等)、以及丰富的生态系统(如Maven Central仓库)。在实际开发中,Java被广泛应用于Web应用、大...
这些内容可能包括但不限于基础语法、面向对象编程概念、异常处理、集合框架、多线程、IO流、网络编程、数据库连接等Java核心知识点。此外,通过作者提供的CSDN博客和个人博客链接,读者可以找到更多更新和详细的信息...