Java 网络编程中读取数据问题
已知数据长度为20字节,下面两种方法那一个比较可靠?方法一:
private byte[] readData(InputStream is) throws IOException{
try{
byte[] buff = new byte[20];
is.read(buff, 0, 20);
return buff;
}catch(Exception e){
}
throw new IOException();
}
方法二:
--------------------编程问答-------------------- 第一种更有效。是一次性就读取完了,第二种还有比较、判断、循环、相加等其它操作。
private static byte[] readData(InputStream is) throws IOException{
byte[] buff = new byte[20];
int totalSize = 0;
int readSize = 0;
while ((readSize = is.read(buff, totalSize, 20 - totalSize)) != -1) {
totalSize = totalSize + readSize;
if (totalSize == 20) {
return buff;
}
}
throw new IOException();
}
另外,你的异常为什么要这样抛? --------------------编程问答--------------------
我对流操作不是特别了解,我知道is.read(buff, 0, 20);如果buff没有写满20个字节,是不是还可从流里继续读。所以我想出了第二种方法。 --------------------编程问答--------------------
这个方法,使最多读20字节,不是刚好读20字节,实际上,可能读出来的字节数使0到20的任意数目.
所以,需哟判断到底读出了多少个字节,然后不停的循环.
方法2效率较差 --------------------编程问答--------------------
方法2时正解,我没有仔细看,我以为方法2时一个字节一个字节的读 --------------------编程问答-------------------- 谢谢~ --------------------编程问答-------------------- 第一个方法好,软件工程的概念,高内聚低耦合,模块之间数据传递越少越好;
以此类推,程序与网络与数据库数据传递次数尽量减少; --------------------编程问答-------------------- 试试这个,最多只需要一次。
private byte[] readData(InputStream is) throws IOException{
int maxLen = 20;
byte[] result = new byte[maxLen];
byte[] buff = new byte[maxLen];
try{
int len = is.read(buff, 0, maxLen);
if(len == maxLen){
return buff;
}
//已经读取的长度
int readLen = 0;
while(len>-1){
if(readLen+len>maxLen){
len = maxLen-readLen;
}
System.arraycopy(buff, 0, result, readLen, len);
readLen+=len;
if(readLen>=maxLen){
break;
}else{
len = is.read(buff, 0, maxLen);
}
}
}finally{
buff = null;
}
return buff;
} --------------------编程问答-------------------- 方法二好。 --------------------编程问答--------------------
第一个方法不能满足需求,有可能读不到20字节,所以不能用 --------------------编程问答-------------------- 方法二比较可靠
补充:Java , Java SE