当前位置:文档之家› Java_IO流

Java_IO流

IO流1,流的分类按照流的流向划分:输入流:只能从中读取数据,而不能向其写数据。

输入流基类,InputStream和Reader。

输出流:只能向其写入数据,而不能从中读取数据。

输出流基类,OutputStream和Writer。

按照操作数据单元划分:字节流:操作最小数据单元是8位的字节。

字节流基类,InputStream和OutputStream。

字符流:操作最小数据单元是16位字节。

字符流基类,Reader和Writer。

2,Java IO体系2.1 IO体系图2.2 IO体系分类图3,IO流抽象基类3.1,输入流的抽象基类:InputStream和ReaderInputStream和Reader是所有输入流的基类,它们都是抽象类,本身不能创建实例来执行输入,但它们是所有输入流的模板,所有输入流都使用它们提供的方法。

在InputStream里包含如下三个方法:》》int read():从输入流中读取单个字节,返回所读取的字节数据(字节数据可直接转换为int类型)。

》》int read(byte[] b):从输入流中读取最多b.length个字节的数据,并将其存储在字节数组b 中,赶回实际读取的字节数。

》》int read(byte[] b,int off,int len):从输入流中读取最多len字节的数据,并将其从off位置开始存储在数组b中,返回实际读取的字节数。

在Reader里包含如下三个方法:》》int read():从输入流中读取单个字符,返回所读取的字符数据(字符数据可直接转换为int类型)。

》》int read(char[] cbuf):从输入流中读取最多cbuf.length个字符的数据,并将其存储在字符数组cbuf中,赶回实际读取的字符数。

》》int read(char[] cbuf,int off,int len):从输入流中读取最多len字符的数据,并将其从off位置开始存储在数组cbuf中,返回实际读取的字符数。

3.2,输出流的抽象基类:OutputStream和WriterOutputStream和Writer和前面的输入流相似,两个流都提供了如下三个方法:》》void write(int c):将指定的字节/字符输出到输出流中,其中c代表字节或者字符。

》》void write(byte[]/char[] buf):将字节数组/字符数组中的数据输出到指定的输出流中。

》》void write(byte[]/char[] buf,int off,int len):将字节数组/字符数组中从off位置开始,长度为len的字节/字符输出到指定的输出流中。

因为字符流直接以字符作为操作单位,所以Writer可以用字符串来代替字符数组,即以String对象作为参数。

Writer里还包含如下两个方法:》》void write(String str):将字符串str里包含的字符输出到指定的输出流中。

》》void write(String str,int off,int len):将字符串str从off位置开始,长度为len的字符输出到指定输出流中。

4,IO流程序异常处理的标准方式import java.io.*;class FileWriterDemo2{public static void main(String[] args){FileWriter fw = null;try{fw = new FileWriter("c:\\demo.txt");fw.write("abcde");}catch (IOException e){//异常处理方式System.out.println(e.toString());}finally{try{if(fw!=null)fw.close();}catch (IOException e){//异常处理方式System.out.println(e.toString());}}}}5,流与流之间相对应的关系图5.1 字节输入流与输出流的对应关系图5.2,字符输入流与输出流的对应关系6,实现IO的子类6.1,字符流1,FileWriter构造方法:FileWriter(String fileName):根据给定的文件名构造一个FileWriter对象。

FileWriter(String fileName, boolean append):根据给定的文件名以及指示是否附加写入数据的boolean值来构造FileWriter对象。

常用方法:void close():关闭此流,但要先刷新它。

void flush():刷新该流的缓冲。

void write(char[] cbuf) :写入字符数组。

void write(char[] cbuf, int off, int len) :写入字符数组的某一部分。

void write(int c) :写入单个字符。

void write(String str) :写入字符串。

void write(String str, int off, int len) :写入字符串的某一部分。

2,FileReader构造方法:FileReader(String fileName):在给定从中读取数据的文件名的情况下创建一个新FileReader。

常用方法:void close() :关闭该流并释放与之关联的所有资源。

int read() :读取单个字符。

int read(char[] cbuf) :将字符读入数组。

int read(char[] cbuf, int off, int len) :将字符读入数组的某一部分。

3,BufferedWriter构造方法:BufferedWriter(Writer out):创建一个使用默认大小输出缓冲区的缓冲字符输出流。

常用方法:void close():关闭此流,但要先刷新它。

void flush():刷新该流的缓冲。

void newLine():写入一个行分隔符,该方法具有跨平台性。

void write(char[] cbuf) :写入字符数组。

void write(char[] cbuf, int off, int len):写入字符数组的某一部分。

void write(int c):写入单个字符。

void write(String str) :写入字符串。

void write(String s, int off, int len):写入字符串的某一部分。

4,BufferedReader构造方法:BufferedReader(Reader in):创建一个使用默认大小输入缓冲区的缓冲字符输入流。

常用方法:void close():关闭该流并释放与之关联的所有资源。

int read():读取单个字符。

int read(char[] cbuf):将字符读入数组。

int read(char[] cbuf, int off, int len):将字符读入数组的某一部分。

String readLine():读取一个文本行。

当读取到文件末尾时,返回null。

5,LineNumberReader:是BufferedReader的子类,带行号操作的类构造方法:LineNumberReader(Reader in):使用默认输入缓冲区的大小创建新的行编号reader。

常用方法:int getLineNumber():获得当前行号。

void mark(int readAheadLimit):标记该流中的当前位置。

int read():读取单个字符。

int read(char[] cbuf, int off, int len):将字符读入数组中的某一部分。

String readLine():读取文本行。

void setLineNumber(int lineNumber):设置当前行号。

void close():关闭流。

6,代码演示:复制纯文本文件import java.io.*;public class CopyTextDemo {public static void main(String[] args) throws IOException {// copy_one();// copy_two();copy_three();}// 使用字符缓冲流,提高效率public static void copy_three() throws IOException {BufferedReader bfr = new BufferedReader(new FileReader("c:\\demo.java"));BufferedWriter bfw = new BufferedWriter(new FileWriter("c:\\demo.txt"));String line = null;while ((line = bfr.readLine()) != null) {bfw.write(line);// 换行,因为readLine方法写入时,不包含换行符bfw.newLine();bfw.flush();}bfr.close();bfw.close();}// 使用字符数组进行缓冲,一次读取,一次写入,效率高public static void copy_two() throws IOException {FileReader fr = new FileReader("c:\\demo.java");FileWriter fw = new FileWriter("c:\\demo_copy.txt");char[] buf = new char[1024];int len = 0;while ((len = fr.read(buf)) != -1) {fw.write(buf, 0, len);}fr.close();fw.close();}// 读一个字符,写一个字符,这种方法效率很低下public static void copy_one() throws IOException {FileReader fr = new FileReader("c:\\demo.java");FileWriter fw = new FileWriter("c:\\demo_copy.txt");int len = 0;while ((len = fr.read()) != -1) {fw.write((char) len);}fr.close();fw.close();}}====================================================================== 6.2,字节流1,FileOutputStream:构造方法:FileOutputStream(String name):创建一个向具有指定名称的文件中写入数据的输出文件流。

相关主题