java io stream_简单总结Java IO中stream流的使用方法

Java语言的输入输出功能是十分强大而灵活的,对于数据的输入和输出操作以“流”(stream)的方式进行。J2SDK提供了各种各样的“流”类,用以获取不同种类的数据,定义在包java.io中。程序中通过标准的方法输入或输出数据。

Java中的流可以从不同的角度进行分类:

按照流的方向不同:分为输入流和输出流。

按照处理数据单位的不同:分为字节流(8位)和字符流(16位)。

按照功能不同:分为节点流和处理流。

节点流:是可以从一个特定的数据源(节点)读写数据的流(例如文件,内存)。就像是一条单一的管子接到水龙头上开始放水。

处理流:是“连接”在已经存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更为强大的读写功能。就像在已经接了一条管子(节点流)的基础上,又套上几个更粗,具有特殊功能的管子(处理流)对流出的水进一步的处理。

J2SDK所提供的所有位于包java.io内的流类型都分别继承以下四种抽象流类型。

4b5ceca71debe30d483e4b82a83201dd.gif

四种基本流InputStream,OutputStream,Reader,Writer又分别有更具体的子类,分为文件流,缓冲流,数据流,转换流,Print流,Object流等,都分别有特定的功能或用来操作特定的数据。其中深颜色的代表节点流,浅颜色的代表处理流。

这里通过节点流和处理流总结一下流的具体用法。

节点流的分类:

2e924013c16ba11cb78c6c858b2b72a2.png

节点流分别对File(文件),Array(内存中的一个数组),String(字符串),Pipe(管道)进行处理。

处理流的分类:

3e8306a3ab77bfabf9d265cbee8c68b6.png

常用的处理流有:缓冲流,转换流,数据流,对象流,打印流。

缓冲流:要套接在相应的字节流之上,对读写的数据提供了缓冲功能,提高了读写的效率,同时也增加了一些更方便方法。

缓冲流的作用就像一个桶,原本的字节流是个水管,水管直接连到目的地,加了缓冲流之后,就是在水管下接了一个桶,等桶接满水后再倒入目的地。起到了缓冲的作用。这样就可以一次读到更多的数据,避免了频繁的读写硬盘。由于带了缓冲功能,所以就写数据的时候需要使用flush方法。

import java.io.*;

public class TestBufferStream{

public static void main(String[] args){

try{

BufferedWriter bw=new BufferedWriter(new FileWriter("F:\\Java\\IO\\dat.txt"));//在对写文件的字节流上套接上缓冲流

BufferedReader br=new BufferedReader(new FileReader("F:\\Java\\IO\\dat.txt"));//在对读文件的字节流上套接上缓冲流

String s=null;

for(int i=1;i<=100;i++){

s=String.valueOf(Math.random());//通过随机函数给s赋值

bw.write(s); //将s写入到dat.txt文件中

bw.newLine(); //写入一个分行符。缓冲流比较好用的方法就是可以写入或读取一行的数据。

}

bw.flush(); //使内存中的所有数据立刻写出,不再缓冲。

while((s=br.readLine())!=null){ //按行读取文件内容

System.out.println(s);

}

bw.close(); //关闭处理流同时关闭里面的节点流。

br.close();

}

catch(IOException e){

e.printStackTrace();

}

}

}

转换流:用与字节数据到字符数据之间的转化。InputStreamReader需要和InputStream套接,OutputStreamWriter需要和outputStream套接。

数据流:DataInputStream 和DataOutputStream  提供将基础数据类型写入到文件中,或者读取出来,这个流的用处还是很大的,如果没有这种流的话,有一个long,本身只占8个字节,如果我要写入到文件,需要转成字符串,然后在转成字符数组,那空间会占用很多,但是有了这种流之后就很方便了,直接将这8个字节写到文件就可以了,既节约了内存空间也使程序写起来更加方便简单。但是读取的时候需要注意了,根据读取的数据类型,指针会往下移,所以你读的顺序必须要和写的顺序一致才能完成你正确的需求。否则就相当与把数据拆分了。

import java.io.*;

public class TestDataStream{

public static void main(String[] args){

ByteArrayOutputStream baos=new ByteArrayOutputStream(); //建一个节点流。

DataOutputStream dos=new DataOutputStream(baos); //在节点流上接一根数据流“管道” try{

dos.writeDouble(Math.random()); //double型 ,占8个字节

dos.writeBoolean(true); //boolean型,占一个字节

ByteArrayInputStream bais=new ByteArrayInputStream(baos.toByteArray());

System.out.println(bais.available()); //输出流中总的可用字节数--9

DataInputStream dis=new DataInputStream(bais); //同样在输出流的外面接上数据流“管道”

System.out.println(dis.readDouble()); //直接读出double型的数

System.out.println(dis.readBoolean()); //直接读出boolean型

dos.close();

dis.close();

}catch(IOException e){

e.printStackTrace();

}

}

}

打印流:java.io中专门提供用于打印的流,这类流在写入的时候有自动flush的功能,所以不需要每打印一个东西都flush一次。

import java.io.*;

public class TestPrintStream1{

public static void main(String[] args){

PrintStream ps=null;

try{

FileOutputStream fos=new FileOutputStream("F:\\Java\\IO\\log.dat");//创建输出流,指定输出地点

ps=new PrintStream(fos); //在流外面包装打印流

}catch(IOException e){

e.printStackTrace();

}

if(ps!=null){

System.setOut(ps); //将系统的打印设置成打印流ps

}

int ln=0;

for(char c=0;c<=60000;c++){

System.out.print(c+" "); //不在打印到dos窗口,输出流直接打印到指定文件中

if(ln++>=100){

System.out.println();ln=0;

}

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值