zoukankan      html  css  js  c++  java
  • 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();  
  • 相关阅读:
    HDU 5486 Difference of Clustering 图论
    HDU 5481 Desiderium 动态规划
    hdu 5480 Conturbatio 线段树 单点更新,区间查询最小值
    HDU 5478 Can you find it 随机化 数学
    HDU 5477 A Sweet Journey 水题
    HDU 5476 Explore Track of Point 数学平几
    HDU 5475 An easy problem 线段树
    ZOJ 3829 Known Notation 贪心
    ZOJ 3827 Information Entropy 水题
    zoj 3823 Excavator Contest 构造
  • 原文地址:https://www.cnblogs.com/z-belief/p/5259036.html
Copyright © 2011-2022 走看看