Java IO之字节流和字符流
?
在整个Java的IO中,流的操作分两种:字节流:字节输出流OutputStream和字节输入流InputStream
字符流:一个字符等于两个字节,分为字符输出流Writer和字符输入流Reader
?
Java?IO操作的基本步骤为:
一:使用File找到一个文件
二:使用字节流或字符流的子类为OutputStream、IntputStream、Writer、Reader进行实例化操作
三:进行读或写的操作
四:关闭资源:close();在所有流操作中,最终必须要关闭。
?
?
1、字节输出流OutputStream
在java.io包中OutputStream是字节输出流最大的父类:
public?abstract?class?OutputStream?extends?Object?implements?Closeable,Flushable
?
此类是一个抽象类,依靠其子类进行文件操作,实现该接口的子类有:
ByteArrayOutputStream、FileOutputStream、FilterOutputStream、ObjectOutputStream、OutputStream、PipedOutputStream。
?
OutputStream提供了以下写入数据的方法:
写入全部字节数组:public?void?write(byte[]?b)?throws?IOException
写入部分字节数组:public?void?write(byte[]?b,int?off,int?len)?throws?IOException
写入一个数据:public?abstract?void?write(int?b)?throws?IOException
?
如果要完成文件的输出操作,则使用FileOutputStream进行实例化工作:
package com.chenzehe.test.io;import java.io.File;import java.io.FileOutputStream;import java.io.OutputStream;public class FileOutputStreamDemo { public static void main(String[] args) throws Exception { File file = new File("D:" + File.separator + "demo.txt"); OutputStream outputStream = new FileOutputStream(file); String str = "hello world"; byte[] b = str.getBytes(); outputStream.write(b); outputStream.close(); }}或:package com.chenzehe.test.io;import java.io.File;import java.io.FileOutputStream;import java.io.OutputStream;public class FileOutputStreamDemo { public static void main(String[] args) throws Exception { File file = new File("D:" + File.separator + "demo.txt"); OutputStream outputStream = new FileOutputStream(file); String str = "hello world"; byte[] b = str.getBytes(); for (int i = 0; i < b.length; i++) { outputStream.write(b[i]); } outputStream.close(); }}??
以上方式实现发现每次执行后都把上一次的内容替换掉,如果期望追加内容,则使用FileOutputStream的下面构造方法:
public?FileOutputStream(File?file,boolean?append)?throws?FileNotFoundException,如果将append设置为true,则表示追加内容。
?
?
2、字节输入流InputStream
public?abstract?class?InputStream?extends?Object?implements?Closeable
此类属于抽象类,需要使用其子类来实现文件的操作,实现它的子类有:
AudioInputStream、ByteArrayInputStream、FileInputStream、FilterInputStream、InputStream、ObjectInputStream、PipedInputStream、SequenceInputStream、StringBufferInputStream,如果是要实现对文件的操作,则使用FileInputStream类,该类有如下方法可读取数据:
将内容读取到字节数组之中:public?int?read(byte[]?b)?throws?IOException?
每次只读一个数据:public?abstract?int?read()?throws?IOException
package com.chenzehe.test.io;import java.io.File;import java.io.InputStream;import java.io.FileInputStream;public class FileInputStreamDemo { public static void main(String[] args) throws Exception { File file = new File("D:" + File.separator + "demo.txt"); InputStream inputStream = new FileInputStream(file); byte[] b = new byte[1024]; inputStream.read(b); System.out.println(new String(b)); inputStream.close(); }}??
以上是一种比较常见的读取形式,上面给b开辟了1024个字节码的空间,但是实际字符并达不到1024长度,所以在输出后面输出很多空格,以上的代码有一个缺点,会受到开辟空间的限制,如果想动态的开辟数组空间,则可以根据文件的大小来决定,采用read()方法一个个数据的读取。
?
package com.chenzehe.test.io;import java.io.File;import java.io.FileInputStream;import java.io.InputStream;public class FileInputStreamDemo { public static void main(String[] args) throws Exception { File file = new File("D:" + File.separator + "demo.txt"); InputStream inputStream = new FileInputStream(file); byte[] b = new byte[(int) file.length()]; inputStream.read(b); System.out.println(new String(b)); inputStream.close(); }}??
3、字符输出流Writer
Writer类是在IO包中操作字符的最大父类,主要功能是完成字符流的输出,Writer类的定义如下:
public?abstract?class?Writer?extends?Object?implements?Appendable,Closeable,Flushable
与OutputStream一样,Writer类也发球抽象类,如果要进行文件操作,则使用FileWriter,
写入操作为:public?void?writer(String?str)?throws?IOException,
可追加的写入操作:public?void?writer(String?str,boolean?append)?throws?IOException
如:
?
?
package com.chenzehe.test.io;import java.io.File;import java.io.FileWriter;import java.io.Writer;public class FileWriterDemo {public static void main(String[] args) throws Exception {File file = new File("D:" + File.separator + "demo.txt");Writer writer = new FileWriter(file);String str = "hello world";writer.write(str);writer.close();}}??
4、字符输入流Reader
字符输入流与字节输入流不同的地方是使用的是char数组,Reader的定义为:
public?abstract?class?Reader?extends?Object?implements?Readable,Closeable,Reader是一个抽象类,可以使用FileReader类进行文件操作,读取方法有:
读取一组字符:public?int?read(char[]?cbuf)?throws?IOException
读取一个字符:public?int?read()?throws?IOException
如:
package com.chenzehe.test.io;import java.io.File;import java.io.FileReader;import java.io.Reader;public class FileReaderDemo {public static void main(String[] args) throws Exception {File file = new File("D:" + File.separator + "demo.txt");Reader reader = new FileReader(file);char[] c = new char[(int)file.length()];reader.read(c);System.out.println(new String(c));reader.close();}}?使用字符流也可以一个个的输出:
?
package com.chenzehe.test.io;import java.io.File;import java.io.FileReader;import java.io.Reader;public class FileReaderDemo {public static void main(String[] args) throws Exception {File file = new File("D:" + File.separator + "demo.txt");Reader reader = new FileReader(file);char[] c = new char[(int) file.length()];for (int i = 0; i < c.length; i++) {c[i] = (char) reader.read();}System.out.println(new String(c));reader.close();}}?5、字节流和字符流的区别
下面字节流操作文件代码没有关闭操作,内容照常被写到文件中:
package com.chenzehe.test.io;import java.io.File;import java.io.FileOutputStream;import java.io.OutputStream;public class FileOutputStreamDemo {public static void main(String[] args) throws Exception {File file = new File("D:" + File.separator + "demo.txt");OutputStream outputStream = new FileOutputStream(file);String str = "hello world";byte[] b = str.getBytes();outputStream.write(b);//outputStream.close();}}??
下面字符流操作文件代码没有关闭操作,但是内容并没有写到文件中:
package com.chenzehe.test.io;import java.io.File;import java.io.FileWriter;import java.io.Writer;public class FileWriterDemo {public static void main(String[] args) throws Exception {File file = new File("D:" + File.separator + "demo.txt");Writer writer = new FileWriter(file);String str = "hello world";writer.write(str);//writer.close();}}?但是使用了flush()方法后,即使没有关闭操作,内容就被写到文件中了:
package com.chenzehe.test.io;import java.io.File;import java.io.FileWriter;import java.io.Writer;public class FileWriterDemo {public static void main(String[] args) throws Exception {File file = new File("D:" + File.separator + "demo.txt");Writer writer = new FileWriter(file);String str = "hello world";writer.write(str);// writer.close();writer.flush();// 刷新缓冲区}}?之前代码只有close()方法而没有flush()方法也能写进文件是因为close()方法会强制刷新缓冲区,可以得出下面结论:
字节操作流直接操作文件,不使用缓冲区
字符操作流是操作缓冲区,然后再通过缓冲区操作文件
综合来说,在传输或者硬盘上的数据都是以字节的形式保存的,所以字节流的操作比较多,但是在操作中文的时候,字符流用的比较多。
?