Java 输入/输出(I/O)学习笔记

在保存数据时,可以选择二进制格式或文本格式。例如,整数 1234 存储成二进制数时,它被写为由字节 00 00 04 D2 构成的序列(十六进制表示法) ,而存储成文本格式时,它被存成了字符串“ 1234” 。尽管二进制格式的 I/O 高速且高效,但是不宜人来阅读。

读写文本数据

在存储文本字符串时,需要考虑字符编码(character encoding)方式。在 UTF-16 编码方式中,,字符串“ 1234”编码为 00 31 00 32 00 33 00 34 ( 十六进制) 。但是,许多程序都希望文本文件按照其他的编码方式编码。OutputStreamWriter 类将使用选定的字符编码方式,把 Unicode 字符流转换为字节流。而 InputStreamReader 类将包含字节(用某种字符编码方式表示的字符)的输入流转换为可以产生 Unicode 码元的读入器。 可以通过在 InputStreamReader 的构造器中进行指定的方式来选择不同的编码方式。例如:

InputStreamReader in = new InputStreamReader(new FileInputStream(“test.dat”), “ISO8859_5”);

对于文本输出,可以使用 PrintWriter。这个类拥有以文本格式打印字符串和数字的方法,它甚至还有一个将 PrintWriter 链接到 FileWriter 的便捷方法,下面的语句:

PrintWriter out = new PrintWriter(“test.txt”);

等同于:

PrintWriter out = new PrintWriter(new FileWriter(“test.txt”));

为了输出到打印写出器,需要使用与使用 System.out 时相同的 print、println 和printf 方法。

String name = “Harry Hacker”;double salary = (name + ();

它将把下面的字符:

Harry Hacker 45000.0

输出到写出器 out,之后这些字符将会被转换成字节并最终写入 test.txt 中。 对于文本输入,在 Java SE 5.0 之前,处理文本输入的惟一方式就是通过 BufferedReader 类,它拥有一个 readLine 方法,使得我们可以读入一行文本。需要将带缓冲区的读入器与输入源组合起来:

BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(“test.txt”), “UTF-8”));

但是,BufferedReader 没有任何用于读入数字的方法,所以建议使用 Scanner 来读入文本输入。

读写二进制数据

DataOutput 接口定义了一套完整的用于以二进制格式写数组、字符、boolean 值和字符串等的方法。为了读回数据,可以使用在 DataInput 接口中定义的相对应方法。 DataInputStream 类实现了 DataInput 接口,为了从文件中读入二进制数据,可以将DataInputStream 与某个字节源相组合,例如 FileInputStream:

DataInputStream in = new DataInputStream(new FileInputStream(“test.dat”));

与此类似,要想写出二进制数据,可以使用实现了DataOutput 接口的DataOutputStream 类:

DataOutputStream out = new DataOutputStream(new FileOutputStream(“test.dat”));

RandomAccessFile 类可以在文件中的任何位置查找或写入数据。磁盘文件都是随机访问的,但是从网络而来的数据流却不是。你可以打开一个随机访问文件,只用于读入或者同时用于读写,我们可以通过使用字符串“r” (用于读入访问)或“rw” (用于读入 / 写出访问)作为构造器的第二个参数来指定这个选项。

RandomAccessFile in = new RandomAccessFile(“test.dat”, “r”);RandomAccessFile inOut = new RandomAccessFile(“test.dat”, “rw”);

当你将已有文件作为 RandomAccessFile 打开时,这个文件并不会被删除。 随机访问文件有一个表示下一个将被读入或写出的字节所处位置的文件指针,seek 方法可以将这个文件指针设置到文件中的任意字节位置, seek 的参数是一个 long 类型的整数,它的值位于 0 到文件按照字节来度量的长度之间。 getFilePointer 方法将返回文件指针的当前位置。 RandomAccessFile 类 同 时 实 现 了 DataInput 和 DataOutput 接口,可以对文件进行随机读写。

以文本格式写出数据,需要使用PrintWriter。 以文本格式读入数据,需要使用Scanner。 以二进制格式写出数据,需要使用DataOutputStream。 以二进制格式读入数据,需要使用DataInputStream。

心中有愿望一定要去闯,努力实现最初的梦想,

Java 输入/输出(I/O)学习笔记

相关文章:

你感兴趣的文章:

标签云: