• 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();
            }
             
        }
       }

  • 相关阅读:
    GitHub访问不了怎么办?——改hosts
    使用Docker运行MySQL8.0.28镜像
    重学前端(4) 浏览器是如何工作的(1)
    重学前端(3) JavaScript类型
    Django程序在Linux上的部署
    drf(三)—权限控制
    drf(二)——认证
    django 模板与定制admin
    drf(一)—restful规范
    drf 前戏—CBV的使用及源码流程
  • 原文地址:https://www.cnblogs.com/snzd9958/p/9594086.html
Copyright © 2020-2023  润新知