Analisis prinsip
Selama pengembangan, fungsi "Breakpoint Continuous Transmission" sangat praktis dan umum, dan juga terdengar lebih "standar". Jadi kami biasanya tertarik mempelajari bagaimana fungsi ini diimplementasikan?
Di Java, Anda juga dapat menemukan banyak informasi tentang menerapkan fungsi serupa di internet. Namun, kebanyakan dari mereka memberikan demo dan memposting kode sumber. Ada sangat sedikit penjelasan terperinci untuk prinsip implementasinya.
Jadi ketika kami pertama kali berhubungan dengannya, kami mungkin langsung menggunakan kode CRTL + C/V dan kemudian mengotak -atiknya, tetapi kami akhirnya bisa mendapatkan efeknya. Tetapi melakukan ini ketika Anda pemula jelas baik dan buruk.
Keuntungannya adalah ada banyak kode sumber dan sedikit penjelasan; Jika kami bersedia bekerja keras, kami akan mencari informasi dan mempelajari hal -hal yang tidak kami pahami dalam kode yang diposting oleh orang lain. Pada akhirnya, Anda mungkin akan mendapatkan banyak hadiah.
Kerugiannya juga jelas: sebagai pemula, ketika menghadapi banyak kode sumber, rasanya seperti banyak hal yang tidak dikenal, jadi mudah untuk gentar. Bahkan jika Anda memiliki pemahaman kasar tentang penggunaan pada akhirnya, Anda mungkin tidak perlu memahami prinsip implementasi.
Hari ini, mari kita mulai dari perspektif paling dasar dan lihat apakah apa yang disebut "kelanjutan breakpoint" benar-benar "high-end".
Bahkan, ketika Anda bersentuhan dengan "benda" baru, Anda dapat mengubahnya menjadi sesuatu yang lebih kami kenal untuk merujuk dan membandingkan dan belajar. Biasanya itu akan dua kali lipat hasil dengan setengah usaha.
Jika kita hanya terpapar pada konsep "transmisi kontinu breakpoint", pasti akan sulit untuk menjelaskan dengan jelas satu, dua, dan tiga. Lalu, kami pasti akan terbiasa dengan "bermain game".
Oke, maka mari kita asumsikan kita sekarang memiliki "permainan RPG tingkat jernih". Pikirkan tentang apa yang biasanya kita lakukan saat memainkan permainan semacam ini?
Jelas bahwa pada hari pertama kami bertempur berdarah dan membunuh semua orang, dengan asumsi bahwa kami akhirnya tiba di tingkat keempat. Meskipun pertempuran sengit berjalan lancar, ketika saya melihat jam di dinding, sudah jam 12 pagi dan sudah waktunya tidur.
Itu sangat memalukan saat ini. Agar berhasil mengimbangi kemajuan permainan kami lain kali kami bermain, apa yang harus kami lakukan?
Ini sangat sederhana. Kami tidak mematikan permainan, kami pergi tidur, dan terus bermain pada hari berikutnya. Ini tidak apa -apa, tetapi tampaknya ada sesuatu yang membuat orang merasa tidak nyaman.
Jadi, saat ini, jika permainan memiliki fungsi yang disebut "save", itu akan sangat penting. Kami langsung memilih arsip, memasukkan nama arsip "level keempat", dan kemudian kami dapat menutup permainan.
Ketika kami memainkan permainan lain kali, kami akan secara langsung menemukan simpan "level keempat", lalu baca file, dan kemudian kami dapat terus memainkan game.
Pada saat ini, apa yang disebut "transmisi kontinu breakpoint" mudah dimengerti. Mari ikuti ide kami sebelumnya tentang "bermain game":
Misalkan ada file yang perlu kita unduh sekarang. Ketika kami mengunduh sebagian dari itu, suatu situasi terjadi, seperti: komputer macet, daya sudah keluar, jaringan terganggu, dll.
Bahkan, ini seperti ketika kami bermain game sebelumnya, kami tiba -tiba perlu pergi tidur dan beristirahat pada jam 12. Oke, maka situasinya saat ini adalah:
• Jika permainan tidak dapat disimpan, itu berarti bahwa pada saat kami bermain, kemajuan level 4 yang telah berlalu kali ini akan hilang dan kami tidak dapat mengikuti permainan.
• Sejalan dengan itu, jika perilaku "unduh" tidak dapat merekam kemajuan unduhan ini. Kemudian, ketika kami mengunduh file ini lagi, kami hanya dapat memulai dari awal.
Pada titik ini, kami sebenarnya telah menemukan bahwa kunci perilaku yang kami sebutkan di atas adalah kata " Lanjutkan "!
Untuk mencapai tujuan "melanjutkan" perilaku yang terputus, kuncinya adalah memiliki "media" yang dapat merekam dan membaca informasi node di mana perilaku tersebut memiliki "gangguan".
Berubah ke dunia pemrograman
Bahkan, ini adalah prinsip paling mendasar dari "Breakpoint Continuous Transmission". Dengan kata -kata sederhana, kita perlu merekam informasi lokasi interupsi ketika perilaku unduhan terganggu, dan kemudian membacanya dalam perilaku berikutnya.
Dengan informasi lokasi ini, pikirkan apa yang harus kita lakukan. Ya, ini sangat sederhana. Ketika perilaku unduhan baru dimulai, unduh konten langsung dari lokasi catatan ini, dan tidak lagi dimulai dari awal.
Yah, kita telah berbicara tentang prinsip begitu lama dalam bahasa sederhana dan mulai merasa bosan. Jadi mari kita ringkas di akhir dan kemudian lihat bagaimana kita harus mengubah prinsip -prinsip menjadi dunia pemrograman.
• Ketika "perilaku unggah (unduh)" terputus, kita perlu merekam lokasi (posisi) unggahan ini (unduh).
• Ketika perilaku "lanjutkan" dimulai, kami langsung melompat ke pos untuk terus mengunggah (mengunduh).
Jelas, kunci masalah terletak pada apa yang disebut "posisi". Dalam "permainan level level" yang kami sebutkan, "level apa" yang dapat digunakan sebagai unit posisi ini.
Jadi ketika kita beralih ke apa yang disebut "transmisi kontinu breakpoint", apa yang harus kita gunakan untuk mengukur "posisi"? Jelas, itu kembali ke biner karena esensi di sini tidak lebih dari membaca dan menulis file.
Maka sisa pekerjaannya sangat sederhana. Pertama, catat posisi, yang tampaknya tidak layak dibicarakan, karena itu hanya kegigihan data (memori, file, basis data), dan kami memiliki banyak cara.
Kunci lain adalah bahwa ketika perilaku "lanjutan" dimulai, kita perlu memulai operasi baca dan tulis dari posisi posisi yang kita rekam terakhir kali, jadi kita membutuhkan sesuatu yang mirip dengan fungsi "pointer".
Tentu saja, kami juga dapat menemukan cara untuk mengimplementasikan "pointer" seperti itu, tetapi senang bahwa Java telah memberi kami kelas seperti itu, yaitu, acak ACCOVECessFile.
Fungsi kelas ini secara intuitif tercermin dalam namanya, dan dapat mengakses file secara acak. Mari kita lihat deskripsi kelas ini dalam dokumentasi API:
Contoh dukungan kelas ini membaca dan menulis ke file yang diakses secara acak. Akses acak ke file berperilaku seperti array byte besar yang disimpan dalam sistem file.
Jika sebuah file diakses secara acak dalam mode baca/tulis, operasi output juga tersedia; Operasi output dimulai dengan pointer file dan memajukan pointer file saat byte ditulis.
Operasi output setelah menulis ke akhir saat ini dari array implisit menyebabkan array berkembang. Pointer file dapat dibaca melalui metode GetFilePointer dan mengatur metode pencarian.
Setelah membaca instruksi API, kami tertawa. Ya, bukankah ini yang kita inginkan? Nah, kami telah mempertajam pisau kami begitu lama, mengapa kami tidak memotong kayu?
Contoh demonstrasi
Karena itu untuk "kelanjutan breakpoint" dari file, jelas bahwa pertama -tama kita akan membuat file. Mungkin file audio, file gambar, dll. Akan terlihat sedikit lebih berkelas.
Tetapi kami telah mengatakan bahwa di mata saudara -saudara komputer besar, mereka pada akhirnya akan kembali ke "biner". Jadi kami akan membuat file "txt" sederhana di sini, karena txt lebih kondusif untuk dipahami.
Kami membuat file bernama "test.txt" di direktori root disk D. Konten file sangat sederhana, seperti yang ditunjukkan pada gambar:
Itu benar, yang kami ketik adalah 6 huruf bahasa Inggris sederhana. Lalu kami mengklik kanan → Properties:
Kami melihat bahwa file tersebut sekarang berukuran 6 byte. Inilah sebabnya kami mengatakan bahwa semuanya tidak dapat dipisahkan dari "biner".
Ya, kita semua mengerti karena kita memasukkan 6 surat bahasa Inggris, dan ruang penyimpanan yang ditempati 1 surat bahasa Inggris adalah 1 byte (mis. 8 bit).
Sejauh ini, apa yang telah kita lihat membosankan, karena ini pada dasarnya omong kosong, dan orang -orang dengan sedikit pengetahuan komputer mengetahui pengetahuan ini. Jangan khawatir, mari kita lanjutkan.
Mudah dibaca dan menulis file di java. Misalkan persyaratan saat ini adalah "Tulis file ini dari drive d ke drive e", maka kami akan mengangkat keyboard dan menyelesaikannya!
Tapi bukankah apa yang disebut "unggah (unduh)" dari file yang disebut? Satu -satunya perbedaan adalah bahwa perilaku berubah dari "hanya antara penduduk asli" menjadi "antara penduduk asli" menjadi "antara penduduk asli" membaca dan menulis.
Pada saat ini, kita akan berkata, "Berhenti mendesak, semua orang tahu hal -hal ini, bagaimana dengan 'Breakpoint Transmisi Berkelanjutan'?" Bahkan, sudah sangat sederhana di sini. Kami akan memperjelas lagi bahwa apa yang perlu kami lakukan dalam transmisi kontinu breakpoint adalah:
Jika ada gangguan pada perilaku baca dan tulis sebelumnya, silakan catat informasi lokasi konten file yang telah dibaca dan ditulis kali ini; Ketika "kelanjutan dimulai", langsung pindahkan pointer di sini dan mulailah melanjutkan operasi baca dan tulis.
Penekanan berulang pada prinsip sebenarnya karena selama prinsip dipahami, sisanya hanya bergerak. Ini seperti "sembilan sembilan kembali ke satu" dharma dalam novel seni bela diri, level tertinggi adalah kembali ke sumber aslinya.
Selama kita memahami prinsip hal yang kompleks, kita dapat menghapusnya dan menguranginya menjadi hal -hal sederhana. Demikian pula, serangkaian hal -hal sederhana, melalui kombinasi logis, membentuk hal -hal yang kompleks.
Selanjutnya, kita akan segera kembali ke Chaos dan mensimulasikan "Breakpoint Continuous Transmission" dalam bentuk paling dasar. Di sini kami bahkan tidak menulis kode server, dan kami hanya melakukannya melalui kelas tes lokal.
Efek yang ingin kami capai sangat sederhana: tulis file "test.txt" pada disk D ke disk E, tetapi kami akan mensimulasikan perilaku "interupsi" di tengah proses, dan kemudian terus mengunggah lagi untuk akhirnya menyelesaikan seluruh proses.
Dengan kata lain, kami akan menganggap "D drive" sebagai komputer di sini, dan secara langsung menganggap "E drive" sebagai server. Maka kita tidak akan lagi berkaitan dengan protokol HTTP selama setengah sen (tentu saja, kita masih harus melakukan dengan itu dalam pengembangan aktual), jadi kita hanya peduli dengan prinsip -prinsip paling mendasar dari "melanggar" dan "melanjutkan" untuk membaca dan menulis file.
Untuk memperdalam pemahaman kita melalui perbandingan, pertama -tama kita menulis kode yang normal, yaitu, membaca dan menulis secara normal tanpa gangguan:
tes kelas publik {public static void main (string [] args) {// sumber dan file target file sourceFile = file baru ("d:/", "test.txt"); File targetFile = file baru ("e:/", "test.txt"); // input dan output aliran fileInputStream fis = null; FileOutputStream fos = null; // byte buffer data [] buf = byte baru [1]; coba {fis = FileInputStream baru (SourceFile); fos = FileOutputStream baru (TargetFile); // Baca dan tulis data while (fis.read (buf)! = -1) {System.out.println ("Tulis data ..."); fos.write (buf); }} catch (FileNotFoundException e) {System.out.println ("File yang ditentukan tidak ada"); } catch (ioException e) {// todo: handle exception} akhirnya {coba {// tutup aliran input dan output if (fis! = null) fis.close (); if (fos! = null) fos.close (); } catch (ioException e) {e.printstacktrace (); }}}} Ketika kode ini dijalankan, kami akan menemukan bahwa salinan "test.txt" telah berhasil disalin dalam disk E. Kode ini sangat sederhana, satu -satunya hal untuk dikatakan adalah:
Kita melihat bahwa kita mengatur buf, yaitu, ukuran buffer adalah 1, yang sebenarnya berarti bahwa setiap kali kita membaca, kita membaca byte data (mis. 1 huruf bahasa Inggris).
Sekarang, mari kita simulasikan perilaku interupsi baca dan tulis. Kami akan menyempurnakan kode sebelumnya sebagai berikut:
impor java.io.file; import java.io.fileInputStream; impor java.io.filenotfoundException; import java.io.fileoutputStream; import java.io.ioException; import java.io.randomaccessfile; uji kelas publik {private static intition inter = -1; public static void main (string [] args) {// source dan file target sourceFile = file baru ("d:/", "test.txt"); File targetFile = file baru ("e:/", "test.txt"); // input dan output aliran fileInputStream fis = null; FileOutputStream fos = null; // byte buffer data [] buf = byte baru [1]; coba {fis = FileInputStream baru (SourceFile); fos = FileOutputStream baru (TargetFile); // data baca dan tulis while (fis.read (buf)! = -1) {fos.write (buf); // Ketika 3 byte konten file telah diunggah, jaringan mengganggu dan pengecualian dilemparkan jika (targetFile.length () == 3) {position = 3; Lempar FileAccessException baru (); }}} catch (FileAccessException e) {Keeping (SourceFile, TargetFile, Posisi); } catch (FileNotFoundException e) {System.out.println ("Tentukan file tidak ada"); } catch (ioException e) {// todo: handle exception} akhirnya {coba {// tutup aliran input dan output if (fis! = null) fis.close (); if (fos! = null) fos.close (); } catch (ioException e) {e.printstacktrace (); }}} private static void Keeping (sumber file, target file, posisi int) {coba {thread.sleep (10000); } catch (InterruptedException E) {// TODO Auto-Encanerated Catch Block E.PrintStackTrace (); } coba {randomAccessFile readFile = baru acakAccessFile (sumber, "rw"); RandomAccessFile writeFile = RandomAccessFile baru (Target, "RW"); readfile.seek (posisi); writeFile.seek (posisi); // byte buffer data [] buf = byte baru [1]; // data baca dan tulis whene (readfile.read (buf)! = -1) {writeFile.write (buf); }} catch (FileNotFoundException e) {// TODO AUTO-ENCOMEERATED Catch Block E.PrintStackTrace (); } catch (ioException e) {// TODO AUTO-ENCEALATED Catch Block E.PrintStackTrace (); }}} class fileAccessException memperluas Exception {}Singkatnya, pekerjaan apa yang kami lakukan dalam perubahan ini:
• Pertama, kami mendefinisikan posisi variabel untuk merekam lokasi di mana membaca dan menulis telah selesai ketika interupsi terjadi. (Ini untuk kenyamanan. Faktanya, harus dikatakan bahwa nilai ini harus disimpan dalam file atau database untuk kegigihan)
• Kemudian dalam waktu loop membaca dan menulis file, kami mensimulasikan terjadinya perilaku interupsi. Di sini, ketika panjang file targetFile adalah 3 byte, itu mensimulasikan melempar pengecualian yang kami disesuaikan. (Kita dapat membayangkan bahwa dalam unduhan yang sebenarnya, konten "X" byte telah diunggah (diunduh) dan jaringan terganggu saat ini, jadi kami akan merekam "X" dalam pengecualian yang dilemparkan oleh interupsi jaringan).
• Sisanya seperti yang kami katakan sebelumnya, setelah perilaku "kelanjutan" dimulai, kami membungkus file kami melalui kelas acak ACCACESSFILE, dan kemudian menentukan pointer ke lokasi di mana interupsi sebelumnya terjadi untuk membaca dan menulis melalui pencarian.
(Untuk pengunduhan dan unggah file yang sebenarnya, tentu saja kita perlu mengunggah nilai interupsi yang disimpan ke server. Metode ini biasanya httpconnection.setRequestProperty ("range", "bytes = x"););
Dalam kode kami, aktifkan perilaku "lanjutan", yaitu, metode pemeliharaan: kami mulai membiarkan utas tidur selama 10 detik, yang tepat untuk membiarkan kami menjalankan program dan melihat efeknya.
Sekarang kami menjalankan program, file akan memulai "proses mengunggah dari D disk ke E disk". Pertama, kami mengklik Disk E dan menemukan bahwa memang ada file test.txt tambahan. Buka dan temukan konten sebagai berikut:
Itu benar, saat ini kami menemukan bahwa konten hanya memiliki "ABC". Ini dalam harapan kami, karena simulasi program kami menyela ketika file diunggah oleh 3 byte.
Oke, mari kita tunggu dengan tenang selama 10 detik untuk dilewati, dan kemudian klik pada file untuk melihat apakah itu bisa berhasil:
Melalui tangkapan layar, kami menemukan bahwa konten itu memang telah menjadi "ABC", dan dengan demikian kelanjutan selesai.
Di atas adalah semua konten artikel ini. Saya harap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.