读书人

Java IO之字节流跟字符流

发布时间: 2012-08-26 16:48:06 作者: rapoo

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()方法会强制刷新缓冲区,可以得出下面结论:

字节操作流直接操作文件,不使用缓冲区

字符操作流是操作缓冲区,然后再通过缓冲区操作文件

综合来说,在传输或者硬盘上的数据都是以字节的形式保存的,所以字节流的操作比较多,但是在操作中文的时候,字符流用的比较多。

?


读书人网 >编程

热点推荐