Java基础知识总结——IO

基本概念

Java IO 即 Java 的输入/输出系统,其主要包含以下三个部分:

  • 流式部分:IO 的主体部分。
  • 非流式部分:主要包含一些辅助流式部分的类,如:File 类、SerializablePermission 类、RandomAccessFile 类和 FileDescriptor 等类。

Java IO 中重点掌握五个类(File、OutputStream、InputStream、Writer、Reader)和一个接口(Serializable)。

一、流式部分

Java 的 IO 流式实现输入/输出的基础,可以方便的实现数据的输入和输出操作。按照不同的分类方式,可以将流分为不同的类型:

  • 输入流和输出流:根据流的方向来区分,此处的输入和输出都是以程序运行所在的内存的角度来划分的。输入流主要由 InputStream 和 Reader 作为基类;输出流主要由 OutputStream 和 Writer 作为基类。
  • 字节流和字符流:根据操作的数据单元不同进行区分,字节流操作的数据单位是 8 位的字节,而字符流操作的数据单位是 16 位的字符。字节流主要由 InputStream 和 OutputStream 作为基类;字符流主要由 Reader 和 Writer 作为基类。
  • 节点流和处理流:按照流的角色来划分。节点流直接跟特定的 IO 设备进行交互,程序直接连接到实际的数据源;处理流则用于对一个已存在的流进行连接或封装,通过封装后的流来实现数据的读写功能。

1、输入流基类:InputStream 类和 Reader 类

InputStream 类和 Reader 类是两个抽象基类,本身并不能创建实例来执行输出,但它们是所有输入流的模板。

InputStream 包含的方法如下:

  • int read():从输入流中读取单个字节,返回所读取的字节数据(可直接转换为 int 类型)。
  • int read(byte[] b):从输入流中最多读取 b.length 个字节的数据到字节数组 b 中,返回实际读取的字节数。
  • int read(byte[] b, int off, int len):从输入流中最多读取 b.length 个字节的数据,并将其储存在字节数组 b 中,放入数组 b 中时,不从数组起点开始,而是从 off 位置开始,返回实际读取的字节数。

Reader 包含的方法如下:

  • int read():从输入流中读取单个字符,返回所读取的字符数据(可直接转换为 int 类型)。
  • int read(char[] cbuf):从输入流中最多读取 cbuf.length 个字符的数据到字符数组 cbuf 中,返回实际读取的字符数。
  • int read(char[] cbuf, int off, int len):从输入流中最多读取 cbuf.length 个字符的数据,并将其储存在字符数组 cbuf 中,放入数组 cbuf 中时,不从数组起点开始,而是从 off 位置开始,返回实际读取的字符数。

InputStream 和 Reader 用于移动记录指针的方法如下:

  • void mark(int readAheadLimit):在记录指针当前位置记录一个标记。
  • boolean markSupported():判断此输入流是否支持 mark() 操作,即是否支持记录标记。
  • void reset():将记录指针重新定位到上一次记录标记(mark)的位置。
  • long skip(long n):将记录指针向前移动 n 个字节(字符)。

2、输出流基类:OutputStream 类和 Writer 类

OutputStream 类和 Writer 类也是两个抽象基类,本身并不能创建实例来执行输出,但它们是所有输出流的模板。

OutputStream 和 Writer 包含的共同方法如下:

  • void write(int c):将指定的字节/字符输出到输出流中,其中 c 可以表示字节,也可以表示字符。
  • void write(byte[]/char[] buf):将字节数组/字符数组中的数据输出到指定输出流中。
  • void write(byte[]/char[] buf, int off, int len):将字节数组/字符数组中从 off 位置开始,长度为 len 的字节/字符输出到指定输出流中。

Writer 包含的额外方法如下:

  • void write(String str):将 str 字符串里包含的字符输出到指定输出流中。
  • void write(String str, int off, int len):将 str 字符串里从 off 位置开始,长度为 len 的字符输出到指定的输出流中。

OutputStream 包含的额外方法如下:

  • void flush() :刷新输出流,强制缓冲区中的输出字节被写出。
  • void close() :关闭输出流,释放和这个流相关的系统资源。

3、处理流

处理流是一种典型的装饰器模式,其功能体现在以下两个方面:

  • 性能的提高:以增加缓冲的方式来提高读写效率。
  • 操作的便捷:提供了一系列便捷的方法来一次读写大批量的内容。

在对输入流/输出流的抽象基类进行适用各种场景的封装之后,输入流/输出流的体系如下:

分类字节输入流字节输出流字符输入流字符输出流
抽象基类InputStreamOutputStreamReaderWriter
访问文件FileInputStreamFileOutputStreamFileReaderFileWriter
访问数组ByteArrayInputStreamByteArrayOutputStreamCharArrayReaderCharArrayWriter
访问管道PipedInputStreamPipedOutputStreamPipedReaderPipedWriter
访问字符串StringReaderStringWriter
缓冲流BufferedInputStreamBufferedOutputStreamBufferedReaderBufferedWriter
转换流InputStreamReaderOutputStreamWriter
对象流ObjectInputStreamObjectOutputStream
抽象基类FileInputStreamFileOutputStreamFileReaderFileWriter
打印流PrintStreamPrintWriter
推回输入流PushbackInputStreamPushbackReader
特殊流DataInputStreamDataOutputStream

说明:粗体字标注的类代表节点流,斜体字标注的类代表抽象基类。

转换流

转换流用于将字节流转换成字符流,InputStreamReader 将字节输入流转换成字符输入流,OutputStreamWriter 将字节输出流转换成字符输出流。

推回输入流

推回输入流有 PushbackInputStream 和 PushbackReader。推回输入流有一个推回缓冲区,程序可以将制定数组中的内容推回到该缓冲区中,推回输入流读取数据时总是先从推回缓冲区读取,推回缓冲区的内容读取完毕之后才会从原输入流中继续读取。创建推回输入流时需要指定推回缓冲区的大小,默认的推回缓冲区的长度为 1。
PushbackInputStream 和 PushbackReader 都提供的三个方法如下:

  • void unread(byte[]/char[] buf):将一个字节(字符)数组内容推回到推回缓冲区里。
  • void unread(byte[]/char[] b, int off, int len):将一个字节(字符)数组从 off 开始,长度为 len 字节(字符)的内容推回到推回缓冲区里。
  • void unread(int b):将一个字节(字符)推回缓冲区里。

二、非流式部分

1、File 类

用于在程序中操作文件和目录,File 能新建、删除、重命名文件和目录,但不能访问文件内容本身。如果需要访问文件内容本身,则需要使用输入/输出流。File 类可以使用文件路径字符串来创建 File 实例,该路径字符串可以是绝对路径,也可以是相对路径。File 类的常用方法如下:

访问文件名相关的方法:

  • String getName():返回此 File 对象所表示的文件名或路径名(如果是路径,则返回最后一级子路径名)。
  • String getPath():返回此 File 的路径名。
  • File getAbsoluteFile():返回此 File 对象的绝对路径。
  • String getAbsolutePath():返回此 File 对象所对应的绝对路径名。
  • String getParent():返回此 File 对象所对应目录(最后一级子目录)的父目录名。
  • boolean renameTo(File newName):重命名此 File 对象所对应的文件或目录,成功返回 true,失败返回 false。

文件检测相关的方法:

  • boolean exists():判断该文件或者目录是否存在。
  • boolean canWrite():判断该文件或者目录是否可写。
  • boolean canRead():判断该文件或者目录是否可读。
  • boolean isFile():判断该对象是否为文件。
  • boolean isDirector():判断该对象是否为目录。
  • boolean isAbsolute():判断该对象是否为绝对路径。

获取常规文件信息:

  • long lastModified():返回文件的最后修改时间。
  • long length():返回文件内容的长度。

文件操作相关的方法:

  • boolean createNewFile():当此 File 对象所对应的文件不存在时,该方法将新建一个该 File 对象所指定的新文件,创建成功返回 true,否则返回 false。
  • boolean delete():删除 File 对象所对应的文件或路径。
  • statice File createTempFile(String prefix, String suffix):在默认的临时文件目录中创建一个临时的空文件,使用系统给定的前缀、系统生成的随机数和给定的后缀作为文件名。suffix 参数可为 null,此时将使用默认后缀“.tmp”。
  • statice File createTempFile(String prefix, String suffix, File director):在 director 所指定的目录中创建一个临时的空文件,使用系统给定的前缀、系统生成的随机数和给定的后缀作为文件名。
  • void deleteOnExit():注册一个删除钩子,指定当虚拟机退出时,删除 File 对象所对应的文件和目录。

目录操作相关的方法:

  • boolean mkdir():创建一个 File 对象所对应的目录,成功返回 true,失败返回 false。调用该方法时 File 对象必须对应一个路径,而不是一个文件。
  • String[] list():列出 File 对象的所有子文件名和路径名,返回 String 数组。
  • File[] listFiles():列出 File 对象的所有子文件和路径,返回 File 数组。
  • static File[] listRoots():列出系统的所有根路径。

2、RandomAccessFile 类

RandomAccessFile 是一个特殊的类,既不是输入流也不是输出流,它两者都可以做到。他是 Object 的直接子类。通常来说,一个流只有一个功能,要么读,要么写。但是 RandomAccessFile 既可以读文件,也可以写文件。而且 RandomAccessFile 支持对文件的“随机访问”,程序可以直接跳转到文件的任意地方来读写数据。
RandomAccessFile 中有以下两个方法来操作文件记录指针:

  • long getFilePointer():返回文件指针的当前位置。
  • void seek(long pos):将文件记录指针定位到 pos 位置。

RandomAccessFile 包含了类似于 InputStream 的三个 read() 方法,也包含了类似于 OutputStream 的三个 write() 方法。
RandomAccessFile 类有两个构造器:

  • RandomAccessFile(String str, mode m):即文件名和打开方式。
  • RandomAccessFile(File file, mode m):File 参数和打开方式。

mode 参数指定文件的打开方式,有以下四个值:

  • “r”:只读。
  • “rw”:可读可写。
  • “rws”:可读可写,实时更新,刷新文件的内容和文件的修改日期。
  • “rwd”:可读可写,实时更新,刷新文件的内容,但修改日期可能不会更改,直到文件关闭。

3、Serializable 接口

对象序列化是指将 Java 对象写入 IO 流中,使之可以保存在磁盘上,或者通过网络传输。通过反序列化可以从 IO 流中恢复该 Java 对象。
实现 Serializable 接口可以实现对象序列化,该接口中没有需要实现的方法,只是为了标注该对象是可被序列化的。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值