Qual é a maneira mais fácil de ter uma implementação de arquivo de costume que só utiliza a memória em Java

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

  •  03-07-2019
  •  | 
  •  

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?

Foi útil?

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 ?????
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top