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

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

一、Java流(Stream)

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

1.1 创建Stream

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

示例:

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)等。

示例:

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 创建文件和目录

示例:

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类来读取和写入文件。

示例:

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

示例:

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

示例:

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();
        }
    }
}

四、综合应用示例

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

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

  • 15
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值