Java 流(Stream)、文件(File)和IO详解

Java中,流(Stream)、文件(File)和输入输出(IO)操作是非常重要的内容。这些功能用于处理数据的读取、写入以及流式处理。本文将详细介绍Java中流、文件和IO的使用方法,包括代码示例和应用场景。

一、Java流(Stream)

Java 8引入了Stream API,用于处理集合数据。Stream是一种可以执行一系列操作(如过滤、映射、减少等)以处理数据的抽象。

1.1 创建Stream

可以从集合、数组、生成器等创建Stream。

示例:

java 复制代码
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

public class StreamExample {
    public static void main(String[] args) {
        // 从集合创建Stream
        List<String> list = Arrays.asList("a", "b", "c");
        Stream<String> stream1 = list.stream();

        // 从数组创建Stream
        String[] array = {"x", "y", "z"};
        Stream<String> stream2 = Arrays.stream(array);

        // 使用Stream.of创建Stream
        Stream<String> stream3 = Stream.of("1", "2", "3");
    }
}

1.2 常见操作

Stream支持多种操作,如过滤(filter)、映射(map)、归约(reduce)等。

示例:

java 复制代码
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class StreamOperationsExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);

        // 过滤偶数
        List<Integer> evenNumbers = numbers.stream()
                .filter(n -> n % 2 == 0)
                .collect(Collectors.toList());
        System.out.println("Even numbers: " + evenNumbers);

        // 将数字平方
        List<Integer> squaredNumbers = numbers.stream()
                .map(n -> n * n)
                .collect(Collectors.toList());
        System.out.println("Squared numbers: " + squaredNumbers);

        // 计算总和
        int sum = numbers.stream()
                .reduce(0, Integer::sum);
        System.out.println("Sum: " + sum);
    }
}

二、Java文件操作(File)

Java的java.io.File类用于表示文件和目录路径名。可以使用File类创建、删除、检查文件和目录的属性等。

2.1 创建文件和目录

示例:

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

public class FileExample {
    public static void main(String[] args) {
        try {
            // 创建文件
            File file = new File("example.txt");
            if (file.createNewFile()) {
                System.out.println("File created: " + file.getName());
            } else {
                System.out.println("File already exists.");
            }

            // 创建目录
            File directory = new File("exampleDir");
            if (directory.mkdir()) {
                System.out.println("Directory created: " + directory.getName());
            } else {
                System.out.println("Directory already exists.");
            }
        } catch (IOException e) {
            System.out.println("An error occurred.");
            e.printStackTrace();
        }
    }
}

2.2 读取和写入文件

可以使用FileReaderFileWriter类来读取和写入文件。

示例:

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

public class FileReadWriteExample {
    public static void main(String[] args) {
        try {
            // 写入文件
            FileWriter writer = new FileWriter("example.txt");
            writer.write("Hello, World!");
            writer.close();

            // 读取文件
            FileReader reader = new FileReader("example.txt");
            int character;
            while ((character = reader.read()) != -1) {
                System.out.print((char) character);
            }
            reader.close();
        } catch (IOException e) {
            System.out.println("An error occurred.");
            e.printStackTrace();
        }
    }
}

三、Java IO(输入输出)

Java IO库提供了多种输入输出流类,用于处理字节和字符数据。主要分为字节流和字符流两类。

3.1 字节流

字节流用于处理8位字节数据,主要的类是InputStreamOutputStream及其子类。

3.1.1 FileInputStream和FileOutputStream

示例:

java 复制代码
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class ByteStreamExample {
    public static void main(String[] args) {
        try {
            // 写入字节文件
            FileOutputStream fos = new FileOutputStream("byteFile.txt");
            String data = "Hello, Byte Stream!";
            fos.write(data.getBytes());
            fos.close();

            // 读取字节文件
            FileInputStream fis = new FileInputStream("byteFile.txt");
            int byteData;
            while ((byteData = fis.read()) != -1) {
                System.out.print((char) byteData);
            }
            fis.close();
        } catch (IOException e) {
            System.out.println("An error occurred.");
            e.printStackTrace();
        }
    }
}

3.2 字符流

字符流用于处理16位字符数据,主要的类是ReaderWriter及其子类。

3.2.1 FileReader和FileWriter

示例:

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

public class CharStreamExample {
    public static void main(String[] args) {
        try {
            // 写入字符文件
            FileWriter writer = new FileWriter("charFile.txt");
            writer.write("Hello, Character Stream!");
            writer.close();

            // 读取字符文件
            FileReader reader = new FileReader("charFile.txt");
            int charData;
            while ((charData = reader.read()) != -1) {
                System.out.print((char) charData);
            }
            reader.close();
        } catch (IOException e) {
            System.out.println("An error occurred.");
            e.printStackTrace();
        }
    }
}

四、综合应用示例

在实际应用中,可能会综合使用文件操作和流来处理复杂的数据。下面是一个示例,展示如何读取一个文件的内容并通过流进行处理。

java 复制代码
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class FileStreamExample {
    public static void main(String[] args) {
        try (BufferedReader br = new BufferedReader(new FileReader("data.txt"))) {
            List<String> lines = br.lines().collect(Collectors.toList());
            List<String> filteredLines = lines.stream()
                    .filter(line -> line.contains("keyword"))
                    .collect(Collectors.toList());

            filteredLines.forEach(System.out::println);
        } catch (IOException e) {
            System.out.println("An error occurred.");
            e.printStackTrace();
        }
    }
}

五、总结

本文详细介绍了Java中的流(Stream)、文件(File)和IO操作,涵盖了基本概念、常用操作和示例代码。掌握这些知识对于处理数据、文件读写以及流式数据处理非常重要。希望这篇文章对你理解和应用Java的流、文件和IO有所帮助。如果你有任何问题或建议,欢迎在评论区讨论。

相关推荐
majingming1234 小时前
FUNCTION
java·前端·javascript
zopple4 小时前
常见的 Spring 项目目录结构
java·后端·spring
是娇娇公主~4 小时前
C++ 中 std::deque 的原理?它内部是如何实现的?
开发语言·c++·stl
SuperEugene5 小时前
Axios 接口请求规范实战:请求参数 / 响应处理 / 异常兜底,避坑中后台 API 调用混乱|API 与异步请求规范篇
开发语言·前端·javascript·vue.js·前端框架·axios
xuxie996 小时前
N11 ARM-irq
java·开发语言
cjy0001116 小时前
springboot的 nacos 配置获取不到导致启动失败及日志不输出问题
java·spring boot·后端
wefly20176 小时前
从使用到原理,深度解析m3u8live.cn—— 基于 HLS.js 的 M3U8 在线播放器实现
java·开发语言·前端·javascript·ecmascript·php·m3u8
zhenxin01226 小时前
Spring Boot实现定时任务
java
小江的记录本7 小时前
【事务】Spring Framework核心——事务管理:ACID特性、隔离级别、传播行为、@Transactional底层原理、失效场景
java·数据库·分布式·后端·sql·spring·面试
sheji34167 小时前
【开题答辩全过程】以 基于springboot的校园失物招领系统为例,包含答辩的问题和答案
java·spring boot·后端