zoukankan      html  css  js  c++  java
  • Java 流

      听到流这个词,我想很多人都会想到溪流,夏天的时候溪流清澈,蔚蓝的天空,一阵阵轻风吹过伴随着淙淙的流水声。但在编程里流的定义可没有这么美好,里面说流是一串连续不断的数据的集合。是不是一下子打断你美好的想像。

      流分为很多种,例如有文件流、缓冲流、数据流。但不管是什么样的流,他们的本质还是流。 有很多人都这么比喻过,流就像水管里的水流,数据从一端流向另一端。文件流,数据流……。就好像不同的管子,有的管子是用来装文件的,有的管子是用来装数据的,也有的管子是套在另一个管子之上的,例如缓冲流。

      Java.IO包中定义了很多类型的流。按数据流的方向不同可以分为输入流和输出流,按处理数据单位的不同可以分类字节流和字符流。按照功能不同可以分为节点流和处理流。

     

      字节流 字符流
    输入流 InputStream Reader
    输出流 OutputStream Writer

     一、字节流

      继承自InputStream的流都是输入流,继承自OutputStream的都是输出流,且他们的数据单位为字节(8bit,如下图:

      FileInputStream Example

    View Code
      import java.io.FileInputStream;
      
      public class vvv {
          public static void main(String[] args) throws Exception {
              FileInputStream fis = new FileInputStream("c:\\data1.txt");
              int b = 0;
              long num = 0;
              while ((b = fis.read()) != -1) {
                  System.out.print((char) b);
                  num++;
              }
              fis.close();
              System.out.println("\n共读取了" + num + "个字节的字符\n");
          }
      }

      FileOutputStream Example

    View Code
      import java.io.FileInputStream;
      import java.io.FileOutputStream;
      
      public class vvv {
          public static void main(String[] args) throws Exception {
              FileInputStream fis = new FileInputStream("c:\\data1.txt");
              FileOutputStream fos = new FileOutputStream("c:\\data2.txt");
              int b = 0;
              while ((b = fis.read()) != -1) {
                  fos.write(b);
              }
              fis.close();
              fos.close();
              System.out.println("执行完毕");
          }
      }

     二、字符流

      继承自Reader的流都是输入流,继承自Writer的都是输出流,且他们的数据单位为字符(16bit,如下图

    Reader  Writer

     

        FileWriter Example

    View Code
      import java.io.FileReader;
      
      public class vvv {
          public static void main(String[] args) throws Exception {
              FileReader fr = new FileReader("c:\\data1.txt");
              int b =0;
              while((b=fr.read())!=-1){
                  System.out.print((char)b);
              }
          }
      }

      FileReader Example

      import java.io.FileReader;
      import java.io.FileWriter;
      
      public class vvv {
          public static void main(String[] args) throws Exception {
              FileReader fr = new FileReader("c:\\data1.txt");
              FileWriter fw = new FileWriter("c:\\data2.txt",true); //后面加一个参数true后,可以追加内容
              int b =0;
              while((b=fr.read())!=-1){
                  fw.write(b);
              }
              fr.close();
              fw.close();
              System.out.println("执行完毕!");
          }
      }

     三、缓冲流

      缓冲流要”嵌套”在相应的节点流之上,对读写的数据提供了缓冲的功能,提高了读写的效率,同时增加了一些新的之法。

      J2DK提供了四种缓冲流。缓冲输入流支持其父类的MARKRESET方法。
      
    BufferedReader提供了readLine方法用于读取一行字符串(\r\n分隔)
      
    BufferedWriter提供了newLine用于写入一个行分隔符
      
    对于输出的缓冲流,写出的数据会先在内存中缓存,使用flush方法将会使内存中的数据立刻写出。

      BufferReader Example

      import java.io.BufferedReader;
      import java.io.BufferedWriter;
      import java.io.FileReader;
      import java.io.FileWriter;
      
      public class vvv {
          public static void main(String[] args) throws Exception {
              FileReader fReader = new FileReader("c:\\data1.txt");
              BufferedReader br = new BufferedReader(fReader);
              FileWriter fWriter = new FileWriter("c:\\data2.txt");
              BufferedWriter bw = new BufferedWriter(fWriter);
              
              String s = null;
              while((s=br.readLine())!=null){
                  bw.write(s);
                  bw.newLine();//写完一行需要新起一行!
              }
              bw.flush();
              bw.close();
              br.close();
              System.out.println("执行完成!");
          }
      }

      

      四、转换流

      InputStreamReaderOutputStreamWriter用字节数据转换成字符数据。InputStreamReader需要和InputStream套接。OutputStreamWriter需要和OutputStream套接。

      Examlpe:

      import java.io.FileOutputStream;
      import java.io.OutputStreamWriter;
      
      public class vvv {
          public static void main(String[] args) throws Exception {
              //将字节流转换成字符流
              OutputStreamWriter osw = new OutputStreamWriter(
                      new FileOutputStream("c:\\data1.txt",true) //注意后面的true,往原内容进行追加
              );
              //System.out.println(osw.getEncoding());
              osw.write("Heelo OutputStreamWriter");
              osw.close();
          }
      }

      

      五、数据流

      DataInputStreamDataOutputStream分别继承自InputStreamOutputStream,它属于处理流。需要分别”嵌套”在InputStreamOutputStream类型的节点流上。DataInputStreamDataOutputStream提供了可以存取与机器无关的Java原始类型数据,例如int,double类型。DataInputStreamDataOutputStream的构造方法:                DataInputStream(InputStream in);
      DataOutputStream(OutputStream out);

      另外DataInputStream有readUTF, 而DataOutputStream有WriteUTF。这两个方法在网络编程TCP里非常好用。

      Example:

      import java.io.ByteArrayInputStream;
      import java.io.ByteArrayOutputStream;
      import java.io.DataInputStream;
      import java.io.DataOutputStream;
      
      
      public class vvv {
          public static void main(String[] args) throws Exception {
              ByteArrayOutputStream baos = new ByteArrayOutputStream();
              DataOutputStream dos = new DataOutputStream(baos);
              
              dos.writeDouble(0.6765451);
              dos.writeBoolean(true);
              
              //读取来
              ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
              DataInputStream dis = new DataInputStream(bais);
              System.out.println(dis.readDouble());
              System.out.println(dis.readBoolean());
      
          }
      }

      六、对象流

      可以将对象序列化到一个文件中,使用的时候可以取出来使用。所以对需要进行序列化的对象类需要实现接口Serializeable

      import java.io.FileInputStream;
      import java.io.FileOutputStream;
      import java.io.ObjectInputStream;
      import java.io.ObjectOutputStream;
      import java.io.Serializable;
      
      public class vvv {
      
          public static void main(String[] args) throws Exception {
              Goods good = new Goods("电脑",3012.1);
              
              //写出一个对象到C盘a.txt文件中
              FileOutputStream fileOut = new FileOutputStream("c:\\a.txt");
              ObjectOutputStream objectOut = new ObjectOutputStream(fileOut);
              objectOut.writeObject(good);
          
              //把对象输出出来
              FileInputStream fileInput = new FileInputStream("c:\\a.txt");
              ObjectInputStream objectInput =  new ObjectInputStream(fileInput);
              Goods good2 = (Goods) objectInput.readObject();
              System.out.println(good2.getName() + ":" + good2.getPrice());
              
          }
      }
      
      class Goods implements Serializable {
          public String getName() {
              return name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      
          public double getPrice() {
              return price;
          }
      
          public void setPrice(double price) {
              this.price = price;
          }
      
          String name = null;
          double price;
      
          Goods(String name, double price) {
              this.name = name;
              this.price = price;
          }
      }
  • 相关阅读:
    Asterisk 通道变量
    TS流 PS流 ES流
    VLC源码分析(二)
    H264 TS/ES
    Linux 下TCP连接关闭情况分析
    linux局域网内磁盘映射
    阻塞与非阻塞个人小结
    TCP的状态迁移图
    H.264 RTP payload 格式
    c#读取文件,重新建立文件,把读取的数据放入到文件中去
  • 原文地址:https://www.cnblogs.com/cxeye/p/2717250.html
Copyright © 2011-2022 走看看