sobreescribir - modificar archivos txt en java
¿Cómo combinar rutas en Java? (8)
Aquí hay una solución que maneja múltiples partes de camino y condiciones de borde:
public static String combinePaths(String ... paths)
{
if ( paths.length == 0)
{
return "";
}
File combined = new File(paths[0]);
int i = 1;
while ( i < paths.length)
{
combined = new File(combined, paths[i]);
++i;
}
return combined.getPath();
}
¿Hay un equivalente de Java para System.IO.Path.Combine()
en C # / .NET? ¿O algún código para lograr esto?
Este método estático combina una o más cadenas en una ruta.
En Java 7, debes usar resolve
:
Path newPath = path.resolve(childPath);
Si bien la clase NIO2 Path puede parecer un poco redundante para File con una API innecesariamente diferente, de hecho es sutilmente más elegante y robusta.
Tenga en cuenta que Paths.get()
(como lo sugiere otra persona) no tiene una sobrecarga al tomar una Path
, y hacer Paths.get(path.toString(), childPath)
NO es lo mismo que resolve()
. resolve()
es más inteligente. De los documentos de Paths.get()
:
Tenga en cuenta que si bien este método es muy conveniente, su uso implicará una referencia supuesta al sistema de archivos predeterminado y limitará la utilidad del código de llamada. Por lo tanto, no debe utilizarse en el código de la biblioteca destinado a una reutilización flexible. Una alternativa más flexible es usar una instancia de ruta existente como un ancla, como:
Path dir = ... Path path = dir.resolve("file");
La función hermana a resolve
es la excelente relativize
:
Path childPath = path.relativize(newPath);
En lugar de mantener todo basado en cadenas, debe usar una clase diseñada para representar una ruta del sistema de archivos.
Si está utilizando Java 7 o Java 8, debería considerar el uso de java.nio.file.Path
; Path.resolve
se puede utilizar para combinar una ruta con otra, o con una cadena. La clase de ayudante de Paths
es útil. Por ejemplo:
Path path = Paths.get("foo", "bar", "baz.txt");
Si necesita atender entornos pre-Java-7, puede usar java.io.File
, como este:
File baseDirectory = new File("foo");
File subDirectory = new File(baseDirectory, "bar");
File fileInDirectory = new File(subDirectory, "baz.txt");
Si desea recuperarlo como una cadena más adelante, puede llamar a getPath()
. De hecho, si realmente quisieras imitar Path.Combine
, podrías escribir algo como:
public static String combine(String path1, String path2)
{
File file1 = new File(path1);
File file2 = new File(file1, path2);
return file2.getPath();
}
La respuesta principal es usar objetos de archivo. Sin embargo, Commons IO tiene una clase FilenameUtils que puede hacer este tipo de cosas, como el método concat() .
Para mejorar la respuesta de JodaStephen, Apache Commons IO tiene FilenameUtils que hace esto. Ejemplo (en Linux):
assert org.apache.commons.io.FilenameUtils.concat("/home/bob", "work//stuff.log") == "/home/bob/work/stuff.log"
Es independiente de la plataforma y producirá cualquier separador que su sistema necesite.
Sé que ha pasado mucho tiempo desde la respuesta original de Jon, pero tenía un requisito similar al OP.
A modo de extender la solución de Jon, se me ocurrió lo siguiente, que tomará uno o más segmentos de ruta toma tantos segmentos de ruta que puede lanzar.
Uso
Path.combine("/Users/beardtwizzle/");
Path.combine("/", "Users", "beardtwizzle");
Path.combine(new String[] { "/", "Users", "beardtwizzle", "arrayUsage" });
Codifique aquí para otros con un problema similar
public class Path {
public static String combine(String... paths)
{
File file = new File(paths[0]);
for (int i = 1; i < paths.length ; i++) {
file = new File(file, paths[i]);
}
return file.getPath();
}
}
Si no necesita más que cadenas, puede usar com.google.common.io.Files
Files.simplifyPath("some/prefix/with//extra///slashes" + "file//name")
Llegar
"some/prefix/with/extra/slashes/file/name"
enfoque independiente de la plataforma (utiliza File.separator, es decir, will funciona según el sistema operativo donde se ejecuta el código:
java.nio.file.Paths.get(".", "path", "to", "file.txt")
// relative unix path: ./path/to/file.txt
// relative windows path: ./path/to/filee.txt
java.nio.file.Paths.get("/", "path", "to", "file.txt")
// absolute unix path: /path/to/filee.txt
// windows network drive path: //path/to/file.txt
java.nio.file.Paths.get("C:", "path", "to", "file.txt")
// absolute windows path: C:/path/to/file.txt