Comment convertir FileInputStream en InputStream? [fermé]

116

Je veux juste convertir un FileInputStreamen un InputStream, comment puis-je faire cela?

par exemple

FileInputStream fis = new FileInputStream("c://filename");
InputStream is = ?; 
fis.close();
Ranjan
la source
3
ranjan. Pouvez-vous s'il vous plaît changer la bonne réponse à ce message. La réponse actuelle est inférieure à la moyenne. Si vous le remplacez par celui ci-dessous, ce serait optimal.
Whitecat
C'était juste une question idiote ... Je n'avais pas une idée précise de la sérialisation ... n'importe qui peut se référer à @sudocode
ranjan
4
c'est peut-être une question idiote, mais beaucoup de gens se réfèrent encore à cette question parce qu'elle est utile.
Whitecat
1
@WilliMentzel Je suis venu ici à la recherche d'une conversion réelle de la Fileclasse en InputStream. Votre modification suggère que c'est ce que l'auteur demande (au moins en partie), et ce n'est pas juste.
Ligne
@Line J'ai simplement changé le formatage, je ne pense pas avoir changé le sens. Si vous vous opposez toujours, n'hésitez pas à annuler mes modifications. Cela sera ensuite examiné par la communauté. Au fait: comment savez-vous ce que l'auteur voulait dire, à l'exception de la question actuelle?
Willi Mentzel

Réponses:

7

En général, vous lisez d'abord le flux d'entrée, puis fermez-le. Vous pouvez envelopper le FileInputStream dans un autre InputStream (ou Reader). Il sera automatiquement fermé lorsque vous fermerez le flux / lecteur de wrapping.

S'il s'agit d'une méthode renvoyant un InputStream à l'appelant, il est de la responsabilité de l'appelant de fermer le flux une fois terminé. Si vous le fermez dans votre méthode, l'appelant ne pourra pas l'utiliser.

Pour répondre à certains de vos commentaires ...

Pour envoyer le contenu InputStream à un consommateur distant, vous devez écrire le contenu de InputStream dans un OutputStream, puis fermer les deux flux.

Le consommateur distant ne sait rien des objets de flux que vous avez créés. Il reçoit juste le contenu, dans un InputStream qu'il va créer, lire et fermer.

sudocode
la source
que faire si je veux envoyer un flux d'entrée par courrier. .. est-il possible de fermer de l'autre côté .. ou il n'est pas nécessaire de fermer
ranjan
2
L'objet de flux lui-même n'est pas sérialisable. Le contenu du flux peut être sérialisé - en écrivant du contenu dans un OutputStream
sudocode
En fait, mon objectif est d'envoyer un fichier .. Je ne veux pas que quoi que ce soit en cours d'exécution une fois que j'envoie .. par exemple comme si j'envoyais une chaîne .. pour que l'autre côté n'ait pas à se soucier de fermer quoi que ce soit.
ranjan
1
Le fichier n'est pas sérialisable non plus. Mais le contenu d'un fichier peut être sérialisé à l'aide d'un OutputStream.
sudocode
est-il possible que j'attende pendant un certain temps puis ferme le flux d'entrée, par exemple en fonction de la taille du fichier
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
la source
12
Pourquoi le "is.close ()" est-il appelé avant que le "is" ne soit renvoyé à la fin.
Talespin_Kit
57
InputStream is = new FileInputStream("c://filename");
return is;
Sumit Singh
la source
2
Voilà la réponse!
andreikashin
36

FileInputStream est un inputStream.

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

Bien sûr, cela ne fera pas ce que vous voulez qu'il fasse ; le flux que vous renvoyez a déjà été fermé. Renvoyez simplement le FileInputStream et en avez terminé. Le code appelant doit le fermer.

Joeri Hendrickx
la source
ou simplement revenir fisbien que je ne sois pas sûr de retourner un flux fermé.
Bala R
6
C'est stupide - si vous fermez fis- vous fermez aussiis
RonK
1
si je ferme le fichier, les données ne sont pas envoyées
ranjan
2
@RonK en effet. C'est pourquoi je le mentionne.
Joeri Hendrickx
3
Juste un code plus bref return FileInputStream("c://filename");dans la méthode dont le type de retour estInputStream
Yatendra Goel
2

Si vous encapsulez un flux dans un autre, vous ne fermez pas les flux intermédiaires, et très important: vous ne les fermez pas avant d'avoir fini d'utiliser les flux externes. Parce que vous fermeriez aussi le flux extérieur.

Utilisateur inconnu
la source