首页 > 编程语言 >修改文件后缀名程序案例总结

修改文件后缀名程序案例总结

时间:2024-07-30 21:00:27浏览次数:12  
标签:总结 文件 String FileReader 后缀名 案例 file new File

85d11b944d334024929c38bae2a8aef2.jpg

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

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

1c9e9407b7ae4651b83a99d946ea4011.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";
    }
}

​

操作的时候,各种错误:

414c4865cb524de38b8c2e66532e7378.png

c5b5a640e86d47acb5c1921eb5a2db88.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();

​

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

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";
    }

9cda2b04c6f34cabad973af93a40b7ab.png

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

0e5b3be1c4c34184b64419f8fa119e15.jpg

标签:总结,文件,String,FileReader,后缀名,案例,file,new,File
From: https://blog.csdn.net/2301_80295456/article/details/140805024

相关文章

  • 校内ACM比赛总结
    不知道该叫什么名字就叫CDQZPC吧前言本来是三个人组队,但是临时给我们拆成了两个人。题目是学长出的。Asmb学长出的题,暂时不会B是一道猫树分治的题,通过这个题我思考了很多,我想了很多的做法,但是在时间上都差一点点,基本上卡在\(1e9\)的规模,然后就想到了猫树分治,但是......
  • CSP模拟10--总结
    今天是我第一次给模拟赛写正规总结--因为今天的题真的受不了了四道数学题,一点都不拖泥带水的纯血数学题!T1、黑暗型高松灯shit本来是一道放在T4防AK的题,结果学长为了恶心锻炼一下我们,直接将T1和T4swap了一下.一开始看了半个小时挺懵逼的,然后跳了,但心里一直觉得这题能做......
  • 环境变量和python多版本共存,视图层源码分析,视图层总结,路由层,
    Ⅰ环境变量和python多版本共存【一】环境变量【1】什么是环境变量无论是win,mac,linux都有环境变量的概念,以win为例什么是环境变量?环境变量(environmentvariables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。环境变量是在......
  • H3C SecPath 防火墙产品 典型配置案例集(V7)(RXX60 EXX60 E1185)-6W600
    H3CSecPathF1000系列防火墙https://www.h3c.com/cn/Service/Document_Software/Document_Center/IP_Security/FW_VPN/F10X0/?CHID=188680&v=612H3CSecPath防火墙产品典型配置案例集(V7)(RXX60EXX60E1185)-6W600https://www.h3c.com/cn/pub/Document_Center/2023/08/Web......
  • 最新基于多案例全流程防洪评价报告编制方法与水流数学模型建模实践技术应用
    随着社会经济的快速发展,我国河道周边土地开发利用率不断增大,临河建筑物与日俱增,部分河道侵占严重,导致防洪压力增大。加之部分河流沿岸临河建筑物设置混乱、布设不合理、阻水率增大、未经管理部门同意私设涉河建筑物等问题非常突出,已威胁到河道安全,使得河道防洪保障工作压力日益......
  • 7 .30 ACM总结
    放假前几天,老师让我们打一场ACM来放松一下(非常好,放松不一定,被压力了)C题C题是个非常水的搜索题,队友看一眼就秒了。写的时候出了一点小问题,但也调出来了,此时我们来到了第6(总共7队)。#include<bits/stdc++.h>#definelllonglongusingnamespacestd;constintN=1e3+5;......
  • 7.30总结
    T1很好的一道思维题。看到数据范围后,认为要么是\(O(1)\)的公式,要么是\(log_{2}n\)的算法。推了一下公式,推出来一个不等式,直接用二分来求解。T2开场感觉是一个树形DP,推了一会后发现一个节点的状态是具有后效性的,所以不能用DP进行求解。在观察一会之后,发现答案好像具有单......
  • 2024-7-30 信友队模考总结
    开考这次的题目看着比较简单,第一题一眼前缀和,第二题是双指针,三四题不很一眼,感觉可以冲300pts。果然T1直接秒掉,J组难度。开写第二题感觉是双指针,而且也很有单调性,但是怎么实现并没有一下想出来,写了大概10min过了样例和自测,但是观摩的时候发现假了,我写的是伪双指针,\(\math......
  • 7月30日CSP-S模拟赛赛后总结
    7月30日模拟赛赛后总结\[7月30日\\模拟赛\\赛后总结\\2024年7月30日\\by\\\hcy\]洛谷同步:点我一、做题情况第一题比赛\(100pts\),赛后\(AC\)第二题比赛\(20pts\),赛后\(AC\)第三题比赛\(0pts\),赛后\(AC\)第四题比赛\(30pts\),赛后\(30pts\)......
  • 7.30模考总结
    省流:上300了(模考难度不大,橙黄绿蓝)\(7.30\)晴\(T1\)报数游戏Ⅱ题意简述求在一段序列前加入一个最小的正整数,使这个序列的每一个前缀和都为正数。思路:前缀和扫一遍,找最小前缀和,特判为正数的情况。\(code\)#pragmaG++optimize(3,"Ofast","inline")#pragmaG++optim......