outs.write(baos.toByteArray()) 内存溢出

本文介绍如何使用Java创建PDF文档,并优化大字节数组写入过程,包括利用RandomAccessFile进行高效文件操作。

ByteArrayOutputStream baos = makePdfByJson(result.toString(), “”);
if (baos.size() > 0) {
txtFilePath.setText(filePath.toString());
// 存在一个问题write() 没有办法写入超大的字节数组
// outs.write(baos.toByteArray());
byte[] buff = baos.toByteArray();
byte[] buff1 = new byte[buff.length / 2];
System.arraycopy(buff, 0, buff1, 0, buff.length / 2);
byte[] buff2 = new byte[buff.length - buff1.length];
System.arraycopy(buff, buff.length / 2, buff2, 0, buff2.length);
// 声明随机写文件对象,注意rwd是指即时将数据写到文件中,而不使用缓存区
// 对应的这个类中没有flush方法
RandomAccessFile out = new RandomAccessFile(filePath.toString(), “rwd”);
out.write(buff1);
out.seek(buff1.length);// 设置从文件的某个位置开始写数据。
out.write(buff2);
out.close();
baos.close();
Desktop.getDesktop().open(new File(filePath.toString()));
}

public List<String> pdfToPptToImageToAI(MultipartFile file) throws IOException { List<String> results = new ArrayList<>(); String fileName = file.getOriginalFilename().toLowerCase(); //PDF文件 if (fileName.endsWith(".pdf")) { try (PDDocument pdfDoc = PDDocument.load(file.getInputStream())) { PDFRenderer pdfRenderer = new PDFRenderer(pdfDoc); int totalPages = pdfDoc.getNumberOfPages(); for (int i = 0; i < totalPages; i++) { BufferedImage pdfImage = pdfRenderer.renderImageWithDPI(i, 200F); //171 175 145 145.7 191.9F processImage(results, pdfImage); } } } if (fileName.endsWith(".png")) { BufferedImage orig = ImageIO.read(file.getInputStream()); BufferedImage rgbImage = new BufferedImage( orig.getWidth(), orig.getHeight(), BufferedImage.TYPE_INT_RGB ); rgbImage.createGraphics().drawImage(orig, 0, 0, null); processImage(results, rgbImage); } System.out.println("识别内容:" + results); return results; } private void processImage(List<String> results, BufferedImage image) throws IOException { BufferedImage processedImage = sharpenImage(image); ByteArrayOutputStream baos = new ByteArrayOutputStream(); ImageIO.write(processedImage, "png", baos); String base64Image = Base64.getEncoder().encodeToString(baos.toByteArray()); String dataUrl = "data:image/png;base64," + base64Image; String promptText = " 请精准识别图片中的内容,不要思考和推理,只需要输出图中的内容。不要缺少图片内容, 单词如Luxsan 禁止改成Luksan 禁止缺少Delivery Date 这个日期内容 "; Media media = Media.builder() .mimeType(MimeTypeUtils.IMAGE_PNG) .data(dataUrl) .build(); UserMessage userMessage = new UserMessage(promptText, media); String content = chatModel.call(new Prompt(userMessage)).toString(); results.add(content); } 我这个是大模型识别 pdf识别效果是可以的 但是我的png效果不行
08-26
请完整阅读完我的发言后再回答,我的发言中已经给你了需要的请求体数据,流数据的处理逻辑和需要你改写的脚本,现在我有一段消息体数据:{"isendLevel":"1","unitId":"2ce25663d6614d4fb010f913ec1a25f4","levelName":"压测专用单词跟读","jsonobject":"[{\"learn_time\":\"3\",\"fluency\":\"0\",\"xmlPath\":\"2000000026000000001\\\/abf0c489bd17448ea28d81d780dfb897\\\/ee1ef4ca2a1844f88716675320e7bcd0\\\/t1\\\/2f803dff2a9c41b9839972655b9dfa42\\\/1756109482\\\/0_0.xml\",\"ansDetail\":\"hello.#76\",\"recordPath\":\"2000000026000000001\\\/abf0c489bd17448ea28d81d780dfb897\\\/ee1ef4ca2a1844f88716675320e7bcd0\\\/t1\\\/2f803dff2a9c41b9839972655b9dfa42\\\/1756109482\\\/0_0.mp3\",\"mp3FilePath\":\"\\\/var\\\/mobile\\\/Containers\\\/Data\\\/Application\\\/6B97B168-E06D-432F-9242-62033F423337\\\/Documents\\\/0_0.mp3\",\"xmlFilePath\":\"\\\/var\\\/mobile\\\/Containers\\\/Data\\\/Application\\\/6B97B168-E06D-432F-9242-62033F423337\\\/Documents\\\/0_0.xml\",\"questionId\":\"ee1ef4ca2a1844f88716675320e7bcd0#0#0\",\"accuracy\":\"0\",\"complete\":\"0\",\"score\":\"76\",\"semantic\":\"0\"}]","schoolId":"2000000026000000001","type":"1","levelId":"28444e91e51f4031b3282c2d5ef7f46a","taskId":"2f803dff2a9c41b9839972655b9dfa42","oldQuestionId":"ee1ef4ca2a1844f88716675320e7bcd0","classId":"2811000226001564227,2811000226001564228,2811000226001564229,2811000226001564230,","studentId":"abf0c489bd17448ea28d81d780dfb897","rolename":"STU"} 我现在在用jmeter调试接口,现在需要你帮我改写一段脚本,参考提问中的消息体数据,在脚本中加入接口包含流的处理,处理逻辑是: //如果地址包含流操作的地址 if(iscontains(request,GZIP CHECK URL)){ //从流操作的地址中获取所有的参数集合 //Map<String, object>pMap = GzipRequestWrapper.gzip(request); String params = GZipDecodeUtil.decodeGZipTostring(request); if(paramsnull) {return null; } Map<String, object>pMapJSON parseobiect(params,Map.class); if(pMap = null){ return null; } request,setAttribute(s:"submitchallengeRec"",params); //获取参数集合key的set集合 Set<String>keySet = pMap.keySet(); //循环set集合得到每一个key值 for(object key :keySet.toArray()){ String parakey = key.tostring(); String paraValue = null; //将所有的request中map集合中的value值转化为String类型 paraValue=((string)pMap.get(parakey)); //将转化好的key,value值放到结合中 map.put(parakey, paraValue); 转成map排序后,再按照脚本原有逻辑排序参数+mykey+token+uuid通过md5生成sign,并存储到对应的变量中 需要修改的脚本内容是:// 导入必要的 Java 类 var URL = Java.type('java.net.URL'); var URLDecoder = Java.type('java.net.URLDecoder'); var MessageDigest = Java.type('java.security.MessageDigest'); var UUID = Java.type('java.util.UUID'); // 生成签名的函数 function generateSign(params, uuid, tokenstu) { var myKey = 'fifedu@2014-9999!@#'; // 提取参数值并处理列表类型 var values = []; for (var key in params) { var value = params[key]; if (value instanceof java.util.List) { // 处理列表值:取第一个非空元素 for (var i = 0; i < value.size(); i++) { if (value.get(i) !== null && value.get(i).toString().trim() !== '') { values.push(value.get(i).toString()); break; } } } else if (value !== null && value.toString().trim() !== '') { // 处理普通值 values.push(value.toString()); } } // 排序并连接值 values.sort(); var text = values.join('') + myKey + tokenstu + uuid; vars.put('text_stu9', text); // 生成 MD5 签名 var md = MessageDigest.getInstance('MD5'); var digest = md.digest(new java.lang.String(text).getBytes('UTF-8')); // 将字节数组转换为十六进制字符串 var hexString = ''; for (var i = 0; i < digest.length; i++) { var hex = (digest[i] & 0xFF).toString(16); if (hex.length === 1) { hex = '0' + hex; } hexString += hex; } return hexString; } // 1. 生成随机 UUID var generatedUuid = UUID.randomUUID().toString(); vars.put('uuid', generatedUuid); // 获取当前采样器的 URL 和查询参数 var samplerUrl = sampler.getUrl().toString(); var url = new URL(samplerUrl); var query = url.getQuery(); // 解析查询参数 var params = {}; if (query !== null) { var queryPairs = query.split('&'); for (var i = 0; i < queryPairs.length; i++) { var pair = queryPairs[i].split('=', 2); var name = URLDecoder.decode(pair[0], 'UTF-8'); var value = pair.length > 1 ? URLDecoder.decode(pair[1], 'UTF-8') : ''; params[name] = value; } } // 生成签名并存储变量 var tokenstu = vars.get('tokenstu') || ''; vars.put('signstu9', generateSign(params, generatedUuid, tokenstu)); vars.put('uuid_stu9', generatedUuid); vars.put('token_stu9', tokenstu); vars.put('params_stu9', JSON.stringify(params)); // 使用 JSON 代替 inspect()
最新发布
08-26
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值