我涉及到的项目中场景是这样的:要把脑电数据(txt文件)从阿里云oss中解析成json,为了不产生文件冗余,就不下载了。
我之前对输入流输出流什么的,用的不多,不太熟悉。所以这次写完记录一下。网上查了有下载的代码,有解析的代码,就是没有直接读取,不下载的代码。其实就是用connection连接,获得输入流,再用循环的方式读取。
public class Jxtxt {
public static void main(String[] args) {
//文件下载
String photoUrl="你的txt的网络地址";
String result= saveUrlAs(photoUrl, "GET");
System.out.println(result);
}
public static String saveUrlAs(String url,String method){
String result;
StringBuffer resultBuffer=new StringBuffer();
HttpURLConnection conn = null;
InputStream inputStream = null;
try
{
// 建立链接
URL httpUrl=new URL(url);
conn=(HttpURLConnection) httpUrl.openConnection();
//以Post方式提交表单,默认get方式
conn.setRequestMethod(method);
conn.setDoInput(true);
conn.setDoOutput(true);
// post方式不能使用缓存
conn.setUseCaches(false);
//连接指定的资源
conn.connect();
//获取网络输入流
inputStream=conn.getInputStream();
BufferedInputStream bis = new BufferedInputStream(inputStream);
//设定每次读取的字节大小
byte[] buf = new byte[4096];
//计算按字节大小读取需要的行数
int length = bis.read(buf);
//while循环读取存入resultBuffer
while(length != -1)
{
String str = new String(buf, 0, length);
resultBuffer.append(str);
}
//依次关闭资源
bis.close();
inputStream.close();
conn.disconnect();
} catch (Exception e)
{
e.printStackTrace();
}
result=resultBuffer.toString();
return result;
}
}
可惜的是,这个东西没用上,因为脑电数据11k左右,太大了。不合适。
之前没了解,今天看源码才了解这里的byte干什么用的。。。。惭愧。
关于为什么用BufferInputStream,这里有一个标准的答案。
InputStream:每次从硬盘读入一个字到中转站, 再写入目的文件(硬盘)
BufferStream:一次读入n个字节到输入缓冲区,接着经中转站一个个写入到输出缓冲区,输入缓冲区为空时再次从硬盘读入批量数据,同理输出缓冲区满了以后再批量写入到目的文件(硬盘)。(https://blog.csdn.net/weixin_42130471/article/details/82914013 原文有错别字)