温馨提示×

能否用inputstreamreader实现多线程数据读取

小樊
83
2024-10-09 22:03:23
栏目: 编程语言

是的,可以使用InputStreamReader结合多线程来实现数据读取。这里是一个简单的示例,展示了如何使用两个线程分别从不同的输入流中读取数据:

import java.io.*;
import java.util.concurrent.*;

public class MultiThreadedStreamReader {
    public static void main(String[] args) throws IOException, InterruptedException {
        // 创建两个输入流
        InputStream inputStream1 = new FileInputStream("input1.txt");
        InputStream inputStream2 = new FileInputStream("input2.txt");

        // 使用InputStreamReader将输入流转换为字符流
        InputStreamReader inputStreamReader1 = new InputStreamReader(inputStream1);
        InputStreamReader inputStreamReader2 = new InputStreamReader(inputStream2);

        // 创建线程任务
        Callable<String> task1 = () -> readFromStream(inputStreamReader1);
        Callable<String> task2 = () -> readFromStream(inputStreamReader2);

        // 使用ExecutorService执行线程任务
        ExecutorService executorService = Executors.newFixedThreadPool(2);
        Future<String> result1 = executorService.submit(task1);
        Future<String> result2 = executorService.submit(task2);

        // 获取线程任务的结果并输出
        System.out.println("Result from thread 1: " + result1.get());
        System.out.println("Result from thread 2: " + result2.get());

        // 关闭资源
        executorService.shutdown();
        inputStreamReader1.close();
        inputStreamReader2.close();
        inputStream1.close();
        inputStream2.close();
    }

    private static String readFromStream(InputStreamReader inputStreamReader) throws IOException {
        StringBuilder result = new StringBuilder();
        int character;
        while ((character = inputStreamReader.read()) != -1) {
            result.append((char) character);
        }
        return result.toString();
    }
}

在这个示例中,我们创建了两个输入流inputStream1inputStream2,分别读取两个不同的文件。然后,我们使用InputStreamReader将输入流转换为字符流。接下来,我们创建了两个线程任务task1task2,分别调用readFromStream方法从输入流中读取数据。最后,我们使用ExecutorService执行线程任务,并获取结果输出。

请注意,这个示例仅用于演示目的。在实际应用中,您可能需要根据具体需求对代码进行调整。例如,您可以使用缓冲流(如BufferedReader)来提高读取性能,或者根据需要调整线程池的大小。

0