Como converter FileInputStream em InputStream? [fechadas]

116

Eu só quero converter a FileInputStreamem InputStream, como posso fazer isso?

por exemplo

FileInputStream fis = new FileInputStream("c://filename");
InputStream is = ?; 
fis.close();
Ranjan
fonte
3
Ranjan. Você pode, por favor, alterar a resposta correta para esta postagem. A resposta atual é abaixo da média. Se você alterar para o abaixo, será o ideal.
Whitecat
Era apenas uma pergunta boba .. Eu não estava tendo uma ideia adequada sobre serialização ... qualquer um pode se referir a @sudocode
ranjan
4
pode ser uma pergunta boba, mas muitas pessoas ainda se referem a essa pergunta porque é útil.
Whitecat
1
@WilliMentzel Eu vim aqui em busca de uma conversão real da Fileaula para InputStream. Sua edição sugere que é isso que o autor está pedindo (pelo menos em parte), e não está certo.
Linha
@Line Eu apenas mudei a formatação, não acho que mudei o significado. Se você ainda objetar, sinta-se à vontade para reverter minhas alterações. Isso será revisado pela comunidade então. A propósito: como você sabe o que o autor quis dizer, exceto qual é a pergunta agora?
Willi Mentzel

Respostas:

7

Normalmente, você primeiro leria o fluxo de entrada e, em seguida, o fecharia. Você pode envolver o FileInputStream em outro InputStream (ou Leitor). Ele será fechado automaticamente quando você fechar o fluxo / leitor de empacotamento.

Se este for um método que retorna um InputStream para o chamador, é responsabilidade do chamador fechar o fluxo quando terminar com ele. Se você fechá-lo em seu método, o chamador não poderá usá-lo.

Para responder a alguns de seus comentários ...

Para enviar o conteúdo de InputStream a um consumidor remoto, você deve gravar o conteúdo de InputStream em um OutputStream e, em seguida, fechar os dois fluxos.

O consumidor remoto não sabe nada sobre os objetos de fluxo que você criou. Ele apenas recebe o conteúdo, em um InputStream que ele irá criar, ler e fechar.

sudocódigo
fonte
e se eu quiser enviar um fluxo de entrada pelo correio. .. é possível fechar do outro lado .. ou não é necessário fechar
ranjan
2
O próprio objeto de fluxo não é serializável. O conteúdo do stream pode ser serializado - gravando o conteúdo em um OutputStream
sudocode
Na verdade meu objetivo é enviar um arquivo .. Não quero nada rodando depois de enviar .. por exemplo, como se estivesse enviando uma string .. para que o outro lado não precise se preocupar em fechar nada.
ranjan
1
O arquivo também não é serializável. Mas o conteúdo de um arquivo pode ser serializado usando um OutputStream.
sudocode de
é possível que eu espere por algum tempo específico e então feche o fluxo de entrada, por exemplo, dependendo do tamanho do arquivo
ranjan
136
InputStream is;

try {
    is = new FileInputStream("c://filename");

    is.close(); 
} catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

return is;
Kumar Vivek Mitra
fonte
12
Por que "is.close ()" é chamado antes de "is" ser retornado no final.
Talespin_Kit
57
InputStream is = new FileInputStream("c://filename");
return is;
Sumit Singh
fonte
2
Essa é a resposta!
andreikashin
36

FileInputStream é um inputStream.

FileInputStream fis = new FileInputStream("c://filename");
InputStream is = fis;
fis.close();  
return is;

Claro, isso não fará o que você deseja ; o stream que você devolve já foi fechado. Basta retornar o FileInputStream e pronto. O código de chamada deve fechá-lo.

Joeri Hendrickx
fonte
ou apenas retornar, fisembora eu não tenha certeza sobre como retornar um riacho fechado.
Bala R de
6
Isso é estúpido - se você fechar fis- você também fechais
RonK
1
se eu fechar o arquivo, os dados não
serão
2
@RonK de fato. É por isso que mencionei isso.
Joeri Hendrickx
3
Apenas um código mais breve return FileInputStream("c://filename");no método cujo tipo de retorno éInputStream
Yatendra Goel
2

Se você envolver um fluxo em outro, você não fecha os fluxos intermediários, e muito importante: você não os fecha antes de terminar de usar os fluxos externos. Porque você também fecharia o fluxo externo.

Usuário desconhecido
fonte