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();//关闭流
在网络编程中,要读取多个字节时,使用到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));
java网络编程时中inputStream与outputStream
原文:https://www.cnblogs.com/innndown/p/12404037.html