【踩坑】JDK1.8 AudioSystem 无法关闭流的问题

文章目录

  • 一、前言
  • 二、开始狼人杀
    • 嫌疑人1:
    • 嫌疑人2:
  • 三、复盘
    • Jdk8原生bug
    • 解决方法和原理解析

一、前言

做了一个基于文字转语言的小接口,想删除本地wav文件来着,结果发现删除不了。
很明显被占用了,还是被Java占用了…

在这里插入图片描述

二、开始狼人杀

嫌疑人1:

之前的代码是有一个spring的工具类FileCopyUtils.copy()使用


FileCopyUtils.copy(file, Paths.get(absPath).toFile());
if (file.exists() && !file.delete()){System.out.println(file.getAbsolutePath() + "删除失败");
}

看起来很正常,里面更正常:

public static int copy(InputStream in, OutputStream out) throws IOException {Assert.notNull(in, "No InputStream specified");Assert.notNull(out, "No OutputStream specified");int var2;try {var2 = StreamUtils.copy(in, out);} finally {close(in);close(out);}return var2;
}

close(in); close(out);很好很好,直接发个金水

嫌疑人2:

想到流程中用了Jdk8 javax.sound.sampled包下的 AudioInputStream,用于获取wav音频文件的时长,我是这样写的:

public static int getSoundLength(String filePath) {File file = new File(filePath);double duration;try(AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(file)){int sampleRate = (int) audioInputStream.getFormat().getSampleRate();int dataSize = audioInputStream.available();duration = dataSize / (sampleRate*audioInputStream.getFormat().getFrameSize());} catch (UnsupportedAudioFileException | IOException e) {return 0;}return (int) duration;
}

我觉得我调用的也没问题,但是我把这个功能删掉之后文件就不占用了,这个直接标铁狼

三、复盘

Jdk8原生bug

博客园找到了类似的贴子:https://www.cnblogs.com/hligy/p/17659473.html
包括给Jdk官方提交的bug票:https://bugs.openjdk.org/browse/JDK-8013586

在这里插入图片描述
1.7u9报的,看情况应该是在17修复了这个bug,直接润,换成别的方法实现

解决方法和原理解析

用Java内置的java.io.DataInputStream来读wav头文件

  • 代码
	import java.io.DataInputStream;import java.io.File;import java.io.FileInputStream;public static int getSoundLength(String filePath) {File audioFile = new File(filePath);int duration = 0;try (FileInputStream fis = new FileInputStream(audioFile);DataInputStream dis = new DataInputStream(fis)) {// 读取 WAV 文件的头部信息byte[] header = new byte[44]; // WAVE 文件头部长度固定为 44 字节dis.readFully(header);// 解析头部信息获取时长int sampleRate = (header[24] & 0xff) | ((header[25] & 0xff) << 8);int bitsPerSample = (header[34] & 0xff) | ((header[35] & 0xff) << 8);int channels = (header[22] & 0xff) | ((header[23] & 0xff) << 8);duration = (int) ((audioFile.length() - 44) * 8 / (sampleRate * bitsPerSample * channels));} catch (IOException e) {System.err.println("处理音频文件时发生错误: " + e.getMessage());}return duration;}
  • postman返回音频时长12秒
    在这里插入图片描述

  • idea控制台结果12秒:
    在这里插入图片描述

很好用,很润,用到的方法是:

在处理wav文件时,需要根据大小得到准确的播放时长,这中间是有确定关系的
Size = ((Rate * 1000 * Precision * Channels * Length) / 8) + 44 参数说明:
Size : 文件大小,Byte
Rate :采样率,kHz
Precision : 采样位数,bit
Channels : 声道数量
Length : 音频长度,s()那么根据反过来根据文件大小计算播放长度公式就是:
Length = (Size - 44) * 8 / (Rate * 1000 * Precision * Channerls)

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

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

相关文章

Linux内核源码分析(强烈推荐收藏!)

前言&#xff1a;Linux内核是由林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;在1991年开始开发的。当时他为了得到一个可以运行UNIX操作系统的个人计算机&#xff0c;开始编写一个操作系统内核&#xff0c;并将其命名为Linux。随后&#xff0c;越来越多的开发者加入到项…

【论文】:ALOHA双手远程操作手臂

对于机器人来说&#xff0c;诸如穿扎带或插入电池等精细操作任务是众所周知的困难&#xff0c;因为它们需要精确度、接触力的仔细协调以及闭环视觉反馈。执行这些任务通常需要高端机器人、精确的传感器或仔细的校准&#xff0c;这些可能既昂贵又难以设置。学习能否使用低成本且…

计算机组成原理之计算机硬件发展和计算机系统的组成

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

算法第4版 第2章排序

综述&#xff1a;5个小节&#xff0c;四种排序应用&#xff0c;初级排序、归并排序、快速排序、优先队列 2.1.初级排序 排序算法模板&#xff0c;less(), exch(), 排序代码在sort()方法中&#xff1b; 选择排序&#xff1a;如升序排列&#xff0c;1.找到数组中最小的元素&am…

llama_index 创始人为我们展示召回提升策略(提升15%)

用句子向量替换为句子向量 句子检索&#xff0c;将句子转化为向量。在检索的过程中&#xff0c;假如句子命中&#xff0c;则将句子周围的内容也当做检索内容。 对比句子检索和之前的按块去做切分的检索。可以看到&#xff0c;内容的相关性提升了8%&#xff0c; 构建数据的时候…

如何利用ChatGPT快速生成月报?

随着每个月的结束&#xff0c;个人和团队经常需要编写月报来回顾和总结。这项任务通常消耗大量时间和精力。幸运的是&#xff0c;借助ChatGPT&#xff0c;这个过程可以变得更加简单和高效。接下来&#xff0c;我将详细介绍如何利用ChatGPT快速生成月报&#xff0c;从而帮助你节…

NSSCTF Interesting_include

开启环境: 通过审计,我们可知: flag在flag.php中,可以利用php中伪协议 payload:?filterphp://filter/readconvert.base64-encode/resourceflag.php 将其base64解码就是flag. NSSCTF{3dc54721-be9e-444c-8228-7133fba76ad4}

大数据系列之:腾讯云服务器性能和价格比较

大数据系列之&#xff1a;腾讯云服务器性能和价格比较 一、磁盘性能和价格比较二、高性能云硬盘三、ssd云硬盘四、极速型ssd云硬盘五、增强型ssd云硬盘六、查看腾讯云服务器价格 一、磁盘性能和价格比较 磁盘名称高性能ssd云硬盘极速型ssd云硬盘增强型ssd云硬盘规格500g 5800 …

Navicat 技术干货 | 为 MySQL 表选择合适的存储引擎

MySQL 是最受欢迎的关系型数据库管理系统之一&#xff0c;提供了不同的存储引擎&#xff0c;每种存储引擎都旨在满足特定的需求和用例。在优化数据库和确保数据完整性方面&#xff0c;选择合适的存储引擎是至关重要的。今天&#xff0c;我们将探讨为 MySQL 表选择合适的存储引擎…

【BetterBench】2024年都有哪些数学建模竞赛和大数据竞赛?

2024年每个月有哪些竞赛&#xff1f; 2024年32个数学建模和数据挖掘竞赛重磅来袭&#xff01;&#xff01;&#xff01; 2024年数学建模和数学挖掘竞赛时间目录汇总 一月 &#xff08;1&#xff09;2024年第二届“华数杯”国际大学生数学建模竞赛 报名时间&#xff1a;即日起…

使用组合框QComboBox模拟购物车

1.组合框: QComboBox 组合框&#xff1a;QComboBox 用于存放一些列表项 实例化 //实例化QComboBox* comboBox new QComboBox(this);1.1 代码实现 1.1.1 组合框的基本函数 QComboBox dialog.cpp #include "dialog.h" #include "ui_dialog.h"Dialog::Dialog…

AC/DC控制电路选型分析

AC/DC控制电路选型&#xff0c;输出功率5W~20W&#xff0c;工作频率50KHz~100KHz UVL0/OVP/SCP/OCP/OLP等多种保护功能可选

C++ OpenGL 3D Game Tutorial 2: Making OpenGL 3D Engine学习笔记

视频地址https://www.youtube.com/watch?vPH5kH8h82L8&listPLv8DnRaQOs5-MR-zbP1QUdq5FL0FWqVzg&index3 一、main类 接上一篇内容&#xff0c;main.cpp的内容增加了一些代码&#xff0c;显得严谨一些&#xff1a; #include<OGL3D/Game/OGame.h> #include<i…

重新认识Elasticsearch-一体化矢量搜索引擎

前言 2023 哪个网络词最热&#xff1f;我投“生成式人工智能”一票。过去一年大家都在拥抱大模型&#xff0c;所有的行业都在做自己的大模型。就像冬日里不来件美拉德色系的服饰就会跟不上时代一样。这不前段时间接入JES&#xff0c;用上好久为碰的RestHighLevelClient包。心血…

模拟超市商品结算系统

要求:全程一个角色(管理员即用户) (1)需要管理员注册与登录 (2)管理员登录之后&#xff0c;可以进行上架新的商品(商品名称和单价) (3)管理员登录之后&#xff0c;也可以下架商品 (4)在节假日有优惠活动,可以对其中的一些商品修改相应的单价(价格提高和价格降低都可以) (5)用户…

如何使用CentOS系统中的Apache服务器提供静态HTTP服务

在CentOS系统中&#xff0c;Apache服务器是一个常用的Web服务器软件&#xff0c;它可以高效地提供静态HTTP服务。以下是在CentOS中使用Apache提供静态HTTP服务的步骤&#xff1a; 1. 安装Apache服务器 首先&#xff0c;您需要确保已安装Apache服务器。可以使用以下命令安装Ap…

关于burpsuite设置HTTP或者SOCKS代理

使用burpsuite给自己的浏览器做代理&#xff0c;抓包重发这些想必大家都清除 流量请求过程&#xff1a; 本机浏览器 -> burpsuite -> 目标服务器 实质还是本机发出的流量 如果我们想让流量由其他代理服务器发出 实现&#xff1a; 本机浏览器 -> burpsuite -> 某…

Blazor中使用impress.js

impress.js是什么&#xff1f; 你想在浏览器中做PPT吗&#xff1f;比如在做某些类似于PPT自动翻页&#xff0c;局部放大之类&#xff0c;炫酷无比。 在Blazor中&#xff0c;几经尝试&#xff0c;用以下方法可以实现。写文不易&#xff0c;请点赞、收藏、关注&#xff0c;并在转…

Python基础知识:整理9 文件的相关操作

1 文件的打开 # open() 函数打开文件 # open(name, mode, encoding) """name: 文件名&#xff08;可以包含文件所在的具体路径&#xff09;mode: 文件打开模式encoding: 可选参数&#xff0c;表示读取文件的编码格式 """ 2 文件的读取 文…

web缓存代理

缓存代理的概述 wed代理的工作机制 缓存网页对象&#xff0c;减少重复请求 web缓存代理作用 1.存储一些之前被访问的&#xff0c;且可能将要被再次访问的静态网络资源对象&#xff0c;使用户可以直接从缓存代理服务器获取资源&#xff0c;从而减少上游原始服务器的负载压力…