outputstream write java
FileInputStream vs FileReader (5)
FileReader rd=new FileReader("new.mp4");
FileWriter wr=new FileWriter("output.mp4");
int ch;
while((ch=rd.read())!=-1)
wr.write(ch);
wr.flush();
wr.close();
Cuando uso FileReader
y FileWriter
para leer y escribir un archivo mp4, el archivo output.mp4
no se puede representar bien. Pero cuando uso FileInputStream
y FileOutputStream
, funcionó bien.
Entonces, ¿puedo concluir que FileReader
y FileWriter
son solo para leer y escribir texto?
"FileWriter está destinado a escribir secuencias de caracteres. Para escribir flujos de bytes sin procesar, considere usar FileOutputStream".
http://download.oracle.com/javase/1.4.2/docs/api/java/io/FileWriter.html
FileWriter y FileReader están diseñados para Streams of chars ...
atentamente.
Furkan
Sí, su conclusión es que las subclases correctas de Reader
y Writer
son para leer / escribir contenido de texto. InputStream
/ OutputStream
son para contenido binario. Si echas un vistazo a la documentación:
Reader
- Clase de resumen para leer secuencias de caracteres
InputStream
: la clase abstracta es la superclase de todas las clases que representa una secuencia de entrada de bytes.
Se puede leer un archivo de texto usando fileReader
y fileInputStream
pero mp3 y png solo se pueden leer usando fileInputStream
fileReader
lee char por charfileInputStream
lee byte por byte
FileInputStream
se utiliza para leer secuencias de bytes de datos sin FileInputStream
, como imágenes sin FileInputStream
. FileReaders
, por otro lado, se utilizan para leer secuencias de caracteres
La diferencia entre FileInputStream
y FileReader
es que FileInputStream
lee el byte del archivo por byte y FileReader
lee el archivo carácter por carácter.
Por lo tanto, cuando intente leer el archivo que contiene el carácter "Č"
, en FileInputStream
dará el resultado como 196 140
, porque el valor ASCII
de Č
es 268
.
En FileReader
dará el resultado como 268
que es el valor ASCII
del char Č
.
FileReader
(y de hecho cualquier extensión de Reader) es de hecho para texto . De la documentación de Reader
:
Clase abstracta para leer secuencias de caracteres .
(Énfasis mío). Mire la API y verá que todo tiene que ver con el texto: char
lugar de byte
todo el lugar.
InputStream
y OutputStream
son para datos binarios, como archivos mp4.
Personalmente, evitaría el FileReader
conjunto, ya que siempre usa la codificación de caracteres predeterminada del sistema. En su lugar, use InputStreamReader
en un FileInputStream
... pero solo cuando desee tratar con texto.
Como un lado, esa es una forma muy ineficiente de copiar desde una entrada a una salida ... use las sobrecargas de read
y write
que leen o escriben desde un búfer, ya sea un byte[]
o un char[]
. De lo contrario, está llamando a leer y escribir para cada byte / carácter en el archivo.
También debe cerrar flujos de IO en bloques finally
para que estén cerrados incluso si se lanza una excepción mientras los está procesando.