public void readDataFile(HttpServletResponse response){
URL url = null;
URLConnection http = null;
InputStream is = null;
ServletOutputStream outputStream = null;
try {
url = new URL(path);
http = url.openConnection();
// 通用设置
// http.setRequestProperty("Content-Type", "application/json;");
http.setRequestProperty("accept", "*/*");
http.setRequestProperty("connection", "Keep-Alive");
http.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
// POST请求需要开启
http.setDoOutput(true);
http.setDoInput(true);
//连接超时30秒
System.setProperty("sun.net.client.defaultConnectTimeout", "30000");
//读取超时30秒
System.setProperty("sun.net.client.defaultReadTimeout", "30000");
http.connect();
// 获取输入流
is = http.getInputStream();
// 获取输出流
outputStream = response.getOutputStream();
// 处理InputStream文件读取乱码(UTF-8)
InputStreamReader inputStreamReader
= new InputStreamReader(is,StandardCharsets.UTF_8);
// 使用BufferedReader来处理inputStreamReader.read(...)读取慢的问题
BufferedReader reader =new BufferedReader(inputStreamReader);
while (reader.ready()){
String s = reader.readLine();
outputStream.write(s.getBytes());
outputStream.flush();
}
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (is != null) {
is.close();
}
if (os != null) {
os.flush();
os.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
刚开始是直接使用InputStreamReader的缓冲区来读文件的(将缓冲来自指定文件的输入。如果没有缓冲,每次调用 read() 或 readLine() 都可能导致从文件中读取字节,转换为字符,然后返回,这可能非常低效)
int len=0;
// 缓冲区是12字节
char[] bytes=new char[1024];
while((len=inputStreamReader.read(bytes))!=-1){
String s = new String(bytes, 0, len);
// 输出
outputStream.write(s.getBytes());
outputStream.flush();
}