Qual é a maneira mais fácil de ter uma implementação de arquivo de costume que só utiliza a memória em Java
Pergunta
Eu tenho uma base de código que faz uso extensivo de arquivos para representar um único objeto de dados. Tenho refatorado o código para que o objeto de dados é agora um objeto java explícito que a maioria esconde a interação com o sistema de arquivos subjacente. No entanto, usamos algumas ferramentas externas (como Weka), que lêem e arquivos de gravação.
Idealmente, eu gostaria de ter uma subclasse de arquivo que eu possa passar para essas outras bibliotecas que é apoiado por uma série de memória in- de bytes - seja para leitura ou escrita.
As minhas pesquisas do Google apareceu arquivos mapeados na memória, mas isso não é o problema que tenho como eu não quero qualquer arquivo real no sistema de arquivos. Há alguma solução já está lá fora, ou devo apenas subclasse Arquivo mim e sobrepor-se todos os métodos que se referem ao sistema de arquivos real?
Solução
Este é geralmente porque você nunca deve escrever métodos para tomar um arquivo a menos que seja realmente necessário. Seus bibliotecas não fornecer métodos que levam um InputStream arbitrária? Neste caso, é trivial para passar um ByteArrayInputStream ou qualquer fluxo de entrada que lê a partir da memória.
O problema com substituindo arquivo é que é improvável que você pode substituí-lo de uma forma que irá ajudá-lo. Por exemplo, se a biblioteca abre-lo com um FileInputStream, em seguida, onde os bytes vem nesse momento é realmente controlado pela implementação FileInputStream, não pelo seu arquivo.
Outras dicas
java.io.File
é essencialmente um invólucro em torno de um String
que representam um caminho de arquivo (que deveria ter sido uma classe final
, mas lá vai). Então você está fora de sorte com essa abordagem. Você pode, é claro, criar arquivos temporários e arquivos em "discos RAM".
você deveria olhar para implementação em memória de OutputStreams / InputStreams como ByteArrayOutputStream com seu método ToByteArray () ou o ByteArrayInputStream com o construtor byte []. se os seus dados é representado mais complexo, você pode implementar a interface diretamente.
Você tem que descobrir o que os métodos de arquivo estão sendo usados ??por seu 3o partido e fornecer a implementação personalizada para eles.
É quase certo que você não será capaz de ter sucesso porque o objeto java.io.File não é responsável pela leitura / escrita do conteúdo do arquivo.
A melhor abordagem seria refatorar o código para que ele não dependem do objeto File, mas na matriz de bytes retornado por esse arquivo.
A criação de uma subclasse de arquivo é possível.
public class InMemoryFile extends File {
public InMemody() {
super( "/dev/null" );
}
// find out what methods should be overwritten ?????
}