package me.qixingchen.mdbilibili.network;
import android.text.TextUtils;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import me.qixingchen.mdbilibili.app.BilibiliApplication;
import me.qixingchen.mdbilibili.utils.StorageUtil;
import rx.Observable;
import rx.Subscriber;
import rx.schedulers.Schedulers;
/**
* Created by Yulan on 2015/6/12.
* 下载弹幕 XML
* 但是目前下载的 XML 连长度都不对。。
* vsv:添加一点回调
*/
public class DownloadXML {
private final static String TAG = DownloadXML.class.getSimpleName();
public Observable<File> downloadXML(final String uriString) {
return Observable.create(new Observable.OnSubscribe<File>() {
@Override
public void call(Subscriber<? super File> subscriber) {
String errorMessage = "";
URL url = null;
String filename = null;
BufferedInputStream inputStream = null;
BufferedOutputStream outputStream = null;
FileOutputStream fileStream = null;
URLConnection connection = null;
File file = null;
final int DOWNLOAD_BUFFER_SIZE = 1024;
try {
url = new URL(uriString);
connection = url.openConnection();
connection.setUseCaches(false);
if (StorageUtil.isExternalStorageAvailable()) {
filename = uriString.substring(uriString.lastIndexOf('=') + 1) + ".xml";
file = new File(BilibiliApplication.
getApplication().getExternalFilesDir("danmaku"), filename);
if (file.exists()) {
file.delete();
}
inputStream = new BufferedInputStream(connection.getInputStream());
fileStream = new FileOutputStream(file);
outputStream = new BufferedOutputStream(fileStream, DOWNLOAD_BUFFER_SIZE);
byte[] data = new byte[DOWNLOAD_BUFFER_SIZE];
int bytesRead = 0;
while ((bytesRead = inputStream.read(data, 0, data.length)) >= 0) {
outputStream.write(data, 0, bytesRead);
}
}
} catch (IOException e) {
e.printStackTrace();
errorMessage = e.getMessage();
} finally {
try {
if (outputStream != null)
outputStream.close();
if (inputStream != null)
inputStream.close();
if (fileStream != null)
fileStream.close();
} catch (IOException ignored) {
}
}
if (TextUtils.isEmpty(errorMessage)) {
subscriber.onNext(file);
} else {
subscriber.onError(new Exception(errorMessage));
}
}
}).subscribeOn(Schedulers.io());
}
}