txt texto sobreescribir rutas modificar manejo guardar ejemplos datos crear como clase archivos archivo java java-7 java.nio.file

texto - modificar archivos txt en java



¿Puede haber un Sistema de Archivos(Java 7) para el cual una Ruta.isAbsoluta() pero tiene una raíz nula? (3)

El javadoc para .isAbsolute() dice:

Indica si este camino es absoluto.
Se completa una ruta absoluta, ya que no necesita combinarse con otra información de ruta para localizar un archivo.

Devuelve: true si, y solo si, esta ruta es absoluta

El javadoc para .getRoot() dice:

Devuelve el componente raíz de esta ruta como un objeto Ruta, o nulo si esta ruta no tiene un componente raíz.

Devuelve: una ruta que representa el componente raíz de esta ruta, o null

OK, entonces, estoy perdido aquí; ¿Hay algún sistema de archivos para el cual una ruta puede ser absoluta sin una raíz?

EDITAR: tenga en cuenta que PUEDE haber rutas que tienen una raíz pero NO son absolutas. Por ejemplo, estos en sistemas Windows:

  • C:foo ;
  • /foo/bar .

Pero estoy pidiendo el reverso aquí: sin raíz y absoluto.


La definición

La interfaz establece lo siguiente sobre las raíces:

Un componente raíz, que identifica una jerarquía del sistema de archivos, también puede estar presente.

Como puede ver, el comentario parece implicar que las raíces se usan para las jerarquías del sistema de archivos . Ahora tenemos que razonar sobre qué es un camino absoluto. La interfaz nos dice lo siguiente:

Se completa una ruta absoluta, ya que no necesita combinarse con otra información de ruta para localizar un archivo.

Entonces, como ve, no hay una palabra acerca de las raíces en la definición de caminos absolutos . La única restricción es que tenemos que ser capaces de localizar el archivo sin más información.

Sistemas de archivos jerárquicos

La mayoría de los sistemas de archivos son jerárquicos, es decir, son árboles (o gráficos si consideramos enlaces) o bosques. La raíz en un árbol es un nodo que no es hijo de otro nodo (sin incluir enlaces). Los sistemas de archivos de Windows son, por ejemplo, bosques, ya que tienen muchas raíces ( C: D: ...). Linux generalmente tiene solo una raíz que es / . Las raíces son muy importantes ya que sin ellas sería difícil comenzar a localizar un archivo. En dichos sistemas de archivos, generalmente puede confiar en que cada ruta absoluta tenga una raíz.

Sistemas de archivos no jerárquicos

Mientras tengamos un sistema de archivos jerárquico, podemos anticipar una raíz en una ruta absoluta, pero ¿qué pasa si no tenemos una? Entonces, una ruta absoluta puede no contener una raíz.

Un ejemplo que me viene a la mente: sistemas de archivos distribuidos como Chord . Estos a menudo no son jerárquicos, por lo que el significado de las raíces generalmente no está definido. En cambio, un hash de archivo identifica un archivo (SHA-1 en Chord). Entonces una ruta de Chord válida podría verse así:

cf23df2207d99a74fbe169e3eba035e633b65d94

Este es un camino absoluto. Uno puede recuperar el archivo asociado sin más información, por lo que la ruta es absoluta. Sin embargo, no veo la raíz. Podríamos definir el hash entero como su propia raíz (entonces cada archivo sería su propia raíz), pero nadie puede garantizar que cada persona que implemente un sistema de archivos Chord lo acepte. Entonces, puede haber implementaciones razonables que no traten estos hashes como raíces. En dicho sistema de archivos, cada ruta sería absoluta, pero ninguna contendría una raíz.

Si implementara un sistema de archivos no jerárquico, siempre devolvería null como raíz, ya que en mi humilde opinión una raíz no es un concepto definido en un sistema de archivos no jerárquico. Dado que pienso así, otros desarrolladores también podrían pensarlo. En consecuencia, no puede suponer que cada ruta absoluta tiene una raíz.

Tenga en cuenta que los sistemas de archivos distribuidos son bastante comunes en muchas áreas, por lo que este no es simplemente un caso de esquina que nunca se implementará. Creo que debes anticiparlo.

Conclusión

  1. La interfaz no exige que cada ruta absoluta debe tener una raíz
  2. Hay sistemas de archivos razonables en los que no tiene sentido tener una raíz
  3. Un tutorial de Oracle como se menciona en los comentarios no es un contrato para la interfaz. No deberías confiar en esto

Entonces habrá personas implementando sistemas de archivos sin raíces; deberías anticipar esto.


Una cuestión de semántica

Desde mi comprensión del tema, una ruta absoluta solo puede ser absoluta si se puede rastrear hasta su raíz. Como tal, nunca debería haber una ruta absoluta sin una raíz. En última instancia, esto solo se reduce a la semántica y, aunque podemos encontrar definiciones que definen la ruta absoluta tal (egs a continuación);

La única pregunta real que queda después de este punto es si la definición de la API de Java sigue el mismo camino. El único lugar donde puedo encontrar referencias a la definición de una ruta absoluta (con referencia al elemento raíz) desde una fuente oficial de Oracle es desde dentro del tutorial oficial de Java. docs.oracle.com/javase/tutorial/essential/io/path.html#relative

Una ruta absoluta siempre contiene el elemento raíz

Si se quiere creer en esta afirmación, entonces ningún sistema de archivos (por oscuro que sea) puede contener una ruta que la API de Java considerará absoluta, a menos que también considere que contiene una raíz .

Podría argumentar que, en algunos sistemas de archivos no jerárquicos, podría tener algunos problemas para decidir si un archivo puede ser su propia raíz. Sin embargo, según esta definición en Path API (énfasis mío), una ruta no debería representar un elemento no jerárquico;

Una ruta representa una ruta que es jerárquica y está compuesta de una secuencia de elementos de directorio y nombre de archivo


Bueno, hay algunas cosas oscuras con los sistemas de archivos. Hice algunos rastreadores de búsqueda de empresas, y en algún momento a lo largo de la carretera notará algunas cosas extrañas en el sistema de archivos con rutas. Por cierto: todas estas son implementaciones de sistemas de archivos personalizados (anulados), por lo que no hay estándares, y definitivamente puedes discutir durante horas sobre cuáles de esas cosas son buenas ideas y cuáles no ... Sin embargo, no creo que estés '' Encontraré alguno de estos casos con los sistemas de archivos estándar.

Aquí hay algunos ejemplos de cosas extrañas:

Archivos en sistemas de archivos contenedores (OLE2, ZIP, TAR, etc.): c: / foo / bar / blah.zip / myfile

En este caso, puede decidir qué elemento es ''la raíz'':

  • ''c: /'? Esa no es la raíz del archivo zip que contiene el archivo ...
  • ''c: / foo / bar / blah.zip''? Podría ser la raíz del archivo, pero al hacerlo podría romper tu aplicación.
  • ''blah.zip''? Puede ser la raíz del archivo zip, pero independientemente de esto, probablemente también rompa tu aplicación.
  • ''/''? Como en la carpeta ''/'' en el archivo zip? Podría ser posible, pero eso le dará un gran dolor de cabeza a largo plazo.

''gráfico'' como estructuras como HTTP:

  • El hecho de que tenga ''/ foo / bar'' no implica que ''/ foo'' o incluso ''/'' exista. (Supongamos que cumple con su criterio). Lo único que puedes hacer es caminar el gráfico ...
  • Tenga en cuenta que los protocolos como WebDav se basan en HTTP y pueden darle un dolor de cabeza similar. Aquí tengo algunos ejemplos de sistemas de archivos webdav personalizados que no tienen una carpeta ''raíz'', pero sí tienen rutas absolutas.

Aún así, puede argumentar que la ruta común más alta (si es que existe ...) que puede alcanzar es la raíz o que hay una raíz, pero simplemente no puede alcanzarla (aunque realmente no existe).

Samba / netbios

Si ve una red completa de Samba (redes de Windows) como un solo sistema de archivos, básicamente termina con una ''raíz'' que contiene todos los grupos de trabajo, un grupo de trabajo que contiene todas las computadoras, una computadora que contiene todos los recursos compartidos y luego los archivos en el recurso .

Sin embargo ... la raíz y los grupos de trabajo no existen realmente. Son cosas que se componen de un protocolo de transmisión (que tampoco es confiable si tienes una red de más de 1000 computadoras). Desde la perspectiva del rastreador, tiene sentido en el mundo tratar los directorios ''raíz'' y ''grupo de trabajo'' completamente diferentes del resto (confiable).

sin embargo

Estos escenarios describen solo las rutas en las que la raíz es inalcanzable, no confiable o alguna otra cosa. Teóricamente, supongo que en cualquier URL que se te ocurra, siempre hay una raíz. Después de todo, está formado por una cadena de caracteres que definen una jerarquía, que por lo tanto tiene un inicio.