Java I/O底层是如何工作的?
本博文主要讨论I/O在底层是如何工作的。本文服务的读者,迫切希望了解Java I/O操作是在机器层面如何进行映射,以及应用运行时硬件都做了什么。假定你熟悉基本的I/O操作,比如通过Java I/O API读写文件。这些内容不在本文的讨论范围。
本博文主要讨论I/O在底层是如何工作的。本文服务的读者,迫切希望了解Java I/O操作是在机器层面如何进行映射,以及应用运行时硬件都做了什么。假定你熟悉基本的I/O操作,比如通过Java I/O API读写文件。这些内容不在本文的讨论范围。
假如现在给你一个txt文件,该文件中存在学生基本信息,如:学生名称、性别和年龄。每行存放一个学生信息,每个元信息之间是有空格分割。然后将这些学生信息通过IO解析出来并且按照年龄从大到小进行排序,最后输出学生信息。
OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。
CharArrayWriter类实现一个可用作 Writer 的字符缓冲区。缓冲区会随向流中写入数据而自动增长。可使用 toCharArray() 和 toString() 获取数据。
PrintWriter类向文本输出流打印对象的格式化表示形式。此类实现在 PrintStream 中的所有 print 方法。它不包含用于写入原始字节的方法,对于这些字节,程序应该使用未编码的字节流进行写入。
日常开发中,需要在内存中缓存读取到的所有字符串,然后一次性全部使用。可以使用StringBuffer或StringBuilder来存储,这里我们来使用StringWriter类来实现,然后通过toString方法一次性输出字符串。
Java中StringReader类用来将字符串转换成字符输入流。然后使用字符输入流提供的方式进行操作,也可以提供给其他高级字符输入流来使用。如可以将该字符输入流提供给BufferedReader输入流使用。
InputStreamReader类是字节流通向字符流的桥梁:它使用指定的charset(字符集)读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。
PushbackReader类提供了将将字符推回到流的字符流Reader。你可以通过PushbackReader(Reader in, int size)构造方法来构造推回PushbackReader对象,size表示回推字符数组大小。
Java IO中的LineNumberReader类继承自BufferedReader,也就是说该类继承了BufferedReader的高级功能,每次可以读取一行数据。LineNumberReader类增加了获取和设置行号的功能。
Java IO的CharArrayReader类用来将指定的字符串构造成一个字符输入缓冲区提供给其他字符IO类使用。如将一个字符串要转换成一个输入字符流,我们可以将该字符串写出到磁盘文件,然后再将磁盘文件读入转换成字符串入流,但是这样耗时和浪费资源。此时,我们就可以使用CharArrayReader类来实现这个功能。
前面介绍了字节流,这里介绍字符流。字符流FileReader可以从文件中读取多字节文本,如:中文。用来读取字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的。
从前面所有的“跟我学IO”系列讲解了java普通io的操作。普通Java IO分输入流(InputStream)和输出流(OutputStream),并且每次只能操作一个字节,即使使用BufferedInputStream/BufferedOutputStream流也是如此。
操作系统和许多应用程序都会使用到临时文件,比如在windows或其他软件安装过程中会显示“创建临时文件”和“删除临时文件”等信息,临时文件一般用作应用程序的临时工作空间,或者实现数据的自动存储等功能。
在前面普通的IO操作中是读/写分开进行的,且写数据到文件中只能选择从头覆盖或者追加到文件尾部两种方式,这也是由于普通I/O流功能上的限制。在实际应用中,确实可能出现需要交替读/写文件、或定点读/写的情况,比如,我们使用文件来存储用户的成绩,如果用户存在,则修改用户的成绩。