2012-08-31 56 views
6

Estoy tratando de implementar el programa para comprimir y descomprimir un archivo. Todo lo que quiero hacer es comprimir un archivo (fileName.fileExtension) con el nombre fileName.zip y al descomprimir, volver a cambiarlo a fileName.fileExtension. ¿Alguien puede decirme una manera de hacer esto?Cómo cambiar la extensión de archivo en tiempo de ejecución

+0

comprobar Apache API para io, [FilenameUtils] (http://commons.apache.org/io/api-1.4/org/apache/commons/ io/FilenameUtils.html) –

+0

Comenzaría leyendo [File.renameTo] (http://docs.oracle.com/javase/7/docs/api/java/io/File.html#renameTo (java.io) .File)) – MadProgrammer

+0

@Nandkumar: Gracias, creo que será útil para mí. Pero el problema parece ser que puedo descomprimir el archivo en cualquier momento más tarde (puede estar en otra sesión). ¿Cómo preservar su extensión anterior? – rahul0789

Respuesta

4

intento con:

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 
} 
4

Ésta es la forma en que solía cambiar el nombre de archivos o cambiar su extensión.

public static void modify(File file) 
    { 
     int index = file.getName().indexOf("."); 
     //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)); 
    } 

edición: Método de John cambia el nombre del archivo (manteniendo la extensión). Para cambiar la extensión hacer:

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

Esto sólo cambios la última extensión a un nombre de archivo, es decir, la parte de .gzarchive.tar.gz. Por lo tanto, funciona bien con archivos ocultos de Linux, cuyo nombre comienza con . Esto es bastante seguro porque si getParent() devuelve null (es decir, en el caso de que el elemento primario sea la raíz del sistema) se "lanza" a una cadena vacía como todo el argumento para el constructor Archivo se evalúa primero.

El único caso en el que obtendrá una salida graciosa es si pasa un Archivo que representa la raíz del sistema en sí, en cuyo caso el null se antepone al resto de la cadena de ruta.

+0

Hola John. El mismo enfoque que estoy usando actualmente. Lo que quiero hacer es usar por separado la funcionalidad de cremallera y descomprimidor. En ese caso, no tendré la extensión del archivo. – rahul0789

+7

indexOf no funciona. Pruebe lastIndexOf() en su lugar. Eso es porque solo el texto después del último "." es la extensión y un archivo puede tener múltiples "." caracteres. Además, la búsqueda desde el final es, por lo general, más rápida para encontrar esa extensión – brunoais

+0

Haría dos cambios: a) nombre newExtension como newExtensionWithDot b) return new File (f.getParent(), name + newExtension); // "/" solo es compatible con Unix, por lo que el código se puede usar en cualquier lugar. – BitLauncher

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

Me gustaría comprobar, si el archivo tiene una extensión antes de cambiar. La solución a continuación funciona también con los archivos sin extensión o múltiples extensiones

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"))); 
} 
Cuestiones relacionadas