Java中的IO流详解
Java中的IO流是非常重要的概念,是Java编程中必不可少的组成部分。可以理解为Java程序与外部世界之间的桥梁,通过IO流实现程序在内存与磁盘等存储设备之间的数据传输。本文将详细介绍Java中的IO流相关知识。
I/O流的基本概念
I/O流的概念基于对输入输出设备的操作实现,通过访问底层文件系统来读取或写入文件。这些数据源可以是磁盘、网络、系统控制等,而I/O流就是负责与数据源交互来完成读取和写入操作的管道。
Java中的I/O流可以分为输入流和输出流,分别用于读取和写入数据。此外,I/O流还可以根据读取和写入的数据类型进行分类为字符流和字节流。Java中包含了许多 I/O流组成,每一种流都有其特定的使用场景。
Java I/O流的分类
从数据读取/写入角度上分,Java I/O流可以分为两类:
输入流:从外部数据源读取数据到程序中(从键盘读取数据、从文件读取数据、从网络读取数据等)。
输出流:从程序中把数据写出到外部数据源中(把数据输送到控制台、把数据输出到文件、把数据发送到网络上等)
从数据传输内容角度上讲,可以把Java I/O流分为四类:
字节流输入/输出流:以字节为单位进行读写操作的I/O流,以流的形式将数据传输到指定位置(InputStream和OutputStream)。
字符流输入/输出流:以字符为单位进行读写操作的I/O流,以流的形式将数据转换为字符后传输到指定位置。常常用于处理文本文件或字符串数据流(Reader和Writer)。
缓冲区输入/输出流:缓冲区输入/输出流是基于字节流和字符流之上的一种I/O流,通过使用缓冲实现数据读写的优化。缓冲处理可以减少实际物理调用的次数,提高数据传输性能。
对象串行化输入/输出流:以对象为单位进行数据的传输。能够将一个对象序列化成字节序列后存储到文件、内存或者网络中,也能从文件、内存或者网络中读取字节序列并转成对象。
Java I/O流的使用
1. 字节流
字节流以字节为单位进行数据传输。其中InputStream和OutputStream是字节流最基本的形式。Java中内置许多具有字节流功能的类,比如,FileInputStream和FileOutputStream等。使用字节流时,可以使用BufferedInputStream和BufferedOutputStream来对流进行缓冲,已优化性能。
读取数据时,输入流一般使用以下方式:
BufferedInputStream in = new BufferedInputStream(new FileInputStream("file.txt"));
byte[] buffer = new byte[1024];
in.read(buffer, 0, 1024);
写数据时,输出流可按以下方式进行文件写入:
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("file.txt"));
byte[] buffer = new byte[1024];
out.write(buffer, 0, 1024);
2.字符流
字符流以字符为单位进行操作。与字节流相同,字符流也有一个基本的父类Reader和Writer,Java中内置许多具有字符流功能的类,比如FileReader和FileWriter等。使用字符流时,可以使用BufferedReader和BufferedWriter来进行缓冲,对性能进行优化。
读取数据时,输入流一般使用以下代码:
BufferedReader reader = new BufferedReader(new FileReader("file.txt"));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
写数据时,输出流可按以下方式进行文件写入:
BufferedWriter writer = new BufferedWriter(new FileWriter("file.txt"));
writer.write("This is a sentence.");
writer.newLine();
writer.flush();
writer.close();
3.缓冲区流
缓冲区流在字节流和字符流之上创建缓冲区,用于提高流的性能。常见的缓冲区流包括BufferedInputStream和BufferedOutputStream、BufferedReader和BufferedWriter、PushbackInputStream等。当数据读取或写入时,缓冲区看起来就像是输入输出流的缓存,缓存大小可自定义。
BufferedInputStream buffedIn = new BufferedInputStream(new FileInputStream("file.txt"));
byte[] buffer = new byte[1024];
int readSize;
while ((readSize = buffedIn.read(buffer)) != -1) {
System.out.println(new String(buffer));
}
4.对象流
对象流用于将对象序列化并写入流中,在网络、文件中传输和存储对象。可以分为ObjectInputStream和ObjectOutputStream两类。序列化时必须保证写入流和读取流同步,并且类型必须兼容,否则会报错。
Person person = new Person();
person.setName("Lucy");
person.setAge(18);
ObjectOutputStream objOut = new ObjectOutputStream(new FileOutputStream("person.txt"));
objOut.writeObject(person);
ObjectInputStream objIn = new ObjectInputStream(new FileInputStream("person.txt"));
Person readPerson = (Person) objIn.readObject();
总结
Java I/O流是Java编程中不可或缺的一部分。在日常编程工作中,要根据实际的需求选择合适的I/O流类进行读写操作,并进行数据的缓冲以提高性能。在使用对象流时,需要注意同步和类型兼容性。本文对Java I/O流的分类进行了详细介绍,并给出了常规的使用案例。
