一文了解IO流

主要是背八股太枯燥了,而且目前很少用这个知识点,所以总结一下,方便记忆。

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接口的资源。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

miss writer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值