¿Cuál es la forma más fácil de tener una implementación de archivo personalizada que solo usa memoria en Java?

StackOverflow https://stackoverflow.com/questions/804814

  •  03-07-2019
  •  | 
  •  

Pregunta

Tengo una base de código que hace un uso extensivo de archivos para representar un solo objeto de datos. He refactorizado el código para que el objeto de datos ahora sea un objeto java explícito que oculta principalmente la interacción con el sistema de archivos subyacente. Sin embargo, utilizamos algunas herramientas externas (como Weka), que leen y escriben archivos.

Idealmente, me gustaría tener una subclase de Archivo que pueda pasar a estas otras bibliotecas que esté respaldada por una matriz de bytes en la memoria, ya sea para leer o escribir.

Mis búsquedas en Google revelaron archivos asignados en memoria, pero este no es el problema que tengo, ya que no quiero ningún archivo real en el sistema de archivos. ¿Hay alguna solución ya disponible, o debo subclasificar yo mismo y anular todos los métodos que se refieren al sistema de archivos real?

¿Fue útil?

Solución

Esto es por lo general por lo que nunca debes escribir métodos para tomar un archivo a menos que sea realmente necesario. ¿Sus bibliotecas no proporcionan métodos que toman un InputStream arbitrario? En este caso, es trivial pasar un ByteArrayInputStream o cualquier flujo de entrada que se lee de la memoria.

El problema con la anulación de archivos es que es poco probable que puedas anularlo de una manera que te ayude. Por ejemplo, si la biblioteca la abre con un FileInputStream, entonces la forma en que los bytes provienen en ese punto está realmente controlada por la implementación de FileInputStream, no por su archivo.

Otros consejos

java.io.File es esencialmente una envoltura alrededor de una String que representa una ruta de archivo (debería haber sido una clase de final , pero hay que ir). Así que estás fuera de suerte con ese enfoque. Por supuesto, puede crear archivos temporales y archivos en " discos RAM " ;.

debería buscar la implementación en memoria de OutputStreams / InputStreams como ByteArrayOutputStream con su método toByteArray () o ByteArrayInputStream con el constructor de bytes []. Si sus datos se representan más complejos, puede implementar la interfaz directamente.

Debe averiguar qué métodos de archivo está utilizando su tercero y proporcionar la implementación personalizada para ellos.

Es casi seguro que no podrá tener éxito porque el objeto java.io.File no se encarga de la lectura / escritura del contenido del archivo.

El mejor enfoque sería refactorizar el código para que no dependa del objeto Archivo, sino en la matriz de bytes devuelta por ese archivo.

Es posible crear una subclase de archivo.

public class InMemoryFile extends File { 
    public InMemody() { 
         super( "/dev/null" );
    }
    // find out what methods should be overwritten ?????
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top