java scala inputstream streamreader

¿Cómo omitir caracteres no válidos en transmisión en Java/Scala?



inputstream streamreader (4)

Bueno, si no es UTF-8, es otra cosa. El truco es descubrir qué es esa otra cosa, pero si lo único que quieres es evitar los errores, puedes usar una codificación que no tenga códigos no válidos, como latin1 :

Source.fromFile(new File( path), "latin1").getLines()

Por ejemplo tengo código siguiente

Source.fromFile(new File( path), "UTF-8").getLines()

y lanza excepción

Exception in thread "main" java.nio.charset.MalformedInputException: Input length = 1 at java.nio.charset.CoderResult.throwException(CoderResult.java:260) at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:319)

No me importa si algunas líneas no se leyeron, pero ¿cómo omitir caracteres no válidos y continuar leyendo líneas?


Puede influir en la forma en que la decodificación del conjunto de caracteres maneja la entrada no válida llamando a CharsetDecoder.onMalformedInput .

Por lo general , nunca verás un objeto CharsetDecoder directamente, ya que se creará entre bastidores para ti. Por lo tanto, si necesita acceder a él, deberá utilizar una API que le permita especificar el CharsetDecoder directamente (en lugar de solo el nombre de codificación o el Charset ).

El ejemplo más básico de dicha API es el InputStreamReader :

InputStream in = ...; CharsetDecoder decoder = StandardCharsets.UTF_8.newDecoder(); decoder.onMalformedInput(CodingErrorAction.IGNORE); Reader reader = new InputStreamReader(in, decoder);

Tenga en cuenta que este código utiliza la clase de Java 7 StandardCharsets ; para versiones anteriores, simplemente puede reemplazarlo con Charset.forName("UTF-8") (o usar la clase Charsets de Guava ).


Si quieres evitar los caracteres no válidos usando Scala, encontré que esto me funcionó.

import java.nio.charset.CodingErrorAction import scala.io._ object HelloWorld { def main(args: Array[String]) = { implicit val codec = Codec("UTF-8") codec.onMalformedInput(CodingErrorAction.REPLACE) codec.onUnmappableCharacter(CodingErrorAction.REPLACE) val dataSource = Source.fromURL("https://www.foo.com") for (line <- dataSource.getLines) { println(line) } } }


Tuve un problema similar, y uno de los codecs integrados de Scala hizo el truco por mí:

Source.fromFile(new File(path))(Codec.ISO8859).getLines()