IO流:System.in、SequenceInputStream合并流、内存输入输出流、数据流

1、System.in
   System.out 是常用的在控制台输出数据的 
   System.in 可以从控制台输入数据
   
   InputStream is = System.in
   while (true) {
      // 敲入a,然后敲回车可以看到
      // 97 13 10
      // 97是a的ASCII码
      // 13 10分别对应回车换行
      int i = is.read();
      System.out.println(i);
  
   字节输入流转化为字符输入流:
   InputStream is =System.in;
   InputStreamReader isr = new InputStreamReader(is);
   BufferedReader br = new BufferedReader(isr);

2、SequenceInputStream合并流

   SequenceInputStream(Enumeration<? extends InputStream> e) //整合多个输入流
   SequenceInputStream(InputStream s1, InputStream s2) //整合2个输入流

   整合2个输入流

   public class Test03 {

    public static void main(String[] args) throws IOException {
        FileInputStream fis01 = new FileInputStream("d:\text\st01.txt");
        FileInputStream fis02 = new FileInputStream("d:\text\st02.txt");
        FileInputStream fis03 = new FileInputStream("d:\text\st03.txt");

        //SequenceInputStream合并流,将与之相连接的流集组合成一个输入流,并从第一个输入流开始读取
        SequenceInputStream sis = new SequenceInputStream(fis01, fis02);

        BufferedInputStream bis = new BufferedInputStream(sis);
        byte[] b = new byte[1024];
        int n = 0;
        while((n = bis.read(b))!=-1) {
            String s = new String (b,0,n);
            System.out.println(s);
        }
    }
   }

   整合多个输入流
   
   public class Test03 {

    public static void main(String[] args) throws IOException {
        FileInputStream fis01 = new FileInputStream("d:\text\st01.txt");
        FileInputStream fis02 = new FileInputStream("d:\text\st02.txt");
        FileInputStream fis03 = new FileInputStream("d:\text\st03.txt");
        
        Vector<InputStream> vt = new Vector<InputStream>();
        vt.add(fis03);vt.add(fis02);vt.add(fis01);
        //通过vector的elements方法,得到关于多个流的枚举
        Enumeration<InputStream> en = vt.elements();

         SequenceInputStream sis = new SequenceInputStream(en);

         BufferedInputStream bis = new BufferedInputStream(sis);
        byte[] b = new byte[1024];
        int n = 0;
        while((n = bis.read(b))!=-1) {
            String s = new String (b,0,n);
            System.out.println(s);
        }
    }
   }

3、内存输出流ByteArrayOutputStream、内存输入流ByteArrayInputStream

   ①ByteArrayInputStream:

   包含一个内部缓冲区,其中包含可以从流中读取的字节,内部计数器跟踪由read方法提供的下一个字节
   关闭一个ByteArrayInputStream没有任何效果,该流中的方法可以在流关闭后调用,而不生成IOException 
   意思就是说,比如文件流的处理对象的外存中的文件,而它的处理对象是内存中的缓冲区。它是从一个内存读到另一个内存方式。

   构造方法:
   ByteArrayInputStream(byte[] buf);
  创建一个ByteArrayInputStream实例,使用字节数组buf作为其缓冲区数组。

  ByteArrayInputStream(byte[] buf,int offset,int length);
  创建一个ByteArrayInputStream实例,使用字节数组buf从offset开始的len个字节作为其缓冲区数组。

   主要方法:
  - int available(): 输入流中可读取的字节个数
  - void close(): 关闭此输入流并释放与该流有关的系统资源.
  - void mark(int readlimit): 在此输入流中标记当前的位置.
  - boolean markSupported(): 检测此输入流是否支持mark和reset.
  - int read(): 从输入流中读取下一个字节数据.
  - int read(byte[] b,int off,int len): 从输入流中读取len个字节,并将其存储在字节数组b中off位置开始的地方
  - void reset(): 将此流重新定位到最后一次对此输入流调用mark方法时的位置.
  - long skip(long n): 跳过和丢弃此输入流中n个字节的数据.

   ②ByteArrayOutputStream :
   
   现了一个输出流,其中的数据被写入一个byte数组。缓冲区会随着数据的不断写入而自动增长。
   缓冲区会随着数据的不断写入而自动增长。可以使用toByteArray()和toString()方法来获取数据
   关闭ByteArrayOutputStream无效,此类中的方法在关闭此流后仍可被调用,而不会产生IOException
   
   构造方法:
  ByteArrayOutputStream(): 创建一个新的byte数组输出流。

  ByteArrayOutputStream(int size): 创建一个新的byte数组输出流,它具有指定大小的缓冲区容量(以字节为单位)。

   主要方法:
  - void close(): 无效
  - void reset(): 
  - int size(): 返回缓冲区的当前大小/返回输出流中字节个数
  - byte[] toByteArray(): 将输出流中的字节数据以字节数组的形式返回
  - String toString():将输出流中的字节数据转换成字符串
  - String toString(String charsetName):
  - void write(byte[] b,int off,int len):将指定的字节数组b 从off位置开始的len个字节 写入到此输出流中
  - void write(int b):将指定的数据,写入到此输出流中(b = 97,则存入‘a’)
  - void writeTo(OutputStream out):将此 byte 数组输出流的 count(缓冲区中的有效字节数) 字段重置为零,从而丢弃输出流中目前已累积的所有输出

   public class Test01 {

    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("d:\test\test01.txt");
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        int n = 0;
        while((n = fis.read())!=-1) {
            bos.write(n);
        }

        String s = bos.toString();
        System.out.println(s);

        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
        byte [] b = new byte[1024];
        n = 0;
        while((n = bis.read(b))!=-1) {
            String ss = new String(b,0,n);
            System.out.println(ss);
        }
    }
   }


4、数据流
   
   DataInputStream 数据输入流 
   DataOutputStream 数据输出流

   DataOutputStream 在写出的时候会做一些特殊标记,只有DataInputStream 才能成功的读取
   所以DataInputStream 读取一个文件,这个文件必须是由DataOutputStream 写出的,否则会出现EOFException

   DataInputStream 与 DataOutputStream 分别继承自 InputStream、OutputStream, 它属于处理流,需要分别套接在 InputStream、OutputStream 类型的节点流上面
   DataOutputStream则能够直接将JAVA基本类型和String类型数据写入到其他的字节输入流。
   DataInputStream能以一种与机器无关(当前操作系统等)的方式,直接从地从字节输入流读取JAVA基本类型和String类型的数据
   读取数据的时候要按照写入的数据类型的顺序读取

   DataOutputStream方法:
   void flush()  清空此数据输出流。
   int size()  返回计数器 written 的当前值,即到目前为止写入此数据输出流的字节数。
   void write(byte[] b, int off, int len)  将指定 byte 数组中从偏移量 off 开始的 len 个字节写入基础输出流。
   void write(int b)  将指定字节(参数 b 的八个低位)写入基础输出流。
   void writeBoolean(boolean v)  将一个 boolean 值以 1-byte 值形式写入基础输出流。
   void writeByte(int v)  将一个 byte 值以 1-byte 值形式写出到基础输出流中。
   void writeBytes(String s)  将字符串按字节顺序写出到基础输出流中。
   void writeChar(int v)  将一个 char 值以 2-byte 值形式写入基础输出流中,先写入高字节。
   void writeChars(String s)  将字符串按字符顺序写入基础输出流。
   void writeDouble(double v)  使用 Double 类中的 doubleToLongBits 方法将 double 参数转换为一个 long 值,然后将该 long 值以 8-byte 值形式写入基础输出流中,先写入高字节。
   void writeFloat(float v)  使用 Float 类中的 floatToIntBits 方法将 float 参数转换为一个 int 值,然后将该 int 值以 4-byte 值形式写入基础输出流中,先写入高字节。
   void writeInt(int v)  将一个 int 值以 4-byte 值形式写入基础输出流中,先写入高字节。
   void writeLong(long v)  将一个 long 值以 8-byte 值形式写入基础输出流中,先写入高字节。
   void writeShort(int v)  将一个 short 值以 2-byte 值形式写入基础输出流中,先写入高字节。
   void writeUTF(String str)  以与机器无关方式使用 UTF-8 修改版编码将一个字符串写入基础输出流。

   public class TestStream {
      
    public static void main(String[] args) {
        write();
        read();
    }
 
    private static void read() {
        File f =new File("d:/lol.txt");
        try (
                FileInputStream fis  = new FileInputStream(f);
                DataInputStream dis =new DataInputStream(fis);
        ){
            boolean b= dis.readBoolean();
            int i = dis.readInt();
            String str = dis.readUTF();
             
            System.out.println("读取到布尔值:"+b);
            System.out.println("读取到整数:"+i);
            System.out.println("读取到字符串:"+str);
 
        } catch (IOException e) {
            e.printStackTrace();
        }
         
    }
 
    private static void write() {
        File f =new File("d:/lol.txt");
        try (
                FileOutputStream fos  = new FileOutputStream(f);
                DataOutputStream dos =new DataOutputStream(fos);
        ){
            dos.writeBoolean(true);
            dos.writeInt(300);
            dos.writeUTF("123 this is gareen");
        } catch (IOException e) {
            e.printStackTrace();
        }
         
    }
   }

原文地址:https://www.cnblogs.com/snzd9958/p/9594086.html