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

news2025/1/3 23:05:04

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


    }



}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Three.js教程004:坐标辅助器与轨道控制器

文章目录 坐标辅助器与轨道控制器实现效果添加坐标辅助器添加轨道控制器完整代码完整代码下载坐标辅助器与轨道控制器 实现效果 添加坐标辅助器 创建坐标辅助器: const axesHelper = new Three.AxesHelper(5);添加到场景中: scene.

【优选算法 分治】深入理解分治算法:分治算法入门小专题详解

快速排序算法 (1) 快速排序法 (2) 快排前后指针 (3) 快排挖坑法 颜色分类 题目解析 算法原理 算法原理和移动零非常相似 简述移动零的算法原理 cur 在从前往后扫描的过程中&#xff0c;如果扫描的数符合 f 性质&#xff0c;就把这个数放到 dest 之…

Qt5 中 QGroupBox 标题下沉问题解决

我们设置了QGroupBox 样式之后,发现标题下沉了,那么如何解决呢? QGroupBox {font: 12pt "微软雅黑";color:white;border:1px solid white;border-radius:6px; } 解决后的效果 下面是解决方法: QGroupBox {font: 12pt "微软雅黑";color:white;bo…

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

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

体验Cursor一段时间后的感受和技巧

用这种LLM辅助的IDE一段时间了&#xff0c;断断续续做了几个小项目了&#xff0c;总结一下整体的感受和自己的一些使用经验。 从Cursor开始又回到Cursor 第一个真正开始使用的LLM的辅助开发IDE就是Cursor&#xff0c;Github的Copilot支持尝试过&#xff0c;但是并没有真正的在…

【数据仓库】hadoop3.3.6 安装配置

文章目录 概述下载解压安装伪分布式模式配置hdfs配置hadoop-env.shssh免密登录模式设置初始化HDFS启动hdfs配置yarn启动yarn 概述 该文档是基于hadoop3.2.2版本升级到hadoop3.3.6版本&#xff0c;所以有些配置&#xff0c;是可以不用做的&#xff0c;下面仅记录新增操作&#…

宽带、光猫、路由器、WiFi、光纤之间的关系

1、宽带&#xff08;Broadband&#xff09; 1.1 宽带的定义宽带指的是一种高速互联网接入技术&#xff0c;通常包括ADSL、光纤、4G/5G等不同类型的接入方式。宽带的关键特点是能够提供较高的数据传输速率&#xff0c;使得用户可以享受到稳定的上网体验。 1.2 宽带的作用宽带是…

[2025] 如何在 Windows 计算机上轻松越狱 IOS 设备

笔记 1. 首次启动越狱工具时&#xff0c;会提示您安装驱动程序。单击“是”确认安装&#xff0c;然后再次运行越狱工具。 2. 对于Apple 6s-7P和iPad系列&#xff08;iOS14.4及以上&#xff09;&#xff0c;您应该点击“Optinos”并勾选“允许未经测试的iOS/iPadOS/tvOS版本”&…

Linux SVN下载安装配置客户端

参考&#xff1a; linux下svn服务器搭建及使用&#xff08;包含图解&#xff09;_小乌龟svn新建用户名和密码-CSDN博客 1.ubuntu安装svn客户端 “subversion” sudo apt-get update sudo apt-get install subversion 查看安装的版本信息&#xff0c;同时看是否安装成功 s…

【Windows】Windows系统查看目录中子目录占用空间大小

在对应目录下通过powershell命令查看文件夹及文件大小&#xff0c;不需要管理员权限。 以下为方式汇总&#xff1a; 方式1&#xff08;推荐&#xff0c;免费下载使用&#xff0c;界面友好&#xff09;&#xff1a; 使用工具以下是一些第三方工具treesize_free https://www.ja…

【论文阅读笔记】IceNet算法与代码 | 低照度图像增强 | IEEE | 2021.12.25

目录 1 导言 2 相关工作 A 传统方法 B 基于CNN的方法 C 交互方式 3 算法 A 交互对比度增强 1)Gamma estimation 2)颜色恢复 3)个性化初始η B 损失函数 1)交互式亮度控制损失 2)熵损失 3)平滑损失 4)总损失 C 实现细节 4 实验 5 IceNet环境配置和运行 1 下载…

L25.【LeetCode笔记】 三步问题的四种解法(含矩阵精彩解法!)

目录 1.题目 2.三种常规解法 方法1:递归做 ​编辑 方法2:改用循环做 初写的代码 提交结果 分析 修改后的代码 提交结果 for循环的其他写法 提交结果 方法3:循环数组 提交结果 3.方法4:矩阵 算法 代码实践 1.先计算矩阵n次方 2.后将矩阵n次方嵌入递推式中 提…

小白投资理财 - 看懂 PE Ratio 市盈率

小白投资理财 - 看懂 PE Ratio 市盈率 什么是 PE RatioPE 缺陷PE 优点总结 无论是在菜市还是股票市场&#xff0c;每个人都想捡便宜&#xff0c;而买股票就像市场买菜&#xff0c;必须货比三家&#xff0c;投资股票最重要就是要知道回本时间要多久&#xff0c;市场上很多时候散…

python利用selenium实现大麦网抢票

大麦网&#xff08;damai.cn&#xff09;是中国领先的现场娱乐票务平台&#xff0c;涵盖演唱会、音乐会、话剧、歌剧、体育赛事等多种门票销售。由于其平台上经常会有热门演出&#xff0c;抢票成为许多用户关注的焦点。然而&#xff0c;由于票务资源的有限性&#xff0c;以及大…

SQL-leetcode-183. 从不订购的客户

183. 从不订购的客户 Customers 表&#xff1a; -------------------- | Column Name | Type | -------------------- | id | int | | name | varchar | -------------------- 在 SQL 中&#xff0c;id 是该表的主键。 该表的每一行都表示客户的 ID 和名称。 Orders 表&#…

充电桩语音提示芯片方案-支持平台自定义语音NV128H让充电更便捷

随着工业化与城市化进程的加速推进&#xff0c;传统燃油汽车的数量急剧攀升&#xff0c;这直接导致了石油资源的过度开采与消耗。石油&#xff0c;作为不可再生的化石燃料&#xff0c;其储量日益枯竭&#xff0c;价格波动频繁&#xff0c;给全球能源安全带来了前所未有的挑战。…

Android 旋转盘导航栏

1.直接上源码&#xff1a; package com.you.arc;import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Point; import android.graphics.RectF; import android.support…

手搓一个ChatUI需要分几步

只关注项目代码的同学可以直接跳转目录中的正文部分&#xff0c;查看项目仓库和功能介绍。 引言 Chatbot的UI界面设计&#xff0c;是和传统软件不同的&#xff1a;都是当面一个简洁的对话框&#xff0c;框里预备着热乎的工具&#xff0c;可以随时更新。 像我这样做工的牛马&a…

低代码开发深度剖析:JNPF 如何引领变革

在当今数字化转型加速的时代&#xff0c;低代码开发已成为众多企业提升效率、降低成本的关键利器。它打破了传统开发模式的高门槛和冗长流程&#xff0c;让应用开发变得更加高效、灵活与普惠。 低代码开发的核心优势 低代码开发平台通过可视化的操作界面&#xff0c;减少了对…

uniapp实现APP、小程序与webview页面间通讯

需求&#xff1a; 1、需要在Uniapp开发的APP或小程序页面嵌入一个H5网页&#xff0c;需要拿到H5给APP传递的数据。 2、并且这个H5是使用vuevant开发的。&#xff08;其实跟使用uniapp开发H5一样&#xff09; 实现步骤&#xff1a; 1、首先需要兼容多端和App端&#xff0c;因…