キーワード: のRandomAccessFile
原則:
1)オフ時間、ファイルの記録位置の位置ブレークポイントをダウンロードしてください。
2)により、ダウンロード時間を続けるのRandomAccessFileのダウンロードを開始する前にポジションを見つけるために、位置
実践:
私たちは、Dドライブのルートディレクトリに「あるtest.txt」というファイルを作成して示すように、ファイルには、非常に簡単です:
はい、私たちは入力が簡単な6通の英語の手紙ものです。その後、我々右→プロパティ:
私たちが達成したい効果は非常に簡単です:でディスクD「test.txtの」ファイルEドライブへの書き込みが、私たちは、その後、アップロードを再開し、プロセス全体の最終完了したことを「ブレーク」の挙動をシミュレートします方法。
つまり、ここでは、単一のサーバとして扱わ「Eドライブ」に直接コンピュータと見、「Dドライブ」を入れて、します。私たちは、もはやさえhttpプロトコルと半ダイム、ととは何かを持っていないので(もちろん、我々は間違いなく、まだ^ <^のそれとは何かを持っている実際の開発)は、最も基本的なファイルの読み書き「オフを懸念し、原則「と」リニューアル「親切方法のです。
インポートのjava.io.File; 輸入java.io.FileInputStream; 輸入java.io.FileNotFoundException。 輸入java.io.FileOutputStreamは、 インポートにjava.io.IOException; 輸入java.io.RandomAccessFile; パブリック クラスのテスト{ プライベート 静的 int型位置= -1 。 パブリック 静的 ボイドメイン(文字列[]引数){ // 源文件与目标文件 ファイルSOURCEFILE = 新しいファイル( "D:/"、 "あるtest.txt" )。 ファイルこのtargetFile = 新しいファイル( "E:/"、 "test.txtの"); // 入力および出力ストリーム のFileInputStream FIS = NULL ; AたFileOutputStream FOS = NULL ; // バッファのデータ バイト [] = BUF 新しい新しい バイト [1 ]; 試み{ FIS = 新しい新規のFileInputStream(SOURCEFILE); FOS = 新しい新たFileOutputStream(TARGETFILE) ; // データの読み出しおよび書き込み ながら(fis.read(BUF)= -1!){ fos.write(BUF); // ドキュメントのコンテンツが3バイト、アナログネットワーク割り込みがアップロードされた場合、例外がスローされ た場合に(targetFile.length()== 3 ){ 位置 = 3 ; スロー 新しい新しいFileAccessException(); } } } キャッチ(FileAccessException E){ keepGoing(SOURCEFILE、TARGETFILE、位置); } キャッチ(にFileNotFoundException E){ のSystem.out。 println( "指定したファイルが存在しない" ); } キャッチ(IOExceptionをE){ } 最後に{ 試み{ // 閉じる入力ストリーム出力 IF(FIS =!ヌル) fis.close(); もし(!FOS = ヌル) fos.close(); } キャッチ(IOExceptionを電子){ e.printStackTrace(); } } } プライベート 静的 ボイド keepGoing(ファイルソース、ファイルターゲット、int型位置){ 試み{ のThread.sleep( 10000 )。 } キャッチ(例外e){ e.printStackTrace(); } 試す { RandomAccessFileのreadFileの = 新しいのRandomAccessFile(ソース、 "RW" )。 RandomAccessFile WRITEFILE = 新しいのRandomAccessFile(ターゲット、 "RW" )。 readFile.seek(位置)。 writeFile.seek(位置)。 // 数据缓冲区 バイト [] BUF = 新しい バイト [1 ]; // 数据读写 ながら(!readFile.read(BUF)= -1 ){ writeFile.write(BUF)。 } } キャッチ(にFileNotFoundException電子){ e.printStackTrace(); } キャッチ(IOExceptionを電子){ e.printStackTrace(); } } } クラス FileAccessExceptionは延び{例外 }
要約すると、我々は何が行われたか、この変更でそれらを持っています:
- まず、位置の読み取りと書き込み、中断時に発生で記録された変数の位置を定義します。(これは、この値は間違いなく、持続性のために、ファイルやデータベースに話すべきで実用的な用語で、容易にするためです)
- 次に、ファイルの読み取りと書き込みループしながら、私たちは、割り込みが行動をシミュレート発生しに行きました。ここでは時に3バイトのこのtargetFileファイルの長さは、我々のカスタムを投げアナログです。(私たちは)実際のダウンロードは、(ダウンロードをアップロードされたネットワークの停止を「×」、今回のバイトの内容を想像することができ、その後、我々は、ネットワークの停止例外「X」のレコードにスローされます)。
- 私たちのファイルのRandomAccessFileクラスをラップして、中断が求め介して取得する読み取りおよび書き込みするために発生する前にポインタの位置を指定するには、開始後に「再開」行動に私たちの前に言っているかのように残りの部分は同じです。(実際のダウンロードファイルのアップロードは、我々は確かにサーバーにアップロード割り込みの値を保存する必要があり、このアプローチは、通常はHttpConnection.setRequestProperty(「RANGE」で、「バイト= X」);)
「再開」行動に我々のコードでは、keepGoing方法ということ:私たちは、私たちは効果を確認するためにプログラムを実行している10秒間スリープ状態にスレッドを開始します。
今、我々は最初のEドライブを開く「EドライブプロセスにDドライブからのアップロード」そのファイルが開きます、プログラムを実行して、あなたは本当に多くのtest.txtファイルのでしょう、それを開くように次のが見つかりました:
はい、今回はそれだけで「ABC」コンテンツを見つけます。私たちのプログラムは、3バイトのファイルのアップロード時間が中断されたシミュレートしているため、これはあまり我々が予想以上にあります。
[OK]を、私たちは静かに10秒が経過して待って、その後、ファイルを開いて、あなたが正常にできるかどうかを確認するポイント:
私たちは、スクリーンショットの内容が実際にこれも履歴書を完了し、「ABC」となっていて発見しました。