Java系列之:读写文件、Callable接口、Runnable接口、线程池

Java系列之:读写文件、Callable接口、Runnable接口、线程池

  • 读取一个文件中的数据,排序后的结果写入到另一个文件中
  • 读取一个文件的内容,并将内容逐行写入到另一个文件中
  • 泛型接口Callable
  • 函数式接口Runnable
  • 线程池

读取一个文件中的数据,排序后的结果写入到另一个文件中

这段代码的作用是读取一个文件中的数据,对数据进行排序,然后将排序后的结果写入到另一个文件中。

  • 创建了一个BufferedReader对象bufferedReader,用于读取输入文件。BufferedReader是一个字符输入流,它继承自Reader类,可以逐行读取文本数据。
  • 创建了一个BufferedWriter对象bufferedWriter,用于写入输出文件。BufferedWriter是一个字符输出流,它继承自Writer类,可以将文本数据写入到文件中。
  • 通过for循环遍历排序后的data列表,将每行数据写入到输出文件中,并使用bufferedWriter.newLine()方法在每行数据之间添加一个换行符。
import java.io.*;
import java.util.ArrayList;
import java.util.Collections;

public class BufferReaderWriter {
    public static void main(String[] args) throws IOException {
        String filePath = "{输入文件名}";
        String outputFile = "{输出文件名}";

        BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath));
        BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(outputFile));

        ArrayList<String> data = new ArrayList<>();
        String line;
        while((line = bufferedReader.readLine()) != null){
            data.add(line);
        }

        Collections.sort(data);

        for (String ln : data){
            bufferedWriter.write(ln);
            bufferedWriter.newLine();
        }

        bufferedReader.close();
        bufferedWriter.close();
}}

读取一个文件的内容,并将内容逐行写入到另一个文件中

代码的作用是读取一个文件的内容,并将内容逐行写入到另一个文件中。

  • 使用FileInputStream类创建了一个输入流对象fis,并将其与file关联起来。FileInputStream是一个字节输入流,用于从文件中读取字节数据。
  • 创建了一个BufferedReader对象br,它使用InputStreamReader将字节输入流fis转换为字符输入流。BufferedReader是一个字符输入流,用于逐行读取文本数据。
  • 创建了一个FileOutputStream对象fos和一个OutputStreamWriter对象osw,用于写入目标文件。FileOutputStream是一个字节输出流,用于将字节数据写入文件。OutputStreamWriter是一个字符输出流,用于将字符数据转换为字节数据并写入文件。
import java.io.*;

public class FileInputStreamTest {
    public static void main(String[] args) throws IOException {
//        FileInputStream fileInputStream = new FileInputStream(("{文件路径}/tetest_debezium.conf"));

        //read()每次读取一个字节,没有数据返回-1
//        int read = fileInputStream.read();
//        System.out.println((char)read);

        //循环读取

//        int b;
//        while((b = fileInputStream.read()) !=-1){
//            System.out.println((char) b);
//        }

        //每次读取多个字节
//        byte[] buffer = new byte[1024*8];
//        int read1 = fileInputStream.read(buffer);
//        String s = new String(buffer);
//        System.out.println(s);
//        System.out.println("读取的字节数量是: "+read1);


        //循环读取
//        byte[] buffer = new byte[1024*8];
//        int len; //记住每次读取多少字节
//
//        while((len = fileInputStream.read(buffer)) !=-1){
//            //读取多少,倒出多少
//            String s = new String(buffer, 0, len);
//            System.out.print(s);
//        }
//         fileInputStream.close();


        String filePath = "{文件路径}/tetest_debezium.conf";

        // 创建File对象
        File file = new File(filePath);
        // 使用try-with-resources语句创建FileInputStream和BufferedReader


        FileInputStream fis = new FileInputStream(file);
        BufferedReader br = new BufferedReader(new InputStreamReader(fis));

//        // 读取文件内容
//        String line;
//        StringBuilder content = new StringBuilder();
//        while ((line = br.readLine()) != null) {
//            content.append(line);
//            content.append(System.lineSeparator());
//        }
//        // 打印文件内容
//        System.out.println(content.toString());

        //换行符
//        os.write("\r\n".getBytes())

        try(
        // 创建输出流写入目标conf文件
        FileOutputStream fos = new FileOutputStream("{}/tetest_debezium.conf");
        //把原始宕字节输出流,按照指定的字符集编码转换成字符输出转换流
        OutputStreamWriter osw = new OutputStreamWriter(fos,"utf-8");
        ) {
            //把字符输出流包装成缓冲字符输出流
            BufferedWriter bw = new BufferedWriter(osw);
            // 逐行读取原始conf文件内容,并写入目标conf文件
            String line;
            while ((line = br.readLine()) != null) {
                bw.write(line);
                bw.newLine();
            }
            br.close();
            bw.close();
            System.out.println("内容已经成功写入目标conf文件。");
        } catch (IOException e){
                  e.printStackTrace();
        }

    }}

泛型接口Callable

  • DebeziumCallable类中,实现了Callable接口的call()方法。在call()方法中,使用for循环计算从1到n的和,并将结果以字符串的形式返回。在返回的字符串中,使用Thread.currentThread().getName()方法获取当前线程的名称,并将其与计算结果一起输出。
  • Callable接口是一个泛型接口,它定义了一个call()方法,可以在其中编写并发计算任务的代码。Callable接口的call()方法返回一个泛型类型的值,用于表示计算的结果。
import java.util.concurrent.Callable;

public class DebeziumCallable implements Callable <String>{

    private int n;

    public DebeziumCallable(int n){
        this.n = n;
    }

    @Override
    public String call() throws Exception {

        int sum = 0;
        for (int i =1 ; i <= n; i++){
            sum +=i;
        }
        return Thread.currentThread().getName() + "求出了1-"+n+"的和是:"+sum;
    }
}

函数式接口Runnable

  • DebeziumRunnable类中,重写了Runnable接口的run()方法。在run()方法中,首先使用Thread.currentThread().getName()方法获取当前线程的名称,并将其与字符串" ==‍> 输出666~~"一起输出。
  • 然后,使用Thread.sleep(5)方法暂停当前线程的执行,使其休眠5毫秒。
  • Runnable接口是一个函数式接口,用于定义多线程任务的执行逻辑。它只包含一个抽象方法run(),该方法没有返回值。通过实现Runnable接口并重写run()方法,可以在多线程环境中执行自定义的任务逻辑。
import lombok.SneakyThrows;

public class DebeziumRunnable implements Runnable{
    @SneakyThrows
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + " ==> 输出666~~");

        Thread.sleep(5);
    }
}

线程池

  • ThreadPoolExecutor的构造方法接受多个参数,分别是核心线程数、最大线程数、线程空闲时间、时间单位、任务队列、线程工厂和拒绝策略。这些参数用于配置线程池的行为。
  • 接下来,创建了一个DebeziumRunnable对象target,作为任务对象。
  • 然后,通过pool.execute(target)方法将任务提交给线程池执行。execute()方法用于提交一个Runnable任务给线程池执行。线程池会自动创建一个新线程来处理任务,并执行DebeziumRunnable类中定义的任务逻辑。
  • 还通过pool.submit(new DebeziumCallable(100))方法将一个Callable任务提交给线程池执行。submit()方法用于提交一个Callable任务给线程池执行,并返回一个Future对象。Future对象可以用于获取任务执行的结果。
  • 最后,通过submit.get()方法获取Future对象的结果,并将结果打印输出。
  • 在代码的最后,创建了另一个线程池executorServicePool,通过Executors.newFixedThreadPool(3)方法创建一个固定大小的线程池。newFixedThreadPool()方法用于创建一个固定大小的线程池,其中指定的参数表示线程池中的线程数量。
import java.util.concurrent.*;

public class ThreadPoolTest {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ExecutorService pool = new ThreadPoolExecutor(3, 5, 8, TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(4), Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy());

        Runnable target = new DebeziumRunnable();

        pool.execute(target); //线程池会自动创建一个新线程,自动处理这个任务,自动执行
        pool.execute(target);
        pool.execute(target);


//        pool.shutdown();  //等着线程池的任务全部执行完毕之后再关闭线程池


        Future<String> submit1 = pool.submit(new DebeziumCallable(100));
        Future<String> submit2 = pool.submit(new DebeziumCallable(200));
        Future<String> submit3 = pool.submit(new DebeziumCallable(300));
        Future<String> submit4 = pool.submit(new DebeziumCallable(400));

        System.out.println(submit1.get());
        System.out.println(submit2.get());
        System.out.println(submit3.get());
        System.out.println(submit4.get());


        ExecutorService executorServicePool = Executors.newFixedThreadPool(3);
        //计算密集型宕任务:核心线程数量 = cpu的核数+1
        //IO密集型的任务:核心线程数量 =CPU核数*2


    }



}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/945894.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue3之小白入门篇

感觉vue这种东西的学习门槛不低&#xff0c;如果原来是用mvc方式编程的话。 在开始想以一个较完整的demo系统开发来学习时&#xff0c;却发现登录页面是个问题。 这是因为网上教程很少从一个小白的角度来设计思考一个完整的系统需要哪些知识&#xff0c;面临哪些问题&#xf…

python版本的Selenium的下载及chrome环境搭建和简单使用

针对Python版本的Selenium下载及Chrome环境搭建和使用&#xff0c;以下将详细阐述具体步骤&#xff1a; 一、Python版本的Selenium下载 安装Python环境&#xff1a; 确保系统上已经安装了Python 3.8及以上版本。可以从[Python官方网站]下载并安装最新版本的Python&#xff0c;…

PyCharm安装激活教程(Jetbrains其它软件可参考)

PyCharm安装激活教程 PyCharm安装激活教程1.python基础环境安装配置1.1 下载及安装 2.PyCharm安装及激活教程2.1 学生/教师安装&#xff08;有学信网/edu.cn邮箱&#xff09;及激活2.1.1 安装2.1.2 激活 2.2 非教育用户安装及激活2.2.1 安装2.2.2 激活 参考文献 PyCharm安装激活…

第 29 章 - ES 源码篇 - 网络 IO 模型及其实现概述

前言 本文介绍了 ES 使用的网络模型&#xff0c;并介绍 transport&#xff0c;http 接收、响应请求的代码入口。 网络 IO 模型 Node 在初始化的时候&#xff0c;会创建网络模块。网络模块会加载 Netty4Plugin plugin。 而后由 Netty4Plugin 创建对应的 transports&#xff0…

如何通过 Konga 可视化界面配置 Kong Key-Auth 实现Open API Key 认证

言简意赅的讲解 Konga 可视化配置 Kong Key-Auth解决的痛点 在现代微服务架构中&#xff0c;API 网关常常用于集中管理 API 的认证和授权。Kong 是一款非常流行的 API 网关&#xff0c;它提供了丰富的插件支持&#xff0c;而 Key Authentication&#xff08;Key-Auth&#xff…

C++——deque的了解和使用

目录 引言 标准库中的deque 一、deque的基本概念 二、deque的常用接口 1.deque的迭代器 2.deque的初始化 3.deque的容量操作 3.1 有效长度和容量大小 3.2 有效长度和容量操作 4.deque的访问操作 5.deque的修改操作 三、deque的应用场景 结束语 引言 在C中&#x…

使用R语言绘制交互地图

在现代地理信息系统&#xff08;GIS&#xff09;应用中&#xff0c;交互地图成为了数据展示的重要工具。相比传统的静态地图&#xff0c;交互地图不仅能够更生动地呈现空间数据&#xff0c;还能增强用户的参与感和数据探索性。本文将介绍如何使用R语言绘制交互地图&#xff0c;…

支持向量机入门指南:从原理到实践

目录 1 支持向量机的基本概念 1.2 数学表达 2 间隔与支持向量 2.1 几何间隔 2.2 支持向量的概念 2.3 规范化超平面 2.4 支持向量的深入分析 2.4.1 支持向量的特征 2.4.2 支持向量的作用 2.4.3 支持向量的代数表示 2.5 KKT条件 3 最优化问题 3.1 问题的形成 3.2 规…

【时时三省】(C语言基础)动态内存函数calloc

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 calloc calloc函数也用来动态内存分配 原型如下: void* calloc&#xff08;size&#xff3f;t num, size&#xff3f;t size&#xff09;&#xff1b; 它们两个的区别是 它是需要两个参数…

Flutter中添加全局防护水印的实现

随着版权意识的加强&#xff0c;越来越多的应用开始在应用内部增加各种各样的水印信息&#xff0c;防止核心信息泄露&#xff0c;便于朔源。 效果如下&#xff1a; 在Flutter中增加全局水印的方式&#xff0c;目前有两种实现。 方案一&#xff0c;在native层添加一个遮罩层&a…

uniapp - 小程序实现摄像头拍照 + 水印绘制 + 反转摄像头 + 拍之前显示时间+地点 + 图片上传到阿里云服务器

前言 uniapp&#xff0c;碰到新需求&#xff0c;反转摄像头&#xff0c;需要在打卡的时候对上传图片加上水印&#xff0c;拍照前就显示当前时间日期地点&#xff0c;拍摄后在呈现刚才拍摄的图加上水印&#xff0c;最好还需要将图片上传到阿里云。 声明 水印部分代码是借鉴的…

图像处理-Ch7-小波函数

个人博客&#xff01;无广告观看&#xff0c;因为这节内容太多了&#xff0c;有点放不下&#xff0c;分了三节 文章目录 多分辨率展开(Multi-resolution Expansions)序列展开(Series Expansions)尺度函数(Scaling Function)例&#xff1a;哈尔尺度函数(Haar scaling func)多分…

本地小主机安装HomeAssistant开源智能家居平台打造个人AI管家

文章目录 前言1. 添加镜像源2. 部署HomeAssistant3. HA系统初始化配置4. HA系统添加智能设备4.1 添加已发现的设备4.2 添加HACS插件安装设备 5. 安装cpolar内网穿透5.1 配置HA公网地址 6. 配置固定公网地址 前言 大家好&#xff01;今天我要向大家展示如何将一台迷你的香橙派Z…

Rocky Linux下安装meld

背景介绍&#xff1a; meld是一款Linux系统下的用于 文件夹和文件的比对软件&#xff0c;非常常用&#xff1b; 故障现象&#xff1a; 输入安装命令后&#xff0c;sudo yum install meld&#xff0c;报错。 12-31 22:12:17 ~]$ sudo yum install meld Last metadata expirat…

数据结构与算法之动态规划: LeetCode 337. 打家劫舍 III (Ts版)

打家劫舍 III https://leetcode.cn/problems/house-robber-iii/description/ 描述 小偷又发现了一个新的可行窃的地区。这个地区只有一个入口&#xff0c;我们称之为 root除了 root 之外&#xff0c;每栋房子有且只有一个“父“房子与之相连一番侦察之后&#xff0c;聪明的小…

chatwoot 开源客服系统搭建

1. 准备开源客服系统&#xff08;我是用的Chatwoot &#xff09; 可以选择以下开源客服系统作为基础&#xff1a; Chatwoot: 功能强大&#xff0c;支持多渠道客户对接&#xff0c;&#xff08;支持app&#xff0c;web&#xff09;。Zammad: 现代的开源工单系统。FreeScout: 免…

sentinel-请求限流、线程隔离、本地回调、熔断

请求限流&#xff1a;控制QPS来达到限流的目的 线程隔离&#xff1a;控制线程数量来达到限流的目录 本地回调&#xff1a;当线程被限流、隔离、熔断之后、就不会发起远程调用、而是使用本地已经准备好的回调去提醒用户 服务熔断&#xff1a;熔断也叫断路器&#xff0c;当失败、…

鸿蒙开发-ArkTS中使用Path组件

在ArkTS中使用Path组件&#xff0c;可以按照以下步骤进行&#xff1a; 一、了解Path组件 Path组件用于根据绘制路径生成封闭的自定义形状。该组件从API Version 7开始支持&#xff0c;并随着后续版本的更新可能增加新的功能。Path组件支持多种属性和方法&#xff0c;用于定义…

高效管理 Nginx 的利器:nginxWebUI 指南和 Docker 部署安装过程

前言 Nginx WebUI 是一个为 Nginx 提供图形化管理界面的工具。通过 WebUI&#xff0c;用户可以轻松管理 Nginx 配置&#xff0c;而无需直接编辑配置文件&#xff0c;尤其适合新手用户和频繁修改配置的场景。 官网文档&#xff1a;nginxWebUI - 文档 本文将分享为什么选择 ngin…

Linux网络 | 理解Web路径 以及 实现一个简单的helloworld网页

前言&#xff1a;本节内容承接上节课的http相关的概念&#xff0c; 主要是实现一个简单的接收http协议请求的服务。这个程序对于我们理解后面的http协议的格式&#xff0c;报头以及网络上的资源的理解&#xff0c; 以及本节web路径等等都有着重要作用。 可以说我们就用代码来理…