HttpurLConnection на андроид скачать в диапазонах
При попытке загрузить простой текстовый файл с использованием HttpURLConnection из двух частей я столкнулся с проблемой.
Код:
public class MainActivity extends AppCompatActivity {
final String TAG = "MainActivity";
int file_size;
String urlstring = "http://www.answersthatwork.com/Download_Area/Fun_Page/the_jack_schitt_story.txt";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
TextView tv = (TextView) findViewById(R.id.tv);
ProgressBar pb1 = (ProgressBar) findViewById(R.id.progressBar);
ProgressBar pb2 = (ProgressBar) findViewById(R.id.progressBar2);
pb1.setMax(file_size/2);
pb2.setMax(file_size - (file_size/2));
try {
URL url1 = new URL(urlstring);
URL url2 = new URL(urlstring);
HttpURLConnection dlc1 = (HttpURLConnection) url1.openConnection();
HttpURLConnection dlc2 = (HttpURLConnection) url2.openConnection();
dlc1.setRequestProperty("Range", "bytes=0-" + file_size/2);
dlc2.setRequestProperty("Range", "bytes=" + ((file_size/2) + 1) + "-" + (file_size));
int downloaded1 = 0, downloaded2 = 0;
File wallpaperDirectory = new File("/sdcard/windows/BstSharedFolder");
wallpaperDirectory.mkdirs();
File filepath = new File(wallpaperDirectory, "file.txt");
dlc1.connect();
BufferedInputStream dlc1in = new BufferedInputStream(dlc1.getInputStream());
FileOutputStream fos1= new FileOutputStream(filepath);
BufferedOutputStream bout1 = new BufferedOutputStream(fos1, 1024);
byte[] data1 = new byte[1024];
int x1 = 0;
while ((x1 = dlc1in.read(data1)) != -1) {
bout1.write(data1, 0, x1);
downloaded1 += x1;
pb1.setProgress(downloaded1);
}
bout1.flush();
bout1.close();
dlc1.disconnect();
dlc2.connect();
BufferedInputStream dlc2in = new BufferedInputStream(dlc2.getInputStream());
FileOutputStream fos2= new FileOutputStream(filepath,true);
BufferedOutputStream bout2 = new BufferedOutputStream(fos2, 1024);
byte[] data2 = new byte[1024];
int x2 = 0;
while ((x2 = dlc2in.read(data2)) != -1) {
bout2.write(data2, 0, x2);
downloaded2 += x2;
pb2.setProgress(downloaded2);
}
bout2.flush();
bout2.close();
dlc2.disconnect();
}
catch (Exception e) {
Log.v(TAG, e.toString());
}
}
});
}
Теперь, при запуске этого, файл загружается. Первая половина файла - это ожидаемый текст файла. У второй части файла есть немного текста второй части в начале, сопровождаемого текстом первой части снова.
Однако, если я закомментирую фрагмент кода, который загружает первую часть, файл будет содержать вторую часть без проблем.
Изменить: (добавив больше деталей к вопросу)
Код, который я написал, должен был загрузить текстовый файл двумя частями с двумя отдельными подключениями. Первое соединение загрузит первую половину файла и запишет его в файл. Второе соединение - загрузить вторую часть файла и добавить ее в тот же файл.
Если я закомментирую следующее, которое должно быть "загрузчиком первой части", остальная часть кода загрузит и запишет вторую часть файла, как и ожидалось.
dlc1.connect();
BufferedInputStream dlc1in = new BufferedInputStream(dlc1.getInputStream());
FileOutputStream fos1= new FileOutputStream(filepath);
BufferedOutputStream bout1 = new BufferedOutputStream(fos1, 1024);
byte[] data1 = new byte[1024];
int x1 = 0;
while ((x1 = dlc1in.read(data1)) != -1) {
bout1.write(data1, 0, x1);
downloaded1 += x1;
pb1.setProgress(downloaded1);
}
bout1.flush();
bout1.close();
dlc1.disconnect();
Но весь код, как он есть, заменит первую часть дважды.