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流读取字节数据的方法(输入输出都为字节):
-
在网络编程中,要读取多个字节时,使用到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));
-
方法二,使用缓冲流
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());
-
方法三,使用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)