sobreescribir - modificar archivos txt en java
Cree un directorio si no existe y luego cree los archivos en ese directorio tambiƩn (5)
Este código comprueba primero la existencia del directorio y lo crea si no, y luego crea el archivo.
Tenga en cuenta que no pude verificar algunas de sus llamadas a métodos ya que no tengo su código completo, por lo que supongo que las llamadas a cosas como
getTimeStamp()
y
getClassName()
funcionarán.
También debe hacer algo con la posible
IOException
que se puede generar al usar cualquiera de las clases
java.io.*
: su función que escribe los archivos debe generar esta excepción (y se debe manejar en otro lugar), o debe hacerlo en El método directamente.
Además, supuse que
id
es de tipo
String
; no sé, ya que su código no lo define explícitamente.
Si es algo más como un
int
, probablemente debería convertirlo en una
String
antes de usarlo en el nombre de archivo como lo he hecho aquí.
Además, reemplacé sus llamadas
concat
con
concat
o
+
como lo vi apropiado.
public void writeFile(String value){
String PATH = "/remote/dir/server/";
String directoryName = PATH.concat(this.getClassName());
String fileName = id + getTimeStamp() + ".txt";
File directory = new File(directoryName);
if (! directory.exists()){
directory.mkdir();
// If you require it to make the entire directory path including parents,
// use directory.mkdirs(); here instead.
}
File file = new File(directoryName + "/" + fileName);
try{
FileWriter fw = new FileWriter(file.getAbsoluteFile());
BufferedWriter bw = new BufferedWriter(fw);
bw.write(value);
bw.close();
}
catch (IOException e){
e.printStackTrace();
System.exit(-1);
}
}
Probablemente no debería usar nombres de ruta desnuda como este si desea ejecutar el código en Microsoft Windows; no estoy seguro de qué hará con
/
en los nombres de archivo.
Para una portabilidad total, probablemente debería usar algo como
File.separator
para construir sus rutas.
Editar
: según un comentario de
JosefScript
continuación, no es necesario probar la existencia del directorio.
La llamada a
directory.mkdir()
devolverá
true
si creó un directorio, y
false
si no lo hizo, incluido el caso cuando el directorio ya existía.
La condición es que si el directorio existe, tiene que crear archivos en ese directorio específico sin crear un nuevo directorio.
El siguiente código solo crea un archivo con un nuevo directorio pero no para el directorio existente. Por ejemplo, el nombre del directorio sería como "GETDIRECTION"
String PATH = "/remote/dir/server/";
String fileName = PATH.append(id).concat(getTimeStamp()).append(".txt");
String directoryName = PATH.append(this.getClassName());
File file = new File(String.valueOf(fileName));
File directory = new File(String.valueOf(directoryName));
if(!directory.exists()){
directory.mkdir();
if(!file.exists() && !checkEnoughDiskSpace()){
file.getParentFile().mkdir();
file.createNewFile();
}
}
FileWriter fw = new FileWriter(file.getAbsoluteFile());
BufferedWriter bw = new BufferedWriter(fw);
bw.write(value);
bw.close();
Sugeriría lo siguiente para Java8 +.
/** Creates parent directories if necessary. Then returns file */
private static File fileWithDirectoryAssurance(String directory, String filename) {
File dir = new File(directory);
if (!dir.exists()) dir.mkdirs();
return new File(directory + "/" + filename);
}
Tratando de hacer esto lo más corto y simple posible. Crea un directorio si no existe y luego devuelve el archivo deseado:
/**
* Creates a File if the file does not exist, or returns a
* reference to the File if it already exists.
*/
private File createOrRetrieve(final String target) throws IOException{
final Path path = Paths.get(target);
if(Files.notExists(path)){
LOG.info("Target file /"" + target + "/" will be created.");
return Files.createFile(Files.createDirectories(path)).toFile();
}
LOG.info("Target file /"" + target + "/" will be retrieved.");
return path.toFile();
}
/**
* Deletes the target if it exists then creates a new empty file.
*/
private File createOrReplaceFileAndDirectories(final String target) throws IOException{
final Path path = Paths.get(target);
// Create only if it does not exist already
Files.walk(path)
.filter(p -> Files.exists(p))
.sorted(Comparator.reverseOrder())
.peek(p -> LOG.info("Deleted existing file or directory /"" + p + "/"."))
.forEach(p -> {
try{
Files.createFile(Files.createDirectories(p));
}
catch(IOException e){
throw new IllegalStateException(e);
}
});
LOG.info("Target file /"" + target + "/" will be created.");
return Files.createFile(
Files.createDirectories(path)
).toFile();
}
Usar
java.nio.Path
sería bastante simple:
public static Path createFileWithDir(String directory, String filename) {
File dir = new File(directory);
if (!dir.exists()) dir.mkdirs();
return Paths.get(directory + File.separatorChar + filename);
}
código:
// Create Directory if not exist then Copy a file.
public static void copyFile_Directory(String origin, String destDir, String destination) throws IOException {
Path FROM = Paths.get(origin);
Path TO = Paths.get(destination);
File directory = new File(String.valueOf(destDir));
if (!directory.exists()) {
directory.mkdir();
}
//overwrite the destination file if it exists, and copy
// the file attributes, including the rwx permissions
CopyOption[] options = new CopyOption[]{
StandardCopyOption.REPLACE_EXISTING,
StandardCopyOption.COPY_ATTRIBUTES
};
Files.copy(FROM, TO, options);
}