2009-12-16 3 views
6

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?

+1

C'est pourquoi c'est une bonne idée de coder à l'interface et non l'implémentation. – Powerlord

+0

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

Répondre

20

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.

0

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

  1. 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

  2. sauver ur getResourceAsStream dans un fichier temporaire, et analyser le fichier temporaire, puis supprimez le fichier lorsque vous avez terminé

5

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

+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

Questions connexes