FileReader/Writer 修改后缀名的避坑指南

简介: 本文记录了批量修改图片后缀名时因错误使用FileReader和FileWriter导致文件损坏的问题。主要问题为:滥用FileWriter引发文件系统限制,以及FileReader造成资源锁定。通过移除冗余流操作并正确关闭资源,最终成功实现后缀修改。提醒开发者勿盲目套用模板,需理解原理。

全网同名「悬着的心终于死了」,全网同名认证



题主要批量修改网上下来的一些图片的后缀名,因为之前学艺不精,搞出来很多问题,这里记录一下(>_<)。

之前学习操作文件的时候很草率,总结了一套文件基本操作流程:

qe3r3yejbh3cq_675336ce2f184e6a84618eb0363924c4(1).png

现在回来才发现这个套路并不适合所有的文件类型

先上错误代码:

import java.io.*;
public class Main {
    public static void main(String[] args) throws Exception {
        String imgPath="D:\\文件夹/00015.webp";
        File file=new File(imgPath);
        FileReader fileReader=new FileReader(file);
        FileWriter fileWriter=new FileWriter(file);
        String fatherPath=file.getParent();
        String name=file.getName();
        System.out.println(file.renameTo(new File(fatherPath,toJpg(name))));
        try {
            fileReader.close();
            fileWriter.close();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    public static String toJpg(String oName){
        int path=oName.lastIndexOf(".");
        return oName.substring(0,path)+".jpg";
    }
}

image.gif

操作的时候,各种错误:

image.png

image.png

这里我总结为2个问题:

1.FileWriter错误使用

就像前面所说,我是直接套“模板”写,FileReader和FileWriter虽然没用到,但没报错就没删(这次长记性了>m<)

经过排查,发现因为我多写这一句FileWriter才导致图片损坏

这里是搜集到的结果


如果 WebP 文件已经损坏,可以考虑使用专门的工具进行修复。例如,FabConvert 提供了一个免费的 WEBP 修复工具,可以在任何具有现代网络浏览器的系统上运行,并且没有使用限制

  • 未正确关闭流:在使用 FileWriter 写入数据后,如果没有正确关闭流,可能会导致数据未完全写入,从而损坏文件 。
  • 异常处理不当:如果在写入过程中发生异常,而异常没有被正确捕获和处理,可能会导致文件处于不一致的状态 。
  • 写入中途断电或系统崩溃:在写入过程中,如果遇到断电或系统崩溃等意外情况,可能会导致文件写入未完成,从而损坏文件。
  • 文件系统限制:某些文件系统可能有写入限制,例如最大文件大小或特定格式要求,不遵守这些限制可能会导致文件损坏。
  • 缓存问题:有时候浏览器可能会缓存旧版本的图片文件,导致新的 WebP 图片无法加载,这可能是文件损坏的一个表现 。
  • 文件损坏:检查 WebP 图片文件是否损坏或完整。有时候图片文件可能会在上传或保存过程中出现问题 。

为了避免文件损坏,应该采取以下措施:

  • 确保在使用 FileWriter 后正确关闭它。
  • 使用异常处理来捕获并处理写入过程中可能发生的错误。
  • 避免在没有适当同步机制的情况下进行并发写入。
  • 使用事务或日志记录来确保写入操作的原子性和一致性。
  • 检查磁盘空间,并确保应用程序有足够的权限来写入文件。

这里我并没有用FileWriter写入数据,所以应该是文件系统限制的原因,希望有懂的大佬可以在评论区解答一下(ˊ˘ˋ*)♡。

2.FileReader错误使用

这里通过反复测试发现,在没有FileReader这一句是file.renameTo()是可以执行的,原因是在使用FileReader时会资源锁定。

以下为总结:


在许多编程语言中,当你使用 FileReader 或类似的文件读取类与一个 File 对象关联后,你通常不能再直接操作这个 File 对象来读取文件。这主要是因为以下几个原因:

  1. 资源锁定:一旦 FileReader 打开了一个文件,操作系统可能会锁定这个文件,防止其他进程或线程同时读取或写入,以避免数据损坏或冲突。
  2. 状态管理FileReader 可能内部维护了文件的状态信息,如当前读取位置。如果尝试用同一个 File 对象再次创建 FileReader,可能会遇到状态不一致的问题。
  3. 设计模式:编程语言的设计可能鼓励使用流式操作,即一次只通过一个流(如 FileReader)来处理文件,而不是同时打开多个流。
  4. 资源释放:如果 FileReader 没有被正确关闭,它可能会持续占用文件资源,导致其他操作无法进行。
  5. API限制:某些编程语言或库可能在API设计上限制了对同一个文件对象的多次使用,以简化资源管理和错误处理。

如果需要在同一个程序中多次读取同一个文件,通常的做法是:

  • 在每次读取操作之后,确保关闭 FileReader 对象。
  • 如果需要再次读取,可以重新打开文件,创建一个新的 FileReader 对象。

例如,在Java中,你可以这样做:

File file = new File("path/to/your/file.txt");
// 第一次读取
FileReader reader1 = new FileReader(file);
// ... 执行读取操作 ...
reader1.close();
// 第二次读取
FileReader reader2 = new FileReader(file);
// ... 执行读取操作 ...
reader2.close();

image.gif


综上,修改了这两个问题后,修改文件后缀名就成功了

import java.io.*;
public class Main {
    public static void main(String[] args) throws Exception {
        String imgPath="D:\\文件夹/00015.webp";
        File file=new File(imgPath);
        //FileReader fileReader=new FileReader(file);
        //FileWriter fileWriter=new FileWriter(file);
        String fatherPath=file.getParent();
        String name=file.getName();
        System.out.println(file.renameTo(new File(fatherPath,toJpg(name))));
    }
    public static String toJpg(String oName){
        int path=oName.lastIndexOf(".");
        return oName.substring(0,path)+".jpg";
    }

image.gif

image.png

最后叨叨一句,自己准备的模板一定要完全弄懂口牙_(:зゝ∠)_

相关文章
Altium Designer中元件重叠放置时,如何消除报错
Altium Designer中元件重叠放置时,如何消除报错
1530 0
|
9月前
|
缓存 算法 C++
模型推理加速
大模型推理加速关键技术包括KV-Cache优化、连续批处理、投机解码与模型并行等,涵盖算法、系统与硬件协同优化。vLLM等框架通过PagedAttention提升效率,助力高并发、低延迟场景落地。
452 0
|
6月前
|
Shell Windows
鼠标右键管理,鼠标右键功能如何更改?鼠标右键选项太多怎么处置呢?
这是一款绿色单文件Windows右键菜单管理工具,支持文件、文件夹、桌面、回收站等全场景右键项增删改;界面简洁,操作只需勾选/取消,实时刷新生效;还支持按文件类型定制及Shell高级扩展,兼顾新手与进阶用户需求。(239字)
878 1
|
6月前
|
弹性计算 人工智能 安全
从0到1落地OpenClaw:阿里云ECS及Mac/Linux/Windows本地搭建+免费百炼API配置集成Skill指南
OpenClaw(曾用名Clawdbot、Moltbot)是2026年开源AI智能体领域的核心工具,其核心价值在于支持本地部署、数据隐私可控,通过Skill(技能插件)扩展实现办公自动化、代码开发、文件管理、实时联网等全场景任务,真正让AI从“聊天工具”升级为“可执行任务的全能助手”。OpenClaw本身不具备大模型推理能力,需对接外部大模型API才能发挥全部功能,而阿里云百炼作为国内成熟的大模型服务平台,为新用户提供免费调用额度,且与OpenClaw实现深度适配,是新手零成本解锁AI能力的最优选择。
594 6
|
6月前
|
人工智能 自然语言处理 Linux
AI Agent驱动跨境流量重构!OpenClaw部署教程(阿里云/Win11/MacOS/Linux)+GEO实操+API配置指南
2026年,跨境电商行业正经历流量入口的结构性迁移——以OpenClaw为代表的AI Agent工具崛起,推动流量逻辑从传统SEO(搜索引擎优化)向GEO(生成式引擎优化)转型。消费者不再依赖关键词搜索筛选商品,而是通过自然语言向AI Agent寻求个性化推荐,完成“发现商品→比较选项→下单结账”的全闭环交易。数据显示,AI Agent带来的流量虽仅占跨境电商总流量的0.04%,但其转化率比全站平均水平高出14%,成为高价值流量的核心来源。
1015 0
敏捷开发 小程序 API
2473 0
|
应用服务中间件 程序员
IntelliJ IDEA 乱码:全网最全 4 种方法完美解决 IntelliJ IDEA 控制台中文乱码问题
IntelliJ IDEA 乱码:全网最全 4 种方法完美解决 IntelliJ IDEA 控制台中文乱码问题
2824 0
IntelliJ IDEA 乱码:全网最全 4 种方法完美解决 IntelliJ IDEA 控制台中文乱码问题
|
9月前
|
人工智能 自然语言处理 安全
2025年12月,中国数字人平台介绍与技术评析及数字化应用指南
2025年,虚拟数字人技术深度融入各行业。本文从技术、场景、安全三大维度,构建十大评估标准,揭示如何甄选兼具实用性、合规性与商业价值的数字人解决方案,助力企业智能化转型。
|
机器学习/深度学习 搜索推荐 算法
揭秘京东 API,让京东店铺商品推荐更懂用户
在电商时代,京东API通过大数据与机器学习,助力店铺实现精准商品推荐。本文揭秘其核心机制与优化策略,助您打造更“懂”用户的推荐系统,提升转化率与用户体验。
|
设计模式 开发者 UED
123. [HarmonyOS NEXT 实战案例一:SideBarContainer] 侧边栏容器实战:新闻阅读应用侧边栏布局 基础篇
在现代移动应用和平板应用中,侧边栏导航已经成为一种常见且实用的UI设计模式。HarmonyOS NEXT提供了专门的`SideBarContainer`组件来实现这一功能,它能够轻松创建可显示和隐藏的侧边栏布局,非常适合新闻阅读、电子商务、文件管理等应用场景。
565 3
123. [HarmonyOS NEXT 实战案例一:SideBarContainer] 侧边栏容器实战:新闻阅读应用侧边栏布局 基础篇