zoukankan      html  css  js  c++  java
  • java网络编程时中inputStream与outputStream

    1. 网络I/O输入输出流简介

    Socket套接字在完整的传输过程中的位置:

    java中TCP套接字的基本输入输出都为流对象,在TCP客户端和服务端,每个Socket都有一个InputStream和一个OutputStream。

    OutputStream类

    abstract void write(int data)//向输入流传输一个字节
    void write(byte[] data)//传输一个字节数组
    void write(byte[] data,int offset,int length)//从一个数组的偏移量offset开始,输出长度为length的字节
    void flush()//将缓存中的所有数据推送到输出流
    void close()//关闭流
    

    inputstream类

    abstract int read();//从流中读取一个字节的数据
    int read(byte[] data);//从输入流中获取长度为data.length的字节序列,返回值是实际的字节数
    int read(byte[] data,int offset,int length)//从一个数组的偏移量offset开始,输出长度为length的字节,返回成功读取的字节数
    int available();//返回当前可读字节的总数
    void close();//关闭流
    

    2. 网络中使用I/O流读取字节数据的方法(输入输出都为字节):

    1. 在网络编程中,要读取多个字节时,使用到InputStream.available()方法,由于网络通信往往是间断的,所以不可以使用一次InputStream.available()来判断输入流中的字节为多少个,所以应该进行判断。(有时候无法读出,可能是方法的原因,available()方法应该谨慎使用。)

      int count = 0;
      while (count == 0) {
              count = inputStream.available();
          }
      byte[] bytes = new byte[inputStream.available()];
      System.out.println(Arrays.toString(bytes));
      inputStream.read(bytes);
      System.out.println(new String(bytes));
      
    2. 方法二,使用缓冲流

          InputStream inputStream = request.getInputStream();
          Reader reader =  new InputStreamReader(inputStream);
          BufferedReader bufferedReader = new BufferedReader(reader);
          String str = "";
          while((str = bufferedReader.readLine())!=null){
              System.out.println(str);
          }
          System.out.println(bufferedReader.readLine());
      
    3. 方法三,使用read(byte[] data,int offset,int length),这个方法 并不保证能读取这么多个字节,它只能保证最多读取这么多个字节

      int lengthLong = (int) request.getContentLengthLong();//获取字节大小
      byte[] bytes = new byte[lengthLong];
      int total = 0;
      int once = 0;
      while ((total < lengthLong) && (once >=0)) {
              once = inputStream.read(bytes,total,lengthLong);
              total += once;
      }
      System.out.println(new String(bytes));
      
      • int的数值范围是4字节 4*8 = 32 bit -232~231 (-2147483648 ~ 2147483647)
      • long的数值范围是8字节 8*8 = 64 bit -264~263 (-18446744073709551616 ~ 18446744073709551615)
  • 相关阅读:
    POJ
    POJ
    hdu 1569 &1565 (二分图带权最大独立集
    ZOJ
    POJ
    python-socket作业
    ACM-ICPC 2018 焦作赛区网络预赛 F. Modular Production Line (区间K覆盖-最小费用流)
    ACM-ICPC 2018 焦作赛区网络预赛 E. Jiu Yuan Wants to Eat (树链剖分-线性变换线段树)
    POJ 2987
    ACM-ICPC 2018 南京赛区网络预赛 G. Lpl and Energy-saving Lamps (弱线段树)
  • 原文地址:https://www.cnblogs.com/innndown/p/12404037.html
Copyright © 2011-2022 走看看