java网络编程时中inputStream与outputStream 1. 网络I/O输入输出流简介 2. 网络中使用I/O流读取字节数据的方法(输入输出都为字节):

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

java网络编程时中inputStream与outputStream
1. 网络I/O输入输出流简介
2. 网络中使用I/O流读取字节数据的方法(输入输出都为字节):

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

java网络编程时中inputStream与outputStream
1. 网络I/O输入输出流简介
2. 网络中使用I/O流读取字节数据的方法(输入输出都为字节):

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)