原則分析
開発中、「ブレークポイントの連続伝送」の機能は非常に実用的で一般的であり、「標準」のようにも聞こえます。それで、私たちは通常、この関数がどのように実装されるかを研究することに興味がありますか?
Javaでは、インターネット上で同様の機能を実装することに関する多くの情報を見つけることができます。ただし、それらのほとんどはデモを提供し、ソースコードを投稿します。その実装原則について詳細な説明はほとんどありません。
そのため、最初に接触したとき、CRTL + C/Vコードを直接使用してから、それをいじくり回すことができますが、最終的に効果を得ることができます。しかし、あなたが初心者であるときにこれを行うことは明らかに良いことも悪いこともあります。
利点は、多くのソースコードと説明が少ないことです。私たちが一生懸命働くことをいとわないなら、私たちは情報を検索し、他の人が投稿したコードで理解していないことを研究します。最終的には、おそらく多くの報酬を得るでしょう。
欠点も明らかです。初心者として、多くのソースコードに直面しているとき、多くのことがなじみのないように感じられるので、du然とするのは簡単です。最終的に使用法を大まかに理解していても、実装の原則を必ずしも理解しているわけではありません。
今日は、最も基本的な観点から始めて、いわゆる「ブレークポイントの継続」が本当に「ハイエンド」であるかどうかを確認しましょう。
実際、新しい「もの」と接触すると、それを参照して比較し、学ぶために私たちがよく知っているものに変えることができます。通常、それは半分の労力で結果の2倍になります。
「ブレークポイントの連続伝送」の概念にさらされている場合、1、2、3を明確に説明することは間違いなく困難です。その後、私たちは間違いなく「ゲームをする」ことに精通しています。
さて、「クリアレベルのRPGゲーム」があると仮定しましょう。この種のゲームをプレイするときに私たちが通常何をするかを考えますか?
最初の日に、私たちが最終的に4レベルに到着したと仮定して、私たちが血まみれの戦いと戦い、皆を殺したことは明らかです。激しい戦いは本格的でしたが、私が壁の時計を見たとき、それはすでに午前12時で、寝る時間でした。
現時点では非常に恥ずかしかったです。次回プレイするときにゲームの進歩にうまく対応するために、どうすればよいですか?
とても簡単です。私たちはゲームをオフにするのではなく、寝て、翌日もプレイし続けます。これは大丈夫ですが、人々が不快に感じる何かがあるようです。
したがって、この時点で、ゲームに「保存」と呼ばれる関数がある場合、それは非常に重要です。アーカイブを直接選択し、アーカイブ名「4番目のレベル」を入力してから、ゲームを閉じることができます。
次回ゲームをプレイすると、「4レベル」の保存を直接見つけてから、ファイルを読んでから、ゲームをプレイし続けることができます。
この時点で、いわゆる「ブレークポイント連続伝送」は理解しやすいです。 「ゲームをする」という以前のアイデアに従ってみましょう。
今すぐダウンロードする必要があるファイルがあるとします。その一部をダウンロードすると、コンピューターがクラッシュしたり、電源が切れたり、ネットワークが中断されているなど、状況が発生します。
実際、これは私たちが以前にゲームをしていたときのようなもので、突然寝て12時に休む必要がありました。さて、この時点での状況は次のとおりです。
•ゲームを保存できない場合、次にプレイするときに、今回に合格した4つのレベルの進捗が失われ、ゲームに従うことができないことを意味します。
•それに応じて、「ダウンロード」動作がこのダウンロードの進捗を記録できない場合。次に、このファイルをもう一度ダウンロードすると、最初にやり直すことができます。
この時点で、上記の動作の鍵は「続行」という言葉であることを実際に発見しました。
切断された動作を「継続する」という目的を達成するために、重要なのは、動作に「中断」があるノードの情報を記録および読み取ることができる「メディア」を持つことです。
プログラミングの世界に変身します
実際、これは「ブレークポイント連続伝送」の最も基本的な原則です。単純に言えば、ダウンロード動作が中断されたときに割り込みの位置情報を記録し、次の動作で読む必要があります。
この位置情報を使用して、私たちが何をすべきかを考えてください。はい、とても簡単です。新しいダウンロード動作が開始されたら、レコードのこの場所から直接コンテンツをダウンロードしますが、ゼロから始まりません。
まあ、私たちは平易な言葉で非常に長い間の原則について話してきました、そして退屈を感じ始めました。最後に要約してから、原則をプログラミングの世界に変換する方法を見てみましょう。
• 「アップロード(ダウンロード)動作」が中断されたら、このアップロードの場所(位置)を記録する必要があります(ダウンロード)。
• 「続行」動作が始まると、アップロードを続けるためにポストに直接ジャンプします(ダウンロード)。
明らかに、問題の鍵はいわゆる「位置」にあります。 「パッシングレベルゲーム」では、「どのレベル」をこの位置の単位として使用できると述べました。
それでは、いわゆる「ブレークポイント連続伝送」に切り替えると、「位置」を測定するために何を使用する必要がありますか?明らかに、ここのエッセンスはファイルを読み書きすることに過ぎないため、バイナリに戻っています。
その後、残りの作業は非常に簡単です。まず、データの永続性(メモリ、ファイル、データベース)だけであり、多くの方法があるため、話す価値のない位置を記録します。
もう1つの重要なことは、「継続的な」動作が開始されると、前回記録した位置から読み取り操作を開始する必要があるため、「ポインター」関数に似たものが必要であることです。
もちろん、このような「ポインター」を実装する方法も見つけることができますが、Javaがそのようなクラス、つまりRandomAccessFileを提供してくれたことを嬉しく思います。
このクラスの機能は、その名前に直感的に反映されており、ファイルにランダムにアクセスできます。 APIドキュメントのこのクラスの説明を見てみましょう。
このクラスのサポートのインスタンスは、ランダムにアクセスしたファイルへの読み取りおよび書き込みです。ファイルへのランダムアクセスは、ファイルシステムに保存されている大きなバイト配列のように動作します。
ファイルが読み取り/書き込みモードでランダムにアクセスされる場合、出力操作も利用できます。出力操作はファイルポインターから始まり、バイトが書かれているときにファイルポインターを進めます。
暗黙のアレイの現在の端に書き込みた後の出力操作により、配列が拡張されます。ファイルポインターは、getFilePointerメソッドを介して読み取り、SEEKメソッドを介して設定できます。
APIの指示を読んだ後、私たちは笑いました。はい、これはまさに私たちが望むものではありませんか?さて、私たちは長い間ナイフを磨いてきました、なぜ私たちは木を切り刻んでいませんか?
デモの例
ファイルの「ブレークポイントの継続」のためであるため、最初にファイルを作成することは明らかです。たぶん、オーディオファイル、画像ファイルなどはもう少し上品に見えます。
しかし、私たちはすでに、大きなコンピューター兄弟の目には、最終的には「バイナリ」に戻ると言っています。したがって、TXTは理解をより助長するため、ここで簡単な「TXT」ファイルを作成します。
ディスクDのルートディレクトリに「test.txt」という名前のファイルを作成します。図に示すように、ファイルコンテンツは非常に簡単です。
そうです、私たちがタイプしたのは、6つの簡単な英語の文字です。次に、右クリックして→[プロパティ]をクリックします。
ファイルのサイズが6バイトになっていることがわかります。これが、すべてが「バイナリ」と切り離せないと言う理由です。
はい、私たちは皆、6つの英語の手紙を入力し、1つの英語の文字が占めるストレージスペースが1バイト(つまり8ビット)であるために理解しています。
これまでのところ、私たちが見たのは退屈です。これは基本的にナンセンスであり、コンピューターの知識を少し持っている人がこの知識を知っているからです。心配しないでください、続けましょう。
Javaのファイルを簡単に読み書きできます。現在の要件が「このファイルをドライブDからドライブEに書き込む」であると仮定し、キーボードを持ち上げて完成させます!
しかし、いわゆる「アップロード(ダウンロード)」はいわゆるファイルではありませんか?唯一の違いは、行動が「原住民の間だけ」から「ネイティブ間」から「ネイティブ間」のファイルの読み取りと書き込みに変わることです。
この時点で、「促すのをやめなさい、誰もがこれらのことを知っている、「ブレークポイントの連続伝送」はどうですか?」と言うでしょう。実際、ここではすでに非常に簡単です。ブレークポイントの連続伝送で行う必要があることは次のとおりです。
以前の読み取りおよび書き込みの動作に中断がある場合は、今回読み取られたファイルの内容の位置情報を記録してください。 「継続開始」の場合、ここでポインターを直接移動し、読み取りおよび書き込み操作を継続し始めます。
原則を繰り返し強調するのは、実際には、原則が理解されている限り、残りは単なる動きであるためです。これは、格闘技小説の「9つの9つの戻り」ダルマのようなものです。最高レベルは、元のソースに戻ることです。
複雑なことの原則を理解している限り、私たちはそれを取り除き、単純なものに減らすことができます。同様に、論理的な組み合わせを通じて、一連の単純なものが複雑なものを形成します。
次に、すぐにカオスに戻り、最も基本的な形で「ブレークポイントの連続伝送」をシミュレートします。ここでは、サーバーコードを書くことさえありません。ローカルテストクラスを通じてそれを行うだけです。
達成したい効果は非常に簡単です。ディスクDに「test.txt」ファイルをディスクEに記述しますが、プロセスの途中で「割り込み」動作をシミュレートし、再びアップロードしてプロセス全体を完了します。
言い換えれば、ここでは「Dドライブ」をコンピューターと見なし、「eドライブ」をサーバーと直接見なします。次に、HTTPプロトコルと半セントの関係がなくなってしまう必要がなくなります(もちろん、実際の開発ではまだ関係する必要があります)。そのため、ファイルの読み書きのために「壊す」と「継続」という最も基本的な原則のみを気にします。
比較を通じて理解を深めるために、最初に通常のコードを書きます。つまり、通常は中断せずに読み取り、書き込みます。
public class test {public static void main(string [] args){//ソースおよびターゲットファイルファイルsourceFile = newファイル( "d:/"、 "test.txt");ファイルターゲットファイル= newファイル( "e:/"、 "test.txt"); //入力および出力fileinputStream fis = null; fileoutputStream fos = null; // data buffer byte [] buf = new byte [1]; try {fis = new fileinputStream(sourceFile); fos = new fileoutputStream(targetFile); //データの読み取りと書き込みwhile(fis.read(buf)!= -1){system.out.println( "write data ..."); fos.write(buf); }} catch(filenotfoundexception e){system.out.println( "指定されたファイルが存在しない"); } catch(ioException e){// todo:handle例外}最後に{try {//入力と出力ストリームを閉じます(fis!= null)fis.close(); if(fos!= null)fos.close(); } catch(ioexception e){e.printstacktrace(); }}}}このコードが実行されると、「test.txt」のコピーがディスクEで正常にコピーされていることがわかります。このコードは非常に簡単です。
BUF、つまりバッファのサイズは1であることがわかります。実際には、読むたびにデータ(つまり、1つの英語の文字)を読むことを意味します。
次に、読み取りおよび書き込み割り込みの動作をシミュレートしましょう。以前のコードを次のように完成させます。
Import java.io.file; Import java.io.fileinputStream; Import java.io.filenotfoundexception; Import java.io.fileoutputStream; Import java.io.ioexception; Import java.io.io.randomaccessfile; public class test {private static int int = -1; public static void main(string [] args){//ソースおよびターゲットファイルファイルsourcefile = new file( "d:/"、 "test.txt");ファイルターゲットファイル= newファイル( "e:/"、 "test.txt"); //入力および出力fileinputStream fis = null; fileoutputStream fos = null; // data buffer byte [] buf = new byte [1]; try {fis = new fileinputStream(sourceFile); fos = new fileoutputStream(targetFile); //データの読み取りと書き込みwhile(fis.read(buf)!= -1){fos.write(buf); // 3バイトのファイルコンテンツがアップロードされると、ネットワークが割り込み、例外がスローされます(targetfile.length()== 3){position = 3;新しいfileaccessexception()を投げます。 }}} catch(fileaccessexception e){keepovering(sourcefile、targetfile、position); } catch(filenotfoundexception e){system.out.println( "specify file whes not Notが存在しない"); } catch(ioException e){// todo:handle例外}最後に{try {//入力と出力ストリームを閉じます(fis!= null)fis.close(); if(fos!= null)fos.close(); } catch(ioexception e){e.printstacktrace(); }}} private static void keepovering(ファイルソース、ファイルターゲット、int position){try {thread.sleep(10000); } catch(arturnedexception e){// todo auto-fenated catch block e.printstacktrace(); } try {randomAccessfile readfile = new RandomAccessFile(source、 "rw"); randomAccessfile writefile = new RandomAccessFile(ターゲット、 "RW"); readfile.seek(position); writefile.seek(position); // data buffer byte [] buf = new byte [1]; //データの読み取りと書き込みwhile(readfile.read(buf)!= -1){writefile.write(buf); }} catch(filenotfoundexception e){// todo auto-enerated catch block e.printstacktrace(); } catch(ioException e){// todo auto-fenated catch block e.printstacktrace(); }}} class fileaccessexceptionは例外を拡張します{}要約すると、この変更で私たちが行った仕事は次のとおりです。
•最初に、割り込みが発生したときに読み取りと書き込みが完了した場所を記録する変数位置を定義します。 (これは便利です。実際、この値は永続性のためにファイルまたはデータベースに保存する必要があると言われるべきです)
•その後、ファイルの読み取りと書き込みのwhileループで、割り込み挙動の発生をシミュレートします。ここで、ターゲットファイルのファイルの長さが3バイトの場合、カスタマイズした例外をスローすることをシミュレートします。 (実際のダウンロードでは、「X」バイトのコンテンツがアップロード(ダウンロード)され、ネットワークが中断されているため、ネットワーク割り込みによってスローされた例外に「X」を記録します)。
•残りは、「継続」の動作が始まった後、前に言ったように、ランダムアクセスファイルクラスを介してファイルをラップし、以前の割り込みが発生した場所へのポインターをSeekで読み書きするために指定します。
(実際のファイルのダウンロードとアップロードの場合、もちろん保存された割り込み値をサーバーにアップロードする必要があります。この方法は通常、httpconnection.setRequestProperty( "range"、 "bytes = x");)
コードでは、「継続的な」動作、つまり維持方法を有効にします。スレッドを10秒間眠らせ始めます。これは、プログラムを実行して効果を確認できるようにします。
プログラムを実行すると、ファイルは「DディスクからEディスクへのアップロードのプロセス」を開始します。最初に、Eディスクをクリックして、実際に追加のtest.txtファイルがあることがわかります。それを開いて、次のようにコンテンツを見つけます。
そうです、この時点で、コンテンツには「ABC」のみがあることがわかりました。これは、ファイルが3バイトでアップロードされたときにプログラムシミュレーションが中断されるため、私たちの期待の範囲内です。
OK、10秒間静かに待ってから、ファイルをクリックして成功できるかどうかを確認しましょう。
スクリーンショットを通じて、コンテンツが実際に「ABC」になっているため、継続が完了したことがわかりました。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。