JAVA笔记之IO流

来源:互联网 发布:淘宝店铺怎么开通直播 编辑:程序博客网 时间:2024/05/01 02:29
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">输入流,输出流是一种分类方法。</span>
字节流,字符流是一种分类方法。
节点流,处理流是一种分类方法。

输入就是读,输出就是写。

按照JAVA面向对象思想,要创建I/O流就得创建对象。

字节流:


InputStream:所有字节输入流的父类,抽象类。
OutputStream:所有字节输出流的父类,抽象类。


InputStream最常用的子类是FileInputStream.
OutputStream最常用的子类是FileOutputStream.


InputStream输入流,也就是读,里面有int read()方法,用于读取数据。
该方法内接收三个参数,一个是byte类型的数组,用于以字节形式存放数据。
一个是int off偏移量,意思从数组的第几位开始读,一般是从0开始。
最后一个是int length,意思是一次最多读取长度的数据。
方法返回值是int,意思是读取多少个字节的数据。和length相同。

同样接收三个参数,类型也和int read()方法相同。
该方法没有返回值。
在创建其对象时传入的参数是输入或输出文件的详细地址。
与此同时,我们要需要创建一个数组,用于存放数据。


假设我们要将文件A里的内容读取到,并将读取到的内容放入到B文件。

FileInputStream fis=null;//创建输入流对象。FileOutputStream fos=null;//创建输出流对象。try{//创建输入流对象的同时调用其构造函数,接收要读取的文件,该文件必须指定其位置。fis=new FileInputStream("E:/音乐/小说/日记.txt");//创建输出流对象同时,调用其构造函数,接收要输出的文件位置。fos=new FileOutputStream("E:/Y.txt");//创建数组,用于存放数据。一般文件比较大,//数据比较多的时候,只需要指定数组长度为1024即可。//因为可以定义循环来重复读写数据。byte [] buffer=new byte[1024];while(true){//read();方法就是读取数据,后面的三个参数分别是,//存放数据的数组名,偏移量(也就是从哪个角标开始读取)//和读取的长度。//因为read()方法的返回值是int,表示读取了多少个字节的数据,要想知道这个数据,//定义int变量temp将这个返回值传入即可。int temp=fis.read(buffer,0,buffer.length);//java当中定义,当这个返回值为-1的时候,说明数据已经读取完毕了。if (temp==-1){//设定跳出当前循环。break;}//write()方法是向文件写入数据,还是三个参数。//存放数据的数组,偏移量,以及写入长度。+fos.write(buffer,0,temp);}}catch (Exception e){e.printStackTrace();}finally {try{//这是关闭输入流和输出流。//关闭IO流也有可能抛出异常,所以再用一层try,catch。fis.close();fos.close();}catch (Exception e){e.printStackTrace();}}//以上是字节流的输入输出方式。



字符流:


Reader:所有字符输入流的父类,抽象类。
Writer:所有字符输出流的父类,抽象类。

Reader常用的子类是FileReader.
Writer常用的子类是FileWriter.

和字节流一样,Reader里面有int read()方法,用于读取数据。
同样是接收三个参数,同样返回值是int,唯一的区别就是接收的第一个参数由byte类型数组变成了char类型数组。
Writer里面同样有write()方法,用于写出数据。
参数和没有返回值都是一样,只是数组类型变成了char。

假设将A文件的内容读取到然后写入到B文件,用字符流的方式。
示例代码:

import java.io.*;class IOChar {public static void main(String[] args) {FileReader fr=null;FileWriter fw=null;try{fr=new FileReader("E:/x.txt");fw=new FileWriter("E:/y.txt");char [] buffer=new char[1024];while (true){int temp=fr.read(buffer,0,buffer.length);if (temp==-1){break;}fw.write(buffer,0,temp);}}catch (IOException e){e.printStackTrace();}finally{try{fr.close();fw.close();}catch (IOException e){e.printStackTrace();}}}}
和字节流的方式几乎完全一样。以上就是字符流的输入输出方式。

节点流:真正读取数据的对象。比如上面的FileReader,FileWriter.
处理流:用来装饰节点流,对节点流进行二次处理的对象。

BufferReader:字符输入处理流的对象。
BufferWriter:字符输出处理流的对象。
他的作用就是对读取的数据的流对象进行二次处理,比如字符转换,换行,等。
然后他的构造函数内必须传入一个节点流对象。意思就是要想创建处理流对象,必须得有一个节点流对象。

示例代码:
import java.io.*;//导入java的io包。class IOChar {public static void main(String[] args) {//字符输入流对象。FileReader fr=null;//字符输入处理流对象。BufferedReader br=null;try{//先创建节点流(输入流)对象。fr=new FileReader("E:/x.txt");//创建处理流对象,构造函数中必须传入节点流。br=new BufferedReader(fr);//定义空字符串。String line=null;while (true){//readLine()方法是一次读取一行数据。返回值是String。//所以我们才能用一个字符串变量去接收他。line=br.readLine();if (line==null)//如果字符串为空,说明数据读取结束。即可跳出循环。{break;}//读取一次,打印一次。System.out.println(line);}}catch (IOException e){e.printStackTrace();}finally{try{fr.close();}catch (IOException e){e.printStackTrace();}}}}


0 0
原创粉丝点击