Je suis au courant de la méthode getResourceAsStream()
mais il y a un problème avec l'analyseur qui lit le fichier, toute la structure a été implémentée pour attendre un FileInputStream()
et le getResourceAsStream()
renvoie un flux d'entrée qui ne peut pas être casté. Y a-t-il une solution facile pour cette situation?Comment puis-je accéder à un fichier txt dans un fichier avec FileInputStream?
Répondre
Une ressource contenue dans un fichier JAR n'est pas elle-même un fichier et ne peut pas être lue à l'aide d'un FileInputStream
. Si vous avez un code qui nécessite absolument un FileInputStream
, vous devrez extraire les données en utilisant getResourceAsStream()
, le copier dans un fichier temporaire, puis passer un FileInputStream
pour ce fichier temporaire à votre code.
Bien sûr, à l'avenir, n'écrivez jamais de code pour attendre des implémentations concrètes de choses comme InputStream
, vous le regretterez toujours.
ne croient pas votre analyse syntaxique ne fonctionne que sur FileInputStream mais pas INPUTSTREAM
si tel est le cas réel, et vous devez utiliser cet analyseur
2 options
utilisation de motif adaptateur pour créer un CustomFileInputStream et écraser les méthodes respectives, plus de rediriger les données getResourceAsStream vers le CustomFileInputStream
sauver ur getResourceAsStream dans un fichier temporaire, et analyser le fichier temporaire, puis supprimez le fichier lorsque vous avez terminé
J'ai récemment rencontré le même problème. Une bibliothèque tierce que nous utilisons lit FileInputStream mais les ressources peuvent être n'importe où, dans un fichier JAR ou distant. Nous avions l'habitude d'écrire dans des fichiers temporaires mais cela a trop de frais généraux.
Une meilleure solution est d'écrire un FileInputStream qui enveloppe InputStream. Voici la classe que nous utilisons,
public class VirtualFileInputStream extends FileInputStream {
private InputStream stream;
public VirtualFileInputStream(InputStream stream) {
super(FileDescriptor.in); // This will never be used
this.stream = stream;
}
public int available() throws IOException {
throw new IllegalStateException("Unimplemented method called");
}
public void close() throws IOException {
stream.close();
}
public boolean equals(Object obj) {
return stream.equals(obj);
}
public FileChannel getChannel() {
throw new IllegalStateException("Unimplemented method called");
}
public int hashCode() {
return stream.hashCode();
}
public void mark(int readlimit) {
stream.mark(readlimit);
}
public boolean markSupported() {
return stream.markSupported();
}
public int read() throws IOException {
return stream.read();
}
public int read(byte[] b, int off, int len) throws IOException {
return stream.read(b, off, len);
}
public int read(byte[] b) throws IOException {
return stream.read(b);
}
public void reset() throws IOException {
stream.reset();
}
public long skip(long n) throws IOException {
return stream.skip(n);
}
public String toString() {
return stream.toString();
}
}
+1 mais je l'appellerais FakeFileInputStream pour souligner le besoin de truquer des choses :) et encourager à ne pas utiliser l'implémentation concrète de FileInputStream. – helios
- 1. Parse un fichier txt
- 2. accéder à un fichier
- 3. Accéder à un fichier dans un projet
- 4. Comment imprimer un tableau dans un fichier .txt dans Matlab?
- 5. problème avec StreamSource FileInputStream vs fichier
- 6. Comment créer un fichier .txt dans un dossier Internet temporaire?
- 7. Comment modifier un fichier .txt en Java
- 8. Impossible de mettre un fichier .txt à la fin d'un autre fichier .txt
- 9. Comment écrire un fichier txt avec Microsoft Dynamics AX?
- 10. comment accéder à un type défini dans un fichier .ml dans un autre fichier .ML
- 11. Comment enregistrer des données dans un fichier .txt dans MATLAB
- 12. Comment lire le contenu d'un fichier txt dans un formulaire?
- 13. Android - Comment télécharger un fichier txt sur un site Web?
- 14. Word VBA Macro - Écrire plusieurs éléments dans un fichier txt?
- 15. Comment écrire le contenu d'une JTable dans un fichier txt
- 16. Lecture de x lignes seulement à partir d'un fichier txt avec un fichier batch Windows
- 17. Comment accéder à Grails ServletContext dans un fichier gsp?
- 18. Créer un nouveau fichier txt à l'aide de VB.NET
- 19. comment lire le fichier txt.
- 20. C#: supprimer une ligne dans un fichier Txt
- 21. Comment créer un nouveau fichier txt en utilisant Adobe Air
- 22. fwrite txt fichier
- 23. Exportation de données WinForm dans un fichier .txt
- 24. PowerShell: liste Sous-répertoire à un txt fichier
- 25. Comment générer un fichier txt délimité par des tabulations?
- 26. UserControl dans le fichier txt
- 27. Comment chercher/remplacer efficacement sur un grand fichier txt?
- 28. Comment ajouter un fichier txt et créer un fichier ZIP en php
- 29. Append nouvelles entrées de tableau bash dans un fichier txt
- 30. Comment lire un fichier et écrire dans un fichier texte?
C'est pourquoi c'est une bonne idée de coder à l'interface et non l'implémentation. – Powerlord
Vous ne devez pas diffuser de flux d'entrée dans leurs implémentations. Ils sont pensés pour la mise en place de tuyaux et de filtres. C'est, un (fichier) inputsrteam lit à partir d'un fichier, un autre décompresser (GZipI.S.), Un autre casse des lignes (bufferedI.S.), Un autre ... et ainsi de suite. Donc, si votre programme s'attend à ce qu'un flux d'octets attende un flux d'entrée (n'importe quel I.S.), puis fournisse certaines de ses implémentations. Si vous voulez transformer le flux concaténer l'un avec l'autre: nouveau GZipInputStream (nouveau FileInputStream (chemin)) par exemple. – helios