摘要:Java IO 体系看起来类很多,感觉很简单,但其实是 IO 波及的因素太多了。在设计 IO 相干的类时,编写者也不是从同一个方面思考的,所以会给人一种很乱的感觉,并且还有设计模式的应用,更加难以使用这些 IO 类,所以顺便对 Java 的 IO 做一个总结。
本文分享自华为云社区《总是记不住java的IO流用法?用N个问题教你把握java IO流》,原文作者:breakDraw 。
Java IO 体系看起来类很多,感觉很简单,但其实是 IO 波及的因素太多了。在设计 IO 相干的类时,编写者也不是从同一个方面思考的,所以会给人一种很乱的感觉,并且还有设计模式的应用,更加难以使用这些 IO 类,所以顺便对 Java 的 IO 做一个总结。
文件API
Q: File类能够用来做目录操作吗?
A:能够。
File对象自身能够是目录。调用file.mkdirs()即可创立目录。
Q:间接调用file.delete()能够删除目录吗?
A:如果是文件或者空目录,能够间接删除。
但如果目录中有文件或者子目录,则必须递归删除。
private static boolean deleteDir(File dir) { if (dir.isDirectory()) { String[] children = dir.list(); //递归删除目录中的子目录下 for (int i=0; i<children.length; i++) { boolean success = deleteDir(new File(dir, children[i])); if (!success) { return false; } } } // 目录此时为空,能够删除 return dir.delete(); }
Q: 有哪些办法判断给定门路下文件是否存在?
A:
1.File类的exists办法: file.exist(string)
File testFile = new File(testFilePath);if(!testFile .exists()) {...}
2.File类的动态exist办法, File.exist(Path path)
Path filePath = Paths.get(testFilePath);if (Files.exists(filePath) {...}
留神静态方法和非静态方法的区别
字节输出流InputStream
说一下以下这些特点对应哪些Input Stream类
- 字节数组char[] 作为输出源的Input Stream类是——ByteArrayInputStream
- 用文件作为输出源的Input Stream类是?——FileInputStream
- 用字符串作为输出源的是?——StringBufferInputStream
- 用于多线程之间管道通信的输出源是——PipeInputStream
Q: FilterInputStream是什么?
A: 用于装璜下面这些输出流的,能够叠加,每装璜一层就相当于减少了1个性能。
InputStream inputStream = new FilterInputStream(InputStream)
以下这些特点别离对应哪些FilterInputStream?
- 装璜后,不仅可读字符串,还可读取例如int、long等java根本类型的是————DataInputStream
DataInputStream外面会反对readInt、readLong等办法。 - 装璜后,反对分批缓冲读取读取的是————BufferedInputStream
创立BufferedInputStream时,咱们会通过它的构造函数指定某个输出流为参数。BufferedInputStream会将该输出流数据分批读取,每次读取一部分到缓冲中;操作完缓冲中的这部分数据之后,再从输出流中读取下一部分的数据。 - 其余:
PushbackInputStream: 具备1个能回退上一个字节的缓冲区
ObjectInputStream : 个别用于反序列化读入
LineNumberInputStream: 可跟踪输出流中的行号
字节输入流OutputStream
OutputStream蕴含
ByteArrayOutputStream 输入到缓冲区
FileOutputStream 写到文件
PipedOutputStream 写入管道
FilterOutputStream
而FilterOutputStream 蕴含
- DataOutputStream (能够out.writexxx各种类型的数据,writeDouble, writeUTF, reader也一样,能够读想要的数据类型)、
- PringtStream (输入到文件用这个, 该类.println(str)即可写入文件)
- BufferOutputString
FileOutputStream相干
Q:new FileOutputStream(name, true),这个结构里的true参数是做什么用的?
A:是否反对在文件末追加的意思。
默认是false,指的是笼罩整个文本。
如果设置成true,会在要写入的文件前面追加本次写入的内容。
Q:
BufferOutputStream相干概念(其实是考缓冲区是否须要刷新之类的问题)
- BufferOutputStream里的flush()办法是做什么的?
- BufferOutputStream调用close后,会触发flush()来刷新缓冲区吗?
- BufferOutputStream调用close可能会丢数据吗?
- BufferOutputStream屡次调用close会报错吗?
A:
- flush把缓冲区里的数据写入文件,并刷新缓冲区
- close敞开此输入流并开释与此相关联的任何系统资源, 会调用flush,除了flushBuffer,还会调用父类的flush。
- 不会丢数据,因为下面这条起因。
- 屡次调用不会报错。
Reader和Writer
Q: Reader/Writer和InputStream/OutputStream的区别?
A:
- InputStream是示意 字节输出流 的所有类的超类
Reader是用于读取 字符流 的抽象类
InputStream提供的是字节流的读取,而非文本读取,这是和Reader类的基本区别。
即用Reader读取进去的是char数组或者String ,应用InputStream读取进去的是byte数组。 - Reader/Writer提供兼容Unicode、面向字符的IO性能,为了国际化
- 用reader读取规范输出:
BufferedReader bufr = new BufferedReader(new InputStreamReader(http://System.in)); - 用Writer进行规范输入:
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));
设置编码:
InputStreamReader isr = new InputStreamReader(new FileInputStream(file), "UTF-8"); BufferedReader read = new BufferedReader(isr);
序列化问题
Q: 对某对象进行序列化时, 如何让外面某个敏感成员不被序列化?
A:
- 办法一:可应用transient关键字解决那个敏感成员
- 办法二:能够通过笼罩Serializable接口的writeObject和readObject来实现序列化, 然而办法签名必须是private void writeObject(ObjetOutputStream stream) throw IOException;
- 办法三: 实现Externalizable接口,可自定义实现writeExternal以及readExternal办法
Q: Externalizable和Serializable哪个快?
A: Externalizable更快。
Q: Externalizable须要产生序列化ID吗?
A: 采纳Externalizable无需产生序列化ID(serialVersionUID)~而Serializable接口则须要
参考资料
https://blog.csdn.net/qq_2622...
https://blog.csdn.net/weixin_...
点击关注,第一工夫理解华为云陈腐技术~