主要是背八股太枯燥了,而且目前很少用这个知识点,所以总结一下,方便记忆。
IO流(输入/输出流)在Java中是一个核心概念,广泛用于数据的读取和写入。IO流主别用于处理所有输入和输出操作,无论数据来源是文件、内存、网络还是其他任何数据源。主要的应用场景包括:
文件读写:这是IO流最常见的用途之一。使用IO流,可以从文件中读取数据(文本文件、二进制文件等),也可以向文件中写入数据。例如,FileInputStream和FileOutputStream用于处理文件的二进制数据,而FileReader和FileWriter则用于处理字符数据。
//使用字节流读文件
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;public class ReadFileExample {public static void main(String[] args) {String filePath = "path/to/your/file.txt";try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {String line;while ((line = reader.readLine()) != null) {System.out.println(line);}} catch (IOException e) {e.printStackTrace();}}
}
//使用字节流写入文件
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;public class WriteFileExample {public static void main(String[] args) {String filePath = "path/to/your/output.txt";String content = "Hello, World!";try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath))) {writer.write(content);} catch (IOException e) {e.printStackTrace();}}
}
网络通信:在网络通信中,IO流用于发送和接收数据。例如,当使用套接字(Socket)进行网络编程时,可以通过获取套接字的输入流和输出流来接收和发送数据。
//网络通信客户端
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;public class SimpleClient {public static void main(String[] args) {String hostname = "localhost";int port = 12345;try (Socket socket = new Socket(hostname, port);PrintWriter out = new PrintWriter(socket.getOutputStream(), true);BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {out.println("Hello from the client!");String response = in.readLine();System.out.println("Server: " + response);} catch (Exception e) {e.printStackTrace();}}
}
//网络通信服务器
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;public class SimpleServer {public static void main(String[] args) {int port = 12345;try (ServerSocket serverSocket = new ServerSocket(port);Socket clientSocket = serverSocket.accept();PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()))) {String request = in.readLine();System.out.println("Client: " + request);out.println("Hello from the server!");} catch (Exception e) {e.printStackTrace();}}
}
内存操作:IO流也可以用来操作内存中的数据。例如,ByteArrayInputStream和ByteArrayOutputStream可以分别从内存数组读取数据和向内存数组写入数据。
缓冲:为了提高IO操作的效率,Java提供了缓冲流(如BufferedReader、BufferedWriter、BufferedInputStream、BufferedOutputStream),它们使用缓冲区来减少实际进行物理读写操作的次数。
数据转换:IO流还可以用于在不同格式之间转换数据。例如,InputStreamReader和OutputStreamWriter可以将字节流转换为字符流,支持不同的字符编码。
序列化:对象序列化和反序列化也是IO流的一个重要应用,允许将对象的状态保存到文件中或通过网络发送,然后再恢复。ObjectInputStream和ObjectOutputStream是专门用于对象序列化的流。
//序列化
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;public class SerializeExample {static class Person implements Serializable {private static final long serialVersionUID = 1L;String name;int age;Person(String name, int age) {this.name = name;this.age = age;}}public static void main(String[] args) {Person person = new Person("John Doe", 30);try (FileOutputStream fileOut = new FileOutputStream("person.ser");ObjectOutputStream out = new ObjectOutputStream(fileOut)) {out.writeObject(person);} catch (IOException i) {i.printStackTrace();}}
}
//反序列化
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;public class DeserializeExample {public static void main(String[] args) {Person person = null;try (FileInputStream fileIn = new FileInputStream("person.ser");ObjectInputStream in = new ObjectInputStream(fileIn)) {person = (Person) in.readObject();} catch (IOException i) {i.printStackTrace();return;} catch (ClassNotFoundException c) {System.out.println("Person class not found");c.printStackTrace();return;}System.out.println("Deserialized Person...");System.out.println("Name: " + person.name);System.out.println("Age: " + person.age);}static class Person implements Serializable {private static final long serialVersionUID = 1L;String name;int age;}
}
管道通信:Java IO提供了管道相关的流(PipedInputStream和PipedOutputStream),允许在不同线程之间进行数据传输,实现线程间的通信。
IO流根据处理数据的类型可以分为字节流(以InputStream和OutputStream为基础)和字符流(以Reader和Writer为基础)。字节流主要用于处理二进制数据,如文件和网络数据;字符流则专门用于处理文本数据。根据数据流向的不同,IO流又可以分为输入流和输出流。
使用IO流时,需要注意资源管理,确保在使用完毕后及时关闭流,以释放相关资源。Java 7引入的try-with-resources语句提供了一种简便的资源管理方法,可以自动关闭实现了AutoCloseable接口的资源。