¿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()