摘要: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_26222859/article/details/50994113

https://blog.csdn.net/weixin_44117272/article/details/90767074

点击关注,第一时间了解华为云新鲜技术~

总是记不住java的IO流用法?用N个问题教你掌握java IO流的更多相关文章

  1. 这些年一直记不住的 Java I/O

    参考资料 该文中的内容来源于 Oracle 的官方文档.Oracle 在 Java 方面的文档是非常完善的.对 Java 8 感兴趣的朋友,可以从这个总入口 Java SE 8 Documentati ...

  2. 设计模式 - 装饰者模式(Decorator Pattern) Java的IO类 用法

    装饰者模式(Decorator Pattern) Java的IO类 用法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26716 ...

  3. Java中的IO基本用法

    先贴一下我在作业中用到的三种文件输入辅助类.三种文件输出辅助类 public class BuffIn implements InHelp{ private BufferedReader buffer ...

  4. IO流之处理流用法总结

    处理流之一:缓冲流1.为了提高数据读写的速度,Java API提供了带缓冲功能的流类,在使用这些流类时,会创建一个内部缓冲区数组,缺省使用8192个字节(8Kb)的缓冲区. 2.缓冲流要“套接”在相应 ...

  5. java基础IO流 复制键盘录入的目录,复制其中的.java文件到指定目录,指定目录中有重名,则改名 对加密文件计算字母个数

    package com.swift.jinji; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; im ...

  6. 面试题:JavaIO流分类详解与常用流用法实例

    Java流概念: Java把所有的有序数据都抽象成流模型,简化了输入输出,理解了流模型就理解了Java IO.可以把流想象成水流,里面的水滴有序的朝某一方向流动.水滴就是数据,且代表着最小的数据流动单 ...

  7. JAVA基础学习day21--IO流三-File、Properties、PrintWriter与合并、分割流

    一.File 1.1.File概述 文件和目录路径名的抽象表示形式. 用户界面和操作系统使用与系统相关的路径名字符串 来命名文件和目录.此类呈现分层路径名的一个抽象的.与系统无关的视图.抽象路径名 有 ...

  8. 第一篇 网站基础知识 第4章 Java中Socket的用法

    第4章 Java中Socket的用法 4.1 普通Socket的用法 Java中的网络通信是通过Socket实现的,Socket分为ServetSocket和Socket两大类,ServetSocke ...

  9. Java中的Socket用法

    转发链接:https://www.cnblogs.com/zhanglei93/p/6217384.html (1)Java中的Socket用法 Java中的Socket分为普通的Socket和Nio ...

  10. Java8用了这么久了,Stream 流用法及语法你都知道吗?

    1.简介 Stream流 最全的用法Stream 能用来干什么?用来处理集合,通过 使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询,Stream API 提供了一 ...

随机推荐

  1. 《最新出炉》系列初窥篇-Python+Playwright自动化测试-21-处理鼠标拖拽-番外篇

    1.简介 前边宏哥拖拽有提到那个反爬虫机制,加了各种参数,以及加载js脚本文件还是有问题,偶尔宏哥好像发现了解决问题的办法,看到了黎明的曙光,宏哥就说试一下看看行不行,万一实现了.结果宏哥试了结果真的 ...

  2. 二进制部署k8s高可用

    一.前置知识点 部署中遇到问题请参考:http://blog.ctnrs.com/post/k8s-binary-install/ 1.1 生产环境可部署Kubernetes集群的两种方式 目前生产部 ...

  3. stable-diffusion-webui官方版本地安装教程

    stable-diffusion-webui官方版本地安装教程 最终效果 1. python安装 官网:https://www.python.org/downloads/release/python- ...

  4. xtrabackup 2.4 的介绍与使用

    抄袭转载的太多,请认准原文链接:xtrabackup的介绍与使用 前言 在网上找到教程都是复制粘贴抄袭的,而且还是陈旧资料,不得不说,当前中文互联网环境真是每况愈下. 如果你在网上找 xtraback ...

  5. 从零开始学习web前端技术路线图

    最近我侄子快实习了,学校跟培训机构合作,交两万多可以参与一个培训,培训四个月,可以包就业.侄子问我,是否要去培训,培训出来可以找到工作吗? 现在很多大学生,上学的时候谈恋爱,玩游戏,快要毕业就焦虑了. ...

  6. Mysql面试大全

    说说MySQL索引的底层数据结构 MySQL索引的底层数据结构是B+树数据结构 详细介绍一下B+树的数据结构是什么样子的 B+树有三个特性 B+树是一个平衡多叉树,与平衡二叉树的每一个节点下面最多有两 ...

  7. spring---面向切面(AOP @Pointcut 注解篇)

    2.1 第一个实例 接下来,我们先看一个极简的例子:所有的get请求被调用前在控制台输出一句"get请求的advice触发了". 具体实现如下: 1.创建一个AOP切面类,只要在类 ...

  8. tomcat nio2源码分析

    一. 前言 ​ 最近在看tomcat connector组件的相关源码,对Nio2的异步回调过程颇有兴趣,平时读源码不读,自己读的时候很多流程都没搞明白,去查网上相关解析讲的给我感觉也不是特别清晰,于 ...

  9. CSS 也能实现 if 判断?实现动态高度下的不同样式展现

    最近在群里,有个小伙伴问了这么一道很有趣的问题: CSS 能否实现,容器再某个高度下是某种表现,一旦超出某个高度,则额外展示另外一些内容 为了简化实际效果,我们看这么一张示意效果图: 可以看到,当容器 ...

  10. Ubuntu 20.04 挂载 NTFS 硬盘 / 格式化并挂载 EXT4 硬盘

    创建挂载目录 mkdir /mnt/hdd 此目录在最后一步中用得到. 确定要挂载的硬盘 fdisk -l 由于我们要挂载的是 NTFS 硬盘,根据上面的信息,可以确定 /dev/sda1 是我们要挂 ...