Qual è il modo più semplice per avere un'implementazione di file personalizzata che utilizza solo memoria in Java

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

  •  03-07-2019
  •  | 
  •  

Domanda

Ho una base di codice che fa ampio uso di file per rappresentare un singolo oggetto dati. Ho rifattorizzato il codice in modo che l'oggetto dati sia ora un oggetto java esplicito che nasconde principalmente l'interazione con il file system sottostante. Tuttavia, utilizziamo alcuni strumenti esterni (come Weka), che leggono e scrivono file.

Idealmente, vorrei avere una sottoclasse di File che posso passare a queste altre librerie che è supportata da una matrice in memoria di byte - per la lettura o la scrittura.

Le mie ricerche su Google hanno rivelato file mappati in memoria, ma questo non è il problema che ho dato che non voglio alcun file reale sul file system. Ci sono già soluzioni là fuori, o dovrei semplicemente sottoclassare File me stesso e scavalcare tutti i metodi che fanno riferimento al vero file system?

È stato utile?

Soluzione

Questo è generalmente il motivo per cui non dovresti mai scrivere metodi per prendere un file a meno che non sia veramente necessario. Le tue librerie non forniscono metodi che accettano un InputStream arbitrario? In questo caso, è banale passare un ByteArrayInputStream o qualsiasi flusso di input che legge dalla memoria.

Il problema con l'override di File è improbabile che tu possa sovrascriverlo in modo da aiutarti. Ad esempio, se la libreria lo apre con un FileInputStream, allora la provenienza dei byte a quel punto è realmente controllata dall'implementazione di FileInputStream, non dal tuo File.

Altri suggerimenti

java.io.File è essenzialmente un wrapper attorno a String che rappresentano un percorso di file (avrebbe dovuto essere una classe final , ma eccoti qua). Quindi sei sfortunato con questo approccio. Ovviamente puoi creare file e file temporanei su " dischi RAM " ;.

dovresti cercare l'implementazione in memoria degli OutputStreams / InputStreams come ByteArrayOutputStream con il suo metodo toByteArray () o ByteArrayInputStream con il costruttore byte []. se i tuoi dati sono rappresentati in modo più complesso, puoi implementare direttamente l'interfaccia.

Devi scoprire quali metodi di file vengono utilizzati dalla tua terza parte e fornire loro l'implementazione personalizzata.

È quasi sicuro che non riuscirai perché l'oggetto java.io.File non è responsabile della lettura / scrittura del contenuto del file.

L'approccio migliore sarebbe il refactoring del codice in modo che non dipenda dall'oggetto File ma nella matrice di byte restituita da quel file.

È possibile creare una sottoclasse di file.

public class InMemoryFile extends File { 
    public InMemody() { 
         super( "/dev/null" );
    }
    // find out what methods should be overwritten ?????
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top