import java.util.List;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.SocketTimeoutException;
import java.net.URL;
import java.util.ArrayList;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static final int sleepMsPerConnection = 1000;
public static final int timeOutMs = 20000;
public static final int retry = 2;
private static void download(String urlStr, String filePath) {
int retryCount = 0;
while(true){
try {
DownloadThread thread = new DownloadThread(urlStr, filePath);
thread.start();
thread.join(timeOutMs);
if(!thread.isAlive()){
return;
}else{
thread.interrupt();//实测并不能结束线程,请参考如何中断JAVA线程一文
}
} catch (InterruptedException e) {
e.printStackTrace();
}
retryCount++;
if(retryCount > retry){
throw new RuntimeException("still timeout after retry " + (retry - 1) + " times");
}
System.out.println("retry");
}
}
private static String getHtml(String urlStr) {
int retryCount = 0;
while(true){
try {
GetHtmlThread thread = new GetHtmlThread(urlStr);
thread.start();
thread.join(timeOutMs);
if(!thread.isAlive()){
return thread.html;
}else{
thread.interrupt();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
retryCount++;
if(retryCount > retry){
throw new RuntimeException("still timeout after retry " + (retry - 1) + " times");
}
System.out.println("retry");
}
}
}
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
public class GetHtmlThread extends Thread {
public String html;
private String urlStr;
public GetHtmlThread(String urlStr) {
this.urlStr = urlStr;
}
public void run() {
try {
Thread.sleep(Main.sleepMsPerConnection);
URL url = new URL(urlStr);
StringBuilder sb = new StringBuilder();
BufferedReader br = new BufferedReader(new InputStreamReader(url
.openStream()));
String line = null;
while ((line = br.readLine()) != null) {
sb.append(line);
sb.append('\n');
}
br.close();
this.html = sb.toString();
} catch (InterruptedException e) {
// do nothing?
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
}
}
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
public class DownloadThread extends Thread {
private String urlStr;
private String filePath;
public DownloadThread(String urlStr, String filePath) {
this.urlStr = urlStr;
this.filePath = filePath;
}
public void run() {
try {
URL url = new URL(urlStr);
InputStream is = url.openStream();
File pdfFile = new File(filePath);
FileOutputStream os = new FileOutputStream(pdfFile);
copyStream(is, os);
is.close();
os.close();
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
}
/**
* still need to close inputstream and outputstream after call this method
* @param inputStream
* @param outputStream
* @throws IOException
*/
private void copyStream(InputStream inputStream, OutputStream outputStream)
throws IOException {
byte[] b = new byte[1024];
int len;
while ((len = inputStream.read(b)) > 0) {
outputStream.write(b, 0, len);
}
outputStream.flush();
}
}