6
votes

Comment puis-je accéder à un fichier TXT dans un pot avec FileInputStream?

Je suis conscient de la méthode getresourceastream () mais il existe un problème avec l'analyseur qui lit le fichier, l'ensemble de la structure a été implémentée pour s'attendre à un FileInputStream () et le getresourceastream () renvoie un flux d'entrée qui ne peut pas être coulé. Y a-t-il une "solution" facile pour cette situation?


2 commentaires

Ce serait pourquoi il est une bonne idée de coder à l'interface et non à la mise en œuvre.


Vous ne devriez pas lancer des flux d'entrée à leurs implémentations. Leurs sont pensées pour la mise en œuvre de tuyaux et de filtres. C'est, un (fichier) INPUTSRTEAM se lit à partir d'un fichier, une autre décompressez (gzipi.s.), Une autre ligne de rupture (bufferedi.s.), Une autre ... et ainsi de suite. Donc, si votre programme s'attend à ce qu'un flux d'octets s'attend à une intrustream (Toute I.S.), puis fournit certaines de ses implémentations. Si vous voulez transformer le flux concaténate un avec un autre: nouveau gzipinputtream (nouveau fichierInputStream (chemin)) par exemple.


3 Réponses :


20
votes

Une ressource contenue dans un fichier JAR n'est pas elle-même un fichier et ne peut pas être lu à l'aide d'un fichier fichierInputStream . Si vous avez un code qui nécessite absolument un fichierInputStream , vous devez extraire les données à l'aide de getresourceastream () , copiez-le dans un fichier temporaire, puis transmettez un FileInputStream pour ce fichier temporaire à votre code.

Bien sûr, à l'avenir, n'écrivez jamais de code pour s'attendre à des implémentations concrètes de choses telles que introuvable , vous le regretterez toujours.


0 commentaires

0
votes

Ne croyez pas que votre analyse fonctionne uniquement sur FileInputStream mais pas d'introuvream

Si tel est le cas réel et que vous devez utiliser cet analyseur

2 options

  1. Utilisez le motif de l'adaptateur pour créer un fichier CustomFileInputStream et écraser les méthodes respectives, plus de rediriger les données GetResourceeStream à la CustomFileInputStream

  2. Enregistrez votre fichier temporaire dans un fichier temporaire et analysez le fichier Temp, puis supprimez le fichier lorsque vous avez terminé


0 commentaires

5
votes

J'ai récemment rencontré le même problème. Une bibliothèque tierce partie que nous utilisons des lectures de fichiersInputStream, mais les ressources peuvent être n'importe où, dans un bocal ou une télécommande. Nous écrivions dans des fichiers temporaires, mais cela a trop de frais généraux.

Une meilleure solution est d'écrire un fichierInputStream qui enveloppe introuvable. Voici la classe que nous utilisons, P>

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 commentaires

+1 Mais je l'appellerais de la faussefileInputStream de souligner le besoin de faire semblant de faire semblant des choses :) et encouragez à ne pas utiliser la mise en œuvre du fichier de bétonInputStream.