Java 中边读数据库边写到文件,可以处理大型数据文件而不会消耗太多内存。

news2025/2/25 17:39:57

从数据库查询结果集中提取单行数据,并按列格式化为字符串形式。主要功能如下:
遍历结果集的每一列。
根据不同的数据类型转换列值为字符串。
使用StringBuilder拼接各列值,列间以colSeparator分隔。
替换字符串中的换行符\n和回车符\r为空字符。
将处理后的行字符串添加到data列表中,每行后附加rowSeparator。

/**
 * 查询单行记录
 * @param data 数据列表,用于存储查询结果
 * @param rs 结果集对象
 * @param meta 结果集元数据对象
 * @param endCount 结束计数,用于处理行尾分隔符
 * @throws SQLException 如果查询过程中出现数据库错误
 */

/**
	 * 单行记录
	 * @param data
	 * @param rs
	 * @param meta
	 * @param formate
	 * @throws SQLException
	 */
	private void queryOneRow(List<String> data, ResultSet rs, ResultSetMetaData meta,int endCount) throws SQLException {
		StringBuilder buffer = new StringBuilder();
		int length = meta.getColumnCount();
		for (int i = 1; i <= length; i++) {
			String value = "";
			switch (meta.getColumnType(i)) {
			case java.sql.Types.BIGINT:
				if(NumberUtils.isNumber(rs.getObject(i)+"")){
					value = Long.toString(rs.getLong(i));
					break;
				} 
				break;
			case java.sql.Types.TINYINT:
				if(NumberUtils.isNumber(rs.getObject(i)+"")){
					value = Integer.toString(rs.getInt(i));
					break;
				}
				break;
			case java.sql.Types.SMALLINT:
				if(NumberUtils.isNumber(rs.getObject(i)+"")){
					value = Integer.toString(rs.getInt(i));
					break;
				} 
				break;
			case java.sql.Types.INTEGER:
				if(NumberUtils.isNumber(rs.getObject(i)+"")){
					value = Integer.toString(rs.getInt(i));
					break;
				} 
				break;
			case java.sql.Types.FLOAT:
				if(NumberUtils.isNumber(rs.getObject(i)+"")){
					value = Double.toString(rs.getDouble(i));
					break;
				} 
				break;
			case java.sql.Types.DOUBLE:
				if(NumberUtils.isNumber(rs.getObject(i)+"")){
					value = Double.toString(rs.getDouble(i));
					break;
				} 
				break;
			case java.sql.Types.DECIMAL:
				if(NumberUtils.isNumber(rs.getObject(i)+"")){
					value = Double.toString(rs.getDouble(i));
					break;
				} 
				break;
			case java.sql.Types.NUMERIC:
				if(NumberUtils.isNumber(rs.getObject(i)+"")){
					value = String.valueOf(rs.getObject(i));//Double.toString(rs.getDouble(i));
					break;
				} 
				break;
			case java.sql.Types.REAL:
				if(NumberUtils.isNumber(rs.getObject(i)+"")){
					value = Double.toString(rs.getDouble(i));
					break;
				} 
				break;
			case java.sql.Types.CHAR:
			case java.sql.Types.LONGVARCHAR:
			case java.sql.Types.VARCHAR:
				value = rs.getString(i);
				break;
			case java.sql.Types.DATE:
			case java.sql.Types.TIMESTAMP:
			case java.sql.Types.TIME:
				AbstractDateExecute dateExecute = DateFactory.getDateExecute(info.getDesJob().getDataSource().getDbType());
				value = dateExecute.getDateValue(meta.getColumnType(i), rs, i,
						"yyyy-MM-dd",
						info.getDesJob().getDesJobConf().getColumns().get(i-1).getFieldType());
				break;
			case java.sql.Types.CLOB:
				Clob clob = rs.getClob(i);
				if (clob != null) {
					value = clob.getSubString(1, (int) clob.length());
				}
				break;
			case java.sql.Types.BLOB:
				Blob blob = rs.getBlob(i);
				if(blob != null) {
					value = new String(blob.getBytes(1, (int) blob.length()));
				}
				break;
			case java.sql.Types.BIT:
				boolean o = rs.getBoolean(i);
				if(o==true){
					value = "1";
				}else if(o==false){
					value = "0";
				}
				break;
			case java.sql.Types.NCHAR:
			case java.sql.Types.NVARCHAR:
				value = rs.getString(i);
				break;
			case java.sql.Types.BINARY:
			case java.sql.Types.VARBINARY:
			case java.sql.Types.STRUCT:
			case java.sql.Types.DISTINCT:
			case java.sql.Types.LONGVARBINARY:
				value = rs.getString(i);
				break;
			}
			if (value == null) {
				value = "";
			}
			buffer.append(value);
			if(i<length){
				buffer.append(this.colSeparator);
			}
		}
		String temp = StringUtils.replace(buffer.toString(), "\n", "");
		temp = StringUtils.replace(temp, "\r", "");
//		if(endCount!=1){
//			temp = rowSeparator+temp;
//		}
//		data.add(temp);
		data.add(temp+rowSeparator);
		buffer = null;
	}


 * 此方法主要用于处理大量文本内容,将其转换为字节数组形式
 * 这对于存储或传输大量文本数据时非常有用
 

/**
 * 将字符串列表转换为字节数组
 * 
 * @param data 字符串列表,包含要转换的内容
 * @param charsetName 字符集名称,用于指定字符串编码
 * @return 字节数组,包含转换后的字节
 * 
 * 此方法主要用于处理大量文本内容,将其转换为字节数组形式
 * 这对于存储或传输大量文本数据时非常有用
 */
private byte[] getRowsContents(List<String> data, String charsetName) {
    // 使用StringBuilder来高效地拼接字符串
    StringBuilder content = new StringBuilder("");
    
    // 检查数据列表是否非空且包含元素
    if(data != null && !data.isEmpty()){
        // 遍历字符串列表,将所有字符串拼接起来
        for(String str : data){
            content.append(str);
        }
    }
    
    // 将拼接好的字符串转换为字节数组
    byte[] bs = null;
    try {
        // 使用指定的字符集将字符串转换为字节数组
        bs = content.toString().getBytes(this.charset);
    } catch (UnsupportedEncodingException e) {
        // 如果指定的字符集不受支持,则记录警告信息,并使用默认方式转换
        logger.warn("getBytes error", e);
        bs = content.toString().getBytes();
    }
    
    // 返回转换后的字节数组
    return bs;
}
/**
 * 清除IO共享内存中的MappedByteBuffer
 * 通过调用sun.misc.Cleaner的clean方法来完成清理,该方法在Java官方文档中未记录,因此使用doPrivileged来确保安全
 * 
 * @param buffer 要清除的MappedByteBuffer,如果为null,则不执行任何操作
 */
private void unmap(final MappedByteBuffer buffer) {
    // 当传入的buffer为null时,直接返回,不执行任何操作
    if (buffer == null) {
        return;
    }
    // 使用doPrivileged执行清理操作,以确保对MappedByteBuffer内部机制的操作不会因安全限制而失败
    AccessController.doPrivileged(new PrivilegedAction<Object>() {
        public Object run() {
            try {
                // 获得并调用cleaner方法,用于清理内存映射
                Method getCleanerMethod = buffer.getClass().getMethod("cleaner", new Class[0]);
                if (getCleanerMethod != null) {
                    getCleanerMethod.setAccessible(true);
                    Object cleaner = getCleanerMethod.invoke(buffer, new Object[0]);
                    Method cleanMethod = cleaner.getClass().getMethod("clean", new Class[0]);
                    if (cleanMethod != null) {
                        cleanMethod.invoke(cleaner, new Object[0]);
                    }
                }
            } catch (Exception e) {
                // 记录异常信息,便于问题追踪
            	logger.error(e.getMessage());
            }
            return null;
        }
    });
}

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

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

相关文章

C语言—指针(2)

目录 一、数组名的理解 二、使用指针访问数组 三、一维数组传参的本质 四、冒泡排序 五、二级指针 六、指针数组 七、字符指针变量 八、数组指针变量 &#xff08;8.1&#xff09;什么是数组指针变量 &#xff08;8.2&#xff09;数组指针变量的初始化 九、二维数组传…

Linux入门——08 进程间通讯——管道

1.进程间通讯 1.1什么是通讯 进程具有独立性&#xff08;每个进程都有自己的PCB,独立地址空间&#xff0c;页表&#xff09;但是要进行进程的通信&#xff0c;通信的成本一定不低&#xff0c;打破了独立性 进程间通信目的 数据传输&#xff1a;一个进程需要将它的数据发送给…

探索风扇产品模型的3D可视化魅力

在这个科技日新月异的时代&#xff0c;每一个细微的创新都能为我们的生活带来前所未有的便捷与享受。今天&#xff0c;就让我们一起踏入一场视觉与科技的盛宴&#xff0c;探索风扇产品模型如何通过3D可视化技术&#xff0c;重新定义家居生活的舒适与美学。 想象一下&#xff0c…

Redis—缓存机制

Redis 缓存机制 1. 缓存三兄弟1.1 缓存击穿1.2 缓存穿透1.3 缓存雪崩 2. 布隆过滤器3. 缓存和数据库数据一致性3.1 缓存更新策略3.2 缓存不一致处理 4. 热点 key4.1 热点 key 处理4.2 热点 key 重建 5. 缓存预热 Redis&#xff0c;一个轻量级的开源内存数据结构存储系统&#x…

Java:循环练习

目录 1. 回文判断 2. 减法求商余 3. 求平方根 4.求质数 5. 猜数字 1. 回文判断 输入一个数字&#xff0c;判断是否为回文&#xff0c;回文就是正着读和反着读都一样&#xff0c;如121是回文&#xff0c;123则不是。 import java.util.Scanner;public class DemoNew {publ…

白卡无法注册TDSCDMA问题分析

1、问题描述 MTK平台 实验室白卡测试TDSCDMA&#xff0c;默认无法注册。使用移动卡测试&#xff0c;无此问题。 2、问题分析 查看Radio log&#xff0c;Radio中反复下发EFUN去开关飞行模式。 39191: 08-14 22:45:57.159210 1469 1512 D RmcWp : [0] ECSRA info E…

CART决策树-基尼指数(全网最详解)

文章目录 一、基尼指数的定义二、基尼指数在CART决策树中的应用三、基尼指数与CART决策树的构建1.计算每个子集的基尼系数&#xff1a;2.计算基尼指数3.选择最优特征4.其余基尼指数5.构建决策树 四、总结 CART决策树基尼指数是CART&#xff08;Classification And Regression T…

稳石机器人 | 工业级AMR S1200L,专为多样化需求设计,柔性拓展更易用

近日&#xff0c;稳石机器人重磅推出基于新品控制器ROC1000的全新移动机器人AMR S1200L&#xff0c;专为满足生产制造和仓储物流的多样化需求而设计&#xff0c;无需改造现场&#xff0c;最快可在1周内完成部署。 重载型AMR-S1200L设计注重实用性和灵活性&#xff0c;可在室内…

Excel 中找出每列第一个和最后一个非空格对应的行--Excel难题#87

Excel表格的第2-6列有空格。 ABCDEF1StartDateQID1QID2QID3QID4QID5210/03/2024 10:561yes32310/03/2024 03:102no423409/03/2024 19:253yes22509/03/2024 11:404no1yes609/03/2024 03:555yes5no708/03/2024 20:106808/03/2024 12:257no908/03/2024 04:408yes1007/03/2024 20:…

Linux云计算 |【第二阶段】SECURITY-DAY4

主要内容&#xff1a; Kali系统、扫描与抓包、Nginx安全加固、Linux基本防护 补充&#xff1a;使用Curl命令查看网页头部信息和页面内容 不加选项&#xff0c;默认查看网页的内容&#xff1b; [ -I ] 选项&#xff1a;访问服务器页面时&#xff0c;显示HTTP的头部信息&#xf…

用阿里云“无影”搭建《黑神话:悟空》电脑环境

目录 《黑神话&#xff1a;悟空》 阿里云无影试用版概述 阿里云无影云电脑试用版情况 具体详细过程&#xff08;搭建环境&#xff09; 《黑神话&#xff1a;悟空》 《黑神话&#xff1a;悟空》作为一款高品质的国产游戏&#xff0c;对硬件配置有一定的要求。根据公开发布的…

【鸿蒙学习】HarmonyOS应用开发者高级认证 - 应用性能优化一(界面层面)

学完时间&#xff1a;2024年8月22日 学完排名&#xff1a;第1801名 一、介绍 在开发HarmonyOS应用时,优化应用性能是至关重要的。通过/ArkTS高性能编程、减少丢帧卡顿、提升应用启动和响应速度 可以有效提升用户体验。本文将介绍一些优化HarmonyOS应用性能的方法。 一、Ark…

Go开发桌面客户端软件小试:网站Sitemap生成

在前一篇【手把手教你用Go开发客户端软件&#xff08;使用Go HTML&#xff09;】中&#xff0c;我们详细介绍了如何通过Go语言开发一个简单的桌面客户端软件。本次&#xff0c;我们将继续这个系列&#xff0c;使用Go语言结合Sciter的Go绑定库——go-sciter&#xff0c;实战开发…

14.C基础_结构体

定义与使用 1、定义 定义结构体&#xff1a; 定义结构体时&#xff0c;需要注意最后的分号必须加上。 定义结构体时&#xff0c;成员只去声明类型&#xff0c;不进行赋值。赋值在定义结构体变量时进行。 struct 结构体名{结构体成员列表 }; //注意这里的分…

Qt入门学什么?

Qt是一个跨平台的C图形用户界面应用程序框架&#xff0c;它为应用程序开发者提供建立图形界面所需的所有功能。Qt框架以其面向对象、易于扩展的特性而受到广泛欢迎&#xff0c;并且支持多种平台&#xff0c;包括桌面、嵌入式和移动平台 。 对于Qt的入门学习&#xff0c;可以通过…

uniapp+vue3的defineProps传递

//index.vue <view class"topic"><!-- 磨砂背景 --><view class"content"><matte v-for"(item,index) in 8" :key"index"></matte><matte isMore"false"></matte></view>&…

0成本学习Liunx系统【只需要一台笔记本电脑,无需购买云服务器】

【准备工作&#xff0c;需要软件】&#xff1a; 1&#xff1a;MobaXterm 【服务器连接工具&#xff08;免费开源&#xff09;】 2&#xff1a;CentOS-7-x86_64-DVD-2009.iso 【CentOS-7 镜像】 3&#xff1a;VirtualBox-7.0.20-163906-Win.exe 【虚拟机壳子】 4&…

朴素贝叶斯与决策树分类

朴素贝叶斯分类 1贝叶斯分类理论 选择高概率对应的类别 2条件概率 事件B发生的情况下&#xff0c;事件A发生的概率 &#x1d443;(&#x1d434;|&#x1d435;)&#x1d443;(&#x1d434;∩&#x1d435;)/&#x1d443;(&#x1d435;) > &#x1d443;(&#x1d43…

【前端面试】浏览器原理解读

前端进阶——浏览器篇-CSDN博客 浏览器工作原理与Javascript高级&#xff08;前后端异步&#xff09;-CSDN博客 DOM树的建立过程 前端DOM&#xff08;文档对象模型&#xff09;数的建立过程&#xff0c;实际上是浏览器解析HTML文档并构建DOM树的过程。这一过程大致可以分为以…

声音克隆GPT-SoVITS 2.0软件和详细的使用教程!

天命人&#xff0c;请允许我先蹭个热点&#xff01; 原始声音&#xff1a; 播放 克隆声音&#xff1a; 播放 文章写了一半&#xff0c;被《黑神话悟空》刷屏了。突发奇想&#xff0c;用里面的声音来做个素材试试看。 B站捞了一点声音素材&#xff0c;随便剪一剪&#xff0c…