Exception indiquant “ Réinitialisation des invalides de la marque ” vient en marquant un inputStream et de le réinitialiser, pour les Gros fichiers.?
Je suis à l'aide de InputStream objet pour calculer le Md5 d'un fichier.
Je marque le flux
Plus tard, j'ai réinitialiser le flux. Cependant pour les gros fichiers suivants exception...
inStreamLatestFile.mark(0);
checkSumCalculated = MD5CheckSumCalculator.calculateMD5CheckSum(inStreamLatestFile);
inStreamLatestFile.reset();
L'exception
.Md5ValidationAggrStrat ||**Error in calculating checksum:: java.io.IOException: Resetting to invalid mark**
||java.io.IOException: Resetting to invalid mark
||at java.io.BufferedInputStream.reset(BufferedInputStream.java:437)
||at com.amadeus.apt.ib.modules.func.map.camel.strategy.Md5ValidationAggrStrategy.aggregate(Md5ValidationAggrStrategy.java:81)
||at org.apache.camel.processor.aggregate.AggregateProcessor.onAggregation(AggregateProcessor.java:365)
||at org.apache.camel.processor.aggregate.AggregateProcessor.doAggregation(AggregateProcessor.java:245)
||at org.apache.camel.processor.aggregate.AggregateProcessor.process(AggregateProcessor.java:201)
||at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61)
||at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73)
J'ai essayé de clôture, les flux et la réouverture de cette façon.. juste pour obtenir quelques exceptions près comme suit::
try {
inStreamLatestFile= ExchangeHelper.getMandatoryInBody(
oldExchange, InputStream.class);
//inStreamLatestFile.mark(0);
checkSumCalculated = MD5CheckSumCalculator.calculateMD5CheckSum(inStreamLatestFile);
//closing the inputStream of the latest file
if(inStreamLatestFile != null){
try {
inStreamLatestFile.close();
} catch (IOException e) {
logger.error("Error occurred in closing the stream :: "+ e.getMessage());
}
}
tempInputStream= ExchangeHelper.getMandatoryInBody(
oldExchange, InputStream.class);
oldExchange.getIn().setBody(tempInputStream);
Toutefois l'exception suivante vient quand j'essaie de resuse nouvellement récupéré InputStream.
caught: java.io.IOException: Stream closed: java.io.IOException: Stream closed
at java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:162)
Est-il possible de la
Merci beaucoup pour résoudre le problème.. Non, c'est un tiers de l'Api et je n'ai aucun contrôle sur elle. Cette méthode ne modifie que le inputStream et donc j'ai besoin de marquer et de réinitialiser le flux de données, comme j'ai besoin d'elle plus tard...
C'est peut-être que
Oui, cela pourrait être un problème.{Je suis en train de travailler sur apache camel cadre} Donc, fondamentalement, il se résume à cette question, Comment faire pour créer un double de inputStream tels que les objets sont des instances différentes.. ??
Vous pouvez lire l'original
calculateMD5CheckSum
marque le flux?Merci beaucoup pour résoudre le problème.. Non, c'est un tiers de l'Api et je n'ai aucun contrôle sur elle. Cette méthode ne modifie que le inputStream et donc j'ai besoin de marquer et de réinitialiser le flux de données, comme j'ai besoin d'elle plus tard...
C'est peut-être que
getMandatoryInBody
renvoie la même instance de flux de données à chaque fois. Je ne sais pas qui de l'API.Oui, cela pourrait être un problème.{Je suis en train de travailler sur apache camel cadre} Donc, fondamentalement, il se résume à cette question, Comment faire pour créer un double de inputStream tels que les objets sont des instances différentes.. ??
Vous pouvez lire l'original
InputStream
dans un ByteArrayOutputStream
. Copiez le bytes
dans ce flux dans une nouvelle ByteArrayInputStream
. Pass pour le MD5 de la calculatrice. La création d'une nouvelle ByteArrayInputStream
à nouveau avec le même octets et le passer à tout autre chose dont vous avez besoin.OriginalL'auteur Kumar Ritesh | 2013-09-02
Vous devez vous connecter pour publier un commentaire.
Je vais supposer que vous êtes à l'aide d'un
BufferedInputStream
parce que son code source pourreset()
méthode estL'appel suivant
doivent faire quelque chose pour le
markPos
.Si vous n'avez aucun contrôle sur elle, juste de rouvrir le flux. Si vous ne pouvez pas rouvrir le flux, c'est à dire. vous êtes à la récupération de la même instance à chaque fois, pensez à utiliser un
ByteArrayOutputStream
Vous pouvez lire l'original
InputStream
dans unByteArrayOutputStream
. Copier les octets dans ce flux dans une nouvelleByteArrayInputStream
. Pass pour le MD5 de la calculatrice. Puis créer un nouveauByteArrayInputStream
à nouveau avec le même octets et le passer à tout autre chose dont vous avez besoin.Comment avez-vous l'origine initialiser
inStreamLatestFile
? Juste de fermer et de redémarrer il.Vous réutilisez le même fermé des flux, de la pas de le réinitialisé.
Cela signifie que, même quand il est fermé, le même objet est référencé...
OriginalL'auteur Sotirios Delimanolis