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有所帮助。如果你有任何问题或建议,欢迎在评论区讨论。

相关推荐
hummhumm2 分钟前
数据结构第08小节:双端队列
java·数据结构·spring boot·spring·java-ee·maven·intellij-idea
梦中北山5 分钟前
JWT安全分析
开发语言·网络·安全·web安全·php
编程刘明18 分钟前
学会拥抱Python六剑客,提高编程效率
开发语言·数据库·python·程序人生·职场和发展·学习方法
不吃饭的猪18 分钟前
【无标题】
java·开发语言·docker
不会编程的小孩子19 分钟前
python 基础综合应用——小开发
开发语言·python
六月的雨__19 分钟前
二手物品交易小程序的设计
java·sql·学习·小程序
happy_plus32 分钟前
AutoX.js从某音分享链接解析出视频ID
开发语言·javascript·ecmascript
AI浩1 小时前
python Flask methods
开发语言·python·flask
Casual_Lei1 小时前
Hibernate
java·oracle·hibernate