如何在运行时在 Java 中更改文件扩展名

问题描述 投票:0回答:8

我正在尝试实现程序来压缩和解压缩文件。我想要做的就是压缩一个名为 fileName.zipfile (fileName.fileExtension) 并在解压缩时再次将其更改为 fileName.fileExtension.

java file-rename
8个回答
15
投票

这就是我过去重命名文件或更改其扩展名的方式。

public static void modify(File file) 
    {
        int index = file.getName().lastIndexOf(".");
        //print filename
        //System.out.println(file.getName().substring(0, index));
        //print extension
        //System.out.println(file.getName().substring(index));
        String ext = file.getName().substring(index);
        //use file.renameTo() to rename the file
        file.renameTo(new File("Newname"+ext));
    }

edit:John 的方法重命名文件(保留扩展名)。要更改扩展名,请执行以下操作:

public static File changeExtension(File f, String newExtension) {
  int i = f.getName().lastIndexOf('.');
  String name = f.getName().substring(0,i);
  return new File(f.getParent(), name + newExtension);
}

这只会将最后一个扩展名更改为文件名,即

.gz
archive.tar.gz
部分。因此它适用于 Linux 隐藏文件,其名称以
.
开头 这是非常安全的,因为如果
getParent()
返回
null
(即在父级是系统根的情况下)它被“强制转换”为一个空字符串,因为首先评估 File 构造函数的整个参数。

你会得到一个有趣的输出的唯一情况是,如果你传入一个代表系统根本身的文件,在这种情况下,

null
被添加到路径字符串的其余部分之前。


9
投票

尝试:

File file  = new File("fileName.zip"); // handler to your ZIP file
File file2 = new File("fileName.fileExtension"); // destination dir of your file
boolean success = file.renameTo(file2);
if (success) {
    // File has been renamed
}

5
投票

我会在更改前检查文件是否有扩展名。下面的解决方案也适用于没有扩展名或多个扩展名的文件

public File changeExtension(File file, String extension) {
    String filename = file.getName();

    if (filename.contains(".")) {
        filename = filename.substring(0, filename.lastIndexOf('.'));
    }
    filename += "." + extension;

    file.renameTo(new File(file.getParentFile(), filename));
    return file;
}

@Test
public void test() {
    assertThat(changeExtension(new File("C:/a/aaa.bbb.ccc"), "txt"), 
                            is(new File("C:/a/aaa.bbb.txt")));

    assertThat(changeExtension(new File("C:/a/test"), "txt"), 
                            is(new File("C:/a/test.txt")));
}

2
投票

按照与 @hsz 相同的逻辑,而是简单地使用替换:

File file  = new File("fileName.fileExtension"); // creating object of File 
String str = file.getPath().replace(".fileExtension", ".zip"); // replacing extension to another 
file.renameTo(new File(str)); 

1
投票

我想避免新扩展恰好出现在路径或文件名本身中。我喜欢 java.nio 和 apache StringFilenameUtils 的组合。

public void changeExtension(Path file, String extension) throws IOException {
    String newFilename = FilenameUtils.removeExtension(file.toString()) + EXTENSION_SEPARATOR_STR + extension;
    Files.move(file, Paths.get(newFilename, StandardCopyOption.REPLACE_EXISTING));
}

1
投票

如果您使用的是 Kotlin,您可以使用

file
对象的这个属性:

file.nameWithoutExtension + "extension"

0
投票
FilenameUtils.getFullPathNoEndSeparator(doc.getDocLoc()) + "/" +
     FilenameUtils.getBaseName(doc.getDocLoc()) + ".xml"

0
投票

大约 4 个月前,我的朋友正在用 Java 开发一个拉链,我从他那里得到了这段代码。

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ZipFiles {

List<String> filesListInDir = new ArrayList<String>();

public static void main(String[] args) {
    File file = new File("/Users/pankaj/sitemap.xml");
    String zipFileName = "/Users/pankaj/sitemap.zip";
    
    File dir = new File("/Users/pankaj/tmp");
    String zipDirName = "/Users/pankaj/tmp.zip";
    
    zipSingleFile(file, zipFileName);
    
    ZipFiles zipFiles = new ZipFiles();
    zipFiles.zipDirectory(dir, zipDirName);
}

/**
 * This method zips the directory
 * @param dir
 * @param zipDirName
 */
private void zipDirectory(File dir, String zipDirName) {
    try {
        populateFilesList(dir);
        //now zip files one by one
        //create ZipOutputStream to write to the zip file
        FileOutputStream fos = new FileOutputStream(zipDirName);
        ZipOutputStream zos = new ZipOutputStream(fos);
        for(String filePath : filesListInDir){
            
   System.out.println("Zipping "+filePath);
            //for ZipEntry we need to keep only relative file path, so we used substring on absolute path
            ZipEntry ze = new ZipEntry(filePath.substring(dir.getAbsolutePath().length()+1, filePath.length()));
            zos.putNextEntry(ze);
            //read the file and write to ZipOutputStream
            FileInputStream fis = new FileInputStream(filePath);
            byte[] buffer = new byte[1024];
            int len;
            while ((len = fis.read(buffer)) > 0) {
                zos.write(buffer, 0, len);
            }
            zos.closeEntry();
            fis.close();
        }
        zos.close();
        fos.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
   }

/**
 * This method populates all the files in a directory to a List
 * @param dir
 * @throws IOException
 */
   private void populateFilesList(File dir) throws IOException {
    File[] files = dir.listFiles();
    for(File file : files){
        if(file.isFile()) 
     filesListInDir.add(file.getAbsolutePath());
        else 
 populateFilesList(file);
    }
}

/**
 * This method compresses the single file to zip format
 * @param file
 * @param zipFileName
 */
private static void zipSingleFile(File file, String zipFileName) {
    try {
        //create ZipOutputStream to write to the zip file
        FileOutputStream fos = new FileOutputStream(zipFileName);
        ZipOutputStream zos = new ZipOutputStream(fos);
        //add a new Zip Entry to the ZipOutputStream
        ZipEntry ze = new ZipEntry(file.getName());
        zos.putNextEntry(ze);
        //read the file and write to ZipOutputStream
        FileInputStream fis = new FileInputStream(file);
        byte[] buffer = new byte[1024];
        int len;
        while ((len = fis.read(buffer)) > 0) {
            zos.write(buffer, 0, len);
        }
        
        //Close the zip entry to write to zip file
        zos.closeEntry();
        //Close resources
        zos.close();
        fis.close();
        fos.close();
        
    System.out.println(file.getCanonicalPath()+" is zipped to "+zipFileName);
        
    } catch (IOException e) {
        e.printStackTrace();
    }

}

}

我没有亲自尝试过,但他和我的其他一些朋友告诉我它有效。

© www.soinside.com 2019 - 2024. All rights reserved.