Java中的流

一、Java中流的原理

    流是个抽象的概念,是对输入输出设备的抽象,Java程序中,对于数据的输入/输出操作都是以“流”的方式进行。设备可以是文件,网络,内存等。

    四种基本流InputStream,OutputStream,Reader,Writer又分别有更具体的子类,分为文件流,缓冲流,数据流,转换流,Print流,Object流等,都分别有特定的功能或用来操作特定的数据。

 

二、字节流

    2.1 InputStream

        继承自InputStream的流用于向程序中输入数据,且数据的单位是8bit。

        

        代码示例:

 1 public static void main(String[] args) throws IOException{
 2         
 3         File f=new File("f:\\a.txt");
 4         if(f.exists()){
 5             System.out.println("文件存在");
 6         }else{
 7             f.createNewFile();//用于创建文件
 8             //f.setReadOnly();
 9             System.out.println(f.getName()+"文件是否可读:"+f.canRead());
10             System.out.println(f.getName()+"文件是否可写:"+f.canWrite());
11         }
12         
13         InputStream in=new FileInputStream(f);
14         int data=in.read();
15         while(data!=-1)
16         {
17             char e = (char)data;
18             System.out.print(e + "  ");
19             data = in.read(); 
20         }
21         
22     }

        read()方法是一个字节一个字节地往外读,每读取一个字节,就处理一个字节。read(byte[] buffer)方法读取数据时,先把读取到的数据填满这个byte[]类型的数组buffer(buffer是内存里面的一块缓冲区),然后再处理数组里面的数据。

    2.2、OutputStream

        OutputStream和InputStream相对应为字节输出流,用于向外部设备例如文件中写数据

        

        代码示例:

 1 File f=new File("f:\\a.txt");
 2         if(f.exists()){
 3             System.out.println("文件存在");
 4         }else{
 5             f.createNewFile();//用于创建文件
 6             //f.setReadOnly();
 7             System.out.println(f.getName()+"文件是否可读:"+f.canRead());
 8             System.out.println(f.getName()+"文件是否可写:"+f.canWrite());
 9         }
10         
11         OutputStream out=new FileOutputStream(f);
12         String str="Hello world!";
13         byte[] b=str.getBytes();
14         out.write(b);
15         out.flush();
16         out.close();

        write(byte[] b):将 b.length 个字节从指定的 byte 数组写入此输出流。

        write(byte[] b, int off, int len):将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。

        write(int b):将指定的字节写入此输出流,b为ascll码。

     

    2.3、字节缓冲流

 

 

 

三、字符流

    字节流和字符流的区别就是读取方式一个为按字节读取,一个是按字符读取。在读取文件想对文件内容进行处理,比如修改某一行的时候一般使用字符流,二仅仅是读取文件一般使用字节流。

    3.1、Reader流和writer流

    代码示例:

 1 import java.io.File;
 2 import java.io.FileReader;
 3 import java.io.FileWriter;
 4 import java.io.IOException;
 5 
 6 public class wr {
 7     
 8     public static void main(String[] args) throws IOException{
 9         File f=new File("f:\\a.txt");
10         if(f.exists()){
11             System.out.println("文件存在");
12         }else{
13             f.createNewFile();//用于创建文件
14             //f.setReadOnly();
15             System.out.println(f.getName()+"文件是否可读:"+f.canRead());
16             System.out.println(f.getName()+"文件是否可写:"+f.canWrite());
17         }
18         
19         FileWriter fw  = new FileWriter(f);
20         String str="asdw";
21         fw.write(str);//向文件中写入asdw
22         fw.write(str,0,2);//向文件中写入as
23         char c='a';
24         fw.write(c);//向文件中写入a
25         fw.flush();//使用字符流必须要对缓存进行刷新才能向文件中写入内容
26         fw.close();//调用close()函数时自动对缓存进行刷新
27         //注意,OutputStream中还有append()方法可以对文件内容进行追加输出,详见Java API。
28         
29         FileReader fr = new FileReader(f);
30         int b=0,num=0;
31         while((b = fr.read())!= -1){
32             System.out.print((char)b );
33             num++;
34         }
35         System.out.println("输出了"+num+"个字符!");
36     }
37 
38 }

 

 

    3.2 字符缓冲流

        带有缓冲区的,缓冲区(Buffer)就是内存里面的一小块区域,读写数据时都是先把数据放到这块缓冲区域里面,最后对缓冲区内容统一操作,减少io对硬盘的访问次数,保护我们的硬盘。

         -BufferedWriter bw = new BufferedWriteer(fw);

         -BufferedReader br = new BufferedReader(fr);

 1 import java.io.BufferedReader;
 2 import java.io.BufferedWriter;
 3 import java.io.File;
 4 import java.io.FileReader;
 5 import java.io.FileWriter;
 6 
 7 public class Buffertry {
 8 
 9     public static void main(String args[]){
10         
11         try{
12             File f=new File("f:\\a.txt");
13             if(f.exists()){
14                 System.out.println("文件存在");
15             }else{
16                 f.createNewFile();//用于创建文件
17                 //f.setReadOnly();
18                 System.out.println(f.getName()+"文件是否可读:"+f.canRead());
19                 System.out.println(f.getName()+"文件是否可写:"+f.canWrite());
20             }
21             
22             BufferedWriter bw = new BufferedWriter(new FileWriter(f));
23             String s = null;
24             for(int i=0;i<100;i++){
25                 s = String.valueOf(Math.random());//“Math.random()”将会生成一系列介于0~1之间的随机数。 
26                 bw.write(s);
27                 bw.newLine();//调用newLine()方法使得每写入一个随机数就换行显示
28             }
29             bw.flush();//调用flush()方法清空缓冲区
30             
31         BufferedReader br = new BufferedReader(new FileReader(f));
32             while((s = br.readLine())!=null){
33                 //使用BufferedReader处理流里面提供String readLine()方法读取文件中的数据时是一行一行读取的
34                 System.out.println(s);
35             }
36         bw.close();
37         br.close();
38         }catch(Exception e){
39             e.printStackTrace();
40         }
41     }
42 }

 

    3.3、转换流

        字节输入流转换为字符输入流:InputStreamReader是字节流转化为字符流的桥梁,它将字节去出并且按照指定方式解码为字符,构造方法为

            InputStreamReader(InputStream in);//详见Java API

        字节输出流转换为字符输出流:OutputStreamWriter继承自Writer,可以将指定写入流中的字符编码为字节

            OutputStreamWriter(OutputStream out);//详见Java API

 

 1 import java.io.BufferedReader;
 2 import java.io.IOException;
 3 import java.io.InputStreamReader;
 4 
 5 public class changetry {
 6     
 7     public static void main(String[] args) throws IOException{
 8         
 9         InputStreamReader isr=new InputStreamReader(System.in);
10         BufferedReader br = new BufferedReader(isr);
11         System.out.println("请输入:");
12         String str=br.readLine();
13         System.out.println("输入内容:"+str);
14         
15     }
16 
17 }

 

1         File f=new File("f:\\a.txt");
2         FileOutputStream fos = new FileOutputStream(f);  
3         OutputStreamWriter os = new OutputStreamWriter(fos);  
4         BufferedWriter bos = new BufferedWriter(os);  
5         bos.write("hahahaha");
6         bos.close();  
7         os.close();  
8         fos.close();  

 

posted @ 2016-03-09 17:42  桥er桑  阅读(492)  评论(0编辑  收藏  举报