Je souhaite créer une intrigue qui est limitée à une certaine gamme d'octets dans le fichier, par ex. d'octets de la position 0 à 100. De sorte que le code client doit voir EOF une fois que 100e octet est atteint. p>
7 Réponses :
Le Vous devrez également vous assurer que les autres méthodes de lecture Je ne sais pas ce que votre cas d'utilisation est, mais en tant que bonus, vous pouvez également implémenter la mise en mémoire tampon. P> lue () code> méthode de
introuvable code> lit un seul octet à la fois. Vous pouvez écrire une sous-classe de
introuvable code> qui maintient un compteur interne; Chaque fois que
lisez () code> est appelé, mettez à jour le compteur. Si vous avez frappé votre maximum, ne laissez aucune autre lecture (retour -1 ou quelque chose comme ça). P>
READ_INT CODE>, etc. sont non prises en charge (ex: les remplacer et simplement lancer une inception non prêtée ()); P>
Je ne pense pas qu'il y ait besoin de mettre en œuvre la mise en mémoire tampon - c'est des préoccupations de mixage et la manière dont la lecture (octets []) fonctionne, renvoyant jusqu'à la quantité de données requise, rend cela inutile. Il est plus propre et tout aussi efficace pour envelopper le courant de base dans une bufferedInPutStream.
NB aussi que les seules méthodes d'introuvrete qui sont déclarées abstraites sont en lecture () et de lire (octets [], int, int), donc parfois, vous pouvez simplement définir ces 2 (plus peut-être fermer ()) dans votre classe enfant.
Si vous n'avez besoin que de 100 octets, alors simples est probablement préférable, je les lirais dans un tableau et envelopper cela comme une byearrayInputStream. Par exemple si vous ne voulez pas utiliser Si vous avez des besoins plus avancés, tels que la lecture d'un segment au milieu du fichier, ou des quantités plus importantes de données, puis extension d'introuvream et remplacer la lecture (octet [], int, int) ainsi que lire (), vous donnera une meilleure performance que de simplifier la méthode de lecture (). p> p> datagnutretream.ralely code>, il y a
ioutils.rafly code> de Apache Commons-io, ou Vous pouvez implément la boucle de lecture explicitement. p>
comme Danben dit , décorer votre flux et appliquer la contrainte:
Réutilisation de code (limitedInputStream des Commons-io): COMMONS.APACHE.ORG/PROPER/COMMONS-IO/APIDOCS/ORG/APACHE/COMM ONS / ...
envisagez d'utiliser http: / /guava-libres.googlecode.com/svn/trunk/javadoc/com/google/commmon/io/limitinputtream.html p>
LimitInputStream doit être supprimé dans la version 15.0 de Guava. Utiliser bytestreeams.limit (java.io.inputtream, long) à la place.
Vous pouvez utiliser Bytestreams de Guava. Notez que vous devez utiliser avec guide () avant la limite, par exemple:
ByteStreams.skipFully(tmpStream, range.start()); tmpStream = ByteStreams.limit(tmpStream, range.length());
En plus de Cette solution, à l'aide de la méthode code> Ignorer code> d'un InputStream code>, vous pouvez également lire une plage à partir du milieu du fichier.
public class RangeInputStream extends InputStream
{
private InputStream parent;
private long remaining;
public RangeInputStream(InputStream parent, long start, long end) throws IOException
{
if (end < start)
{
throw new IllegalArgumentException("end < start");
}
if (parent.skip(start) < start)
{
throw new IOException("Unable to skip leading bytes");
}
this.parent=parent;
remaining = end - start;
}
@Override
public int read() throws IOException
{
return --remaining >= 0 ? parent.read() : -1;
}
}
J'ai résolu un problème similaire pour mon projet, vous pouvez voir le code de travail ici ici PARTINPUTSREAM A >. Je l'ai utilisé pour des actifs et des fichiers flux d'entrée. Mais il ne convient pas à des flux dont la longueur n'est pas disponible initialement, telles que des flux de réseau. P>