2011-12-22 4 views
10

Estoy aprendiendo a usar un InputStream. Yo estaba tratando de utilizar la marca para BufferedInputStream, pero cuando intento para restablecer tengo estas excepciones:Límite de lectura de la marca de flujo de entrada almacenada

java.io.IOException: Resetting to invalid mark 

Creo que esto significa que mi marca de leer límite se establece equivocado. De hecho, no sé cómo establecer el límite de lectura en mark(). Intenté de esta manera:

is = new BufferedInputStream(is); 
is.mark(is.available()); 

Esto también es incorrecto.

is.mark(16); 

Esto también arroja la misma excepción. ¿Cómo sé cuál es el límite de lectura que debo establecer? Como leeré diferentes tamaños de archivo de la secuencia de entrada.

+2

Mi opinión personal? No use marca, aunque estoy seguro de que hay una, aún no he encontrado una buena razón para ello. A menudo, en primer lugar, es una señal de mala manipulación. Tiendo a pensar que una transmisión no es una transmisión a menos que tenga la forma más cruda que tiene. Prefiero tener un envoltorio cerrado que obtenga su información, la empaquete y envíe ese paquete para su procesamiento en algún lugar de la aplicación. – corsiKa

+0

@glowcoder Gracias por su comentario. Como dije antes, soy nuevo en el trabajo con InputStream. De hecho, estaba tratando de usar el flujo de entrada dos veces. Pensé que esta es la manera de hacerlo. Ajuste de marca y reinicio. ¿Tienes alguna otra sugerencia sobre cómo lograr esto? –

+3

Mark funciona así. Digamos que su flujo de entrada terminaría siendo 'A B C D E'. Usted procesa 'A B' hasta el momento. (Recuerda, aún no sabes qué es 'aguas abajo'). Lo marcas. Luego lees un poco más, y obtienes 'C D E'. Lo miras y dices "¡Espera, no puedo procesar' C D E' en este modo! " por cualquier razón. Entonces dices "Realmente me gustaría poder volver a procesar' C D E' otra vez ... lo cual puedes, ya que 'mark()' ed.Simplemente 'reset()' para volver a poner la secuencia donde estaba cuando la marcó, y puede volver a leerla como lo haría antes. – corsiKa

Respuesta

0

El valor que pasa a mark() es la cantidad al revés que deberá restablecer. si necesita restablecer al comienzo de la transmisión, necesitará un búfer tan grande como la secuencia completa. probablemente este no es un gran diseño, ya que no se adaptará bien a grandes flujos. si necesita leer la secuencia dos veces y no sabe la fuente de los datos (por ejemplo, si es un archivo, puede volver a abrirlo), entonces probablemente debería copiarlo en un archivo temporal para que pueda volver a leerlo. léelo a voluntad.

+0

gracias por su respuesta, yo estaba planeando restablecerlo al principio. Pero ahora creo que no es una buena idea. Cuando dijiste que debería copiarlo al archivo temporal, ¿quieres decir que tengo que guardarlo en algún lugar de mi carpeta antes de usarlo? –

+0

@NurAini: sí, cree un archivo temporal, copie la secuencia en él, luego puede volver a leer ese archivo temporal tantas veces como lo necesite. – jtahlborn

6

mark a veces es útil si necesita inspeccionar unos bytes más allá de lo que ha leído para decidir qué hacer a continuación, reinicia de nuevo a la marca y llama a la rutina que espera que el puntero de archivo sea al principio de esa parte lógica de la entrada. No creo que realmente esté destinado a mucho más.

Si nos fijamos en el Javadoc para BufferedInputStream Dice

La operación marca se acuerda un punto en el flujo de entrada y la operación de reposición hace que todos los bytes leídos desde la última operación de la marca que se vuelven a leer antes de nuevo los bytes se toman de la secuencia de entrada contenida.

La clave a recordar aquí es si usted marca un punto en la corriente, si se mantiene la lectura más allá de la longitud marcada, la marca ya no sea válida, y la llamada a restablecer fallará. Entonces la marca es buena para situaciones específicas y no es muy útil en otros casos.

+0

gracias por tu comentario. cuando dijiste 'si sigues leyendo y el buffer debe rellenarse'. ¿Eso está sucediendo porque utilicé BufferedInputStream? –

+0

Sí, sin embargo, las secuencias io no almacenadas no son compatibles con la marca y el restablecimiento. – Bill

1

Esto leerá 5 veces desde el mismo BufferedInputStream.

for (int i=0; i<5; i++) { 
    inputStream.mark(inputStream.available()+1); 
    // Read from input stream 
    Thumbnails.of(inputStream).forceSize(160, 160).toOutputStream(out); 
    inputStream.reset(); 
} 
Cuestiones relacionadas