关于java:总是记不住java的IO流用法用N个问题教你掌握java-IO流

44次阅读

共计 3372 个字符,预计需要花费 9 分钟才能阅读完成。

摘要: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_…

点击关注,第一工夫理解华为云陈腐技术~

正文完
 0