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();

Но весь код, как он есть, заменит первую часть дважды.

0 ответов

Другие вопросы по тегам