java读取流数据时,字节缓存数组,第一次读取时,是否读满,才进行下次读取??
使用缓存字节数组读取java字节流时,第一次读取是,读满缓存字节数组大小,才进行下次读取,还是随机读一个小于数组大小的值,再进行下次读取???
读取本地文件时,首次读取读满整个字节数组,在进行下次读取。
package com.lyf.test;import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import org.junit.Test;
public class ReadFile {
@Test
public void readTxt() {
InputStream is = null;
String path = this.getClass().getClassLoader().getResource("abc.txt")
.getPath();
System.out.println(path);
String content = "";
String loopContentString ="";
try {
is = new FileInputStream(path);
byte buff[] = new byte[16];
int len = is.read(buff);
content = new String(buff, 0, len);
System.out.println(len);
while (len != -1) {
len = is.read(buff);
System.out.println(len);
if(len != -1){
content += new String(buff,0,len);
}
}
System.out.println(content);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
结果:其中abc.txt 大小就26个字节
读取远程数据接口数据流时,
String queryUrl = "https://www.kuaidi100.com/chaxun?com=yuantong&nu=887240223128139035";
try { URL url = new URL(queryUrl);
URLConnection con = url.openConnection();
con.setAllowUserInteraction(false);
urlStream= url.openStream();
String type = con.guessContentTypeFromStream(urlStream);
String charSet = null;
if (type == null){
type = con.getContentType();
}
if (type == null || type.trim().length() == 0
|| type.trim().indexOf("text/html") < 0){
return;
}
if (type.indexOf("charset=") > 0){
charSet = type.substring(type.indexOf("charset=") + 8);
}
byte b[] = new byte[100];
int numRead = urlStream.read(b);
String content = new String(b, 0, numRead);
System.out.println("b中的内容用ascii表示,第3个字符的码是="+b[2]+"||第一次:"+numRead+"||"+content);
int i = 0;
while (numRead != -1) {
numRead = urlStream.read(b);
if (numRead != -1) {
i++;
// String newContent = new String(b, 0, numRead);
String newContent = new String(b, 0, numRead, charSet);
System.out.println("第"+i+"次:"+numRead+"||"+newContent);
content += newContent;
}
}
System.out.println(content);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
urlStream.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
读取结果:远程数据流的大小2032个字节
第一次读取只读了,27个字节,
问题:为啥读取本地文件和远程数据的首次读取不同,是网络问题,还是java中read函数的限制??
纳闷............
回答:
read
方法的定义是读取流中的字节,如果流中有字节,并且字节数组也是有空间的话,那么就将其读取道整个字节数组中,出现这个情况的原因,我只能说是 stream
中的数据暂时就这么多. 就只有 27
个字节,多的还在路上.
从这个方面去想的话,我觉得的网络方面的原因,可能是这样导致流尚未完全传送完.
而后我换了一下几个url进行尝试都是可以的正常读取的.
http://114.67.130.61/
https://api.github.com/users/chenshun00
baidu
全部显示是可以正常读取的.
其次我打开你给的URL看了一下,发送了 65 个请求, 157 KB,耗时了 2.12 s.
以上属于跟人猜测.
以上是 java读取流数据时,字节缓存数组,第一次读取时,是否读满,才进行下次读取?? 的全部内容, 来源链接: utcz.com/p/179798.html