Java IO 流:简介与代码示例

Java IO 流:简介与代码示例

在 Java 中,IO(Input/Output)流是处理输入和输出的核心工具。通过 IO 流,我们可以读取和写入各种数据类型,包括文本、图片、音频等等。在本文中,我们将简要介绍 Java IO 流的基础知识,并附上一些简单的代码示例。

Java IO 流概述

Java IO 流可以根据输入/输出设备的类型和特性,将数据的输入和输出操作简化。它提供了一种抽象的方式,让我们可以使用统一的方式处理不同的输入输出情况。

分类

Java IO 流主要分为两种类型:字节流和字符流。

  1. 字节流 :用于处理二进制数据,如文件上传/下载、图片加载等。主要的字节流类有 InputStreamOutputStream
  2. 字符流 :用于处理文本数据,如文件读写、网络通信等。主要的字符流类有 ReaderWriter

常用类与接口

下表列出了一些常用的 Java IO 流类和接口:

类/接口 描述
FileInputStream/FileOutputStream 以二进制形式读取/写入文件
FileReader/FileWriter 以字符形式读取/写入文件
BufferedReader/BufferedWriter 提供带缓冲的读取/写入操作,提高效率
InputStreamReader/OutputStreamWriter 在字符流和字节流之间进行转换
PrintWriter 提供打印文本的方法
Scanner 用于读取输入,可以解析基本类型和字符串

代码示例

下面我们给出几个简单的 Java IO 流的代码示例。

1. 文件写入

java 复制代码
import java.io.FileWriter;
import java.io.IOException;

public class FileWritingExample {
    public static void main(String[] args) {
        try {
            FileWriter writer = new FileWriter("output.txt");
            writer.write("Hello, this is a text file.");
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

这个示例中,我们使用 FileWriter 类将字符串写入到一个名为 "output.txt" 的文件中。

2. 文件读取并打印

java 复制代码
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class FileReadingExample {
    public static void main(String[] args) {
        try {
            BufferedReader reader = new BufferedReader(new FileReader("input.txt"));
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在这个示例中,我们使用 BufferedReaderFileReader 类来读取名为 "input.txt" 的文件,并将文件的内容一行一行地打印到控制台。

3. 网络通信(字符流)

下面的示例是一个简单的客户端-服务器通信,通过 Socket 进行交互。注意,这需要将代码分割为两部分(Server 和 Client)来模拟客户端和服务器之间的网络通信。

首先是服务器端代码:

java 复制代码
import java.io.*;
import java.net.*;

public class Server {
    public static void main(String[] args) {
        try (ServerSocket serverSocket = new ServerSocket(8000)) {
            System.out.println("Server started.");
            Socket socket = serverSocket.accept(); 
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 
            BufferedReader consoleIn = new BufferedReader(new InputStreamReader(System.in)); 
            String input; 
            while ((input = consoleIn.readLine()) != null) { 
                out.println(input); 
                System.out.println("echo: " + input); 
            } 
        } catch (IOException e) { 
            System.out.println("Exception caught when trying to listen on port " + "8000" + " or listening for a connection"); 
            System.out.println(e.getMessage()); 
        } 
      }

接着是客户端的代码:

java 复制代码
import java.io.*;
import java.net.*;

public class Client {
    public static void main(String[] args) {
        try (Socket echoSocket = new Socket("localhost", 8000);
             PrintWriter out = new PrintWriter(echoSocket.getOutputStream(), true);
             BufferedReader in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));) {
            BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
            String userInput;
            while ((userInput = stdIn.readLine()) != null) {
                out.println(userInput);
                System.out.println("echo: " + in.readLine());
            }
        } catch (UnknownHostException e) {
            System.err.println("Don't know about host: localhost.");
            System.exit(1);
        } catch (IOException e) {
            System.err.println("Couldn't get I/O for the connection to: localhost.");
            System.exit(1);
        }
    }
}

这个例子是一个简单的回显服务器,客户端发送消息到服务器,服务器会将接收到的消息回传给客户端,并在控制台显示原消息和回传的消息。

总结

Java 的 IO 流提供了处理各种数据输入和输出的强大工具。无论是处理文件,还是处理网络通信,Java IO 流都能提供简单且高效的方式。在理解和使用这些工具时,要记住及时关闭打开的资源,以防止资源泄露。

相关推荐
一线大码2 分钟前
项目中怎么确定线程池的大小
java·后端
要加油哦~5 分钟前
vue · 插槽 | $slots:访问所有命名插槽内容 | 插槽的使用:子组件和父组件如何书写?
java·前端·javascript
crud8 分钟前
Spring Boot 3 整合 Swagger:打造现代化 API 文档系统(附完整代码 + 高级配置 + 最佳实践)
java·spring boot·swagger
天天摸鱼的java工程师13 分钟前
从被测试小姐姐追着怼到运维小哥点赞:我在项目管理系统的 MySQL 优化实战
java·后端·mysql
周某某~24 分钟前
四.抽象工厂模式
java·设计模式·抽象工厂模式
异常君1 小时前
高并发数据写入场景下 MySQL 的性能瓶颈与替代方案
java·mysql·性能优化
烙印6011 小时前
MyBatis原理剖析(二)
java·数据库·mybatis
你是狒狒吗1 小时前
TM中,return new TransactionManagerImpl(raf, fc);为什么返回是new了一个新的实例
java·开发语言·数据库
勤奋的知更鸟1 小时前
Java编程之组合模式
java·开发语言·设计模式·组合模式
千|寻1 小时前
【画江湖】langchain4j - Java1.8下spring boot集成ollama调用本地大模型之问道系列(第一问)
java·spring boot·后端·langchain