English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
ファイルの分割と統合は一般的なニーズです。例えば、大ファイルをアップロードする場合、まず小さなブロックに分割し、サーバーにアップロード後、再統合します。GoogleのGFSやtaobaoのTFSなどの多くの高性能な分散ファイルシステムでも、ブロック単位でファイルの分割や統合が行われています。
基本的な考え方を見てみましょう:
大きなファイルがある場合、指定された分割サイズの後(例えば、1Mカット)
ステップ 1:
まず、元のファイルのサイズと分割サイズに基づいて、最終的な分割された小ファイル数Nを計算します
ステップ 2:
ディスク上にこれらのN个小ファイルを作成します
ステップ 3:
複数のスレッド(スレッド数=ファイル分割数)を使用し、各スレッド内でRandomAccessFileのseek機能を利用して、読み取りポインタを元のファイル内の各セクションの先頭位置に設定し、指定されたサイズ(つまり:分割ブロックサイズ)を読み取り、最終的に対応する分割ファイルに書き込む。多线程並行処理により、各スレッドが独自の小ファイルを書き込むため、速度が比較的速いです。
以下のコードは、ファイルを複数のサブファイルに分割するもので、各サブファイルのサイズは}}100K
package testIO; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.Arrays; public class subStream { public static void main(String[] args) { //まず元ファイルをメモリに読み込む int eachSize=100*1024; File srcFile =new File("F:\"/test/test.txt"); //ファイルオブジェクトを作成する splitFile(srcFile,eachSize); } public static void splitFile(File srcFile,int eachSize){ //ファイルが分割条件に合致するかどうかを判断する if(srcFile.length()==0){ throw new RuntimeException("ファイルが分割条件に合致しません"); } byte[] fileContent= new byte[(int) srcFile.length()]; try { //ファイル内容をメモリに読み込む FileInputStream fis=new FileInputStream(srcFile); fis.read(fileContent); fis.close(); } catch (Exception e) { e.printStackTrace(); } //計算要次要拆分为多少份 int fileNumber; if(fileContent.length%eachSize==0){ fileNumber = fileContent.length/eachSize; } else{ fileNumber = fileContent.length/eachSize+1; } for (int i=0;i<fileNumber;i++){ String fileName = srcFile.getName()+"-"+i+".txt"; File fi = new File(srcFile.getParent(), fileName); //現在のファイルパスの下に分割したファイルを作成する byte[] eachContent; //元ファイルの内容を分割したファイルにコピーする if(i!=fileNumber-1){ eachContent = Arrays.copyOfRange(fileContent, eachSize*i, eachSize*(i+1)); } else{ eachContent = Arrays.copyOfRange(fileContent, eachSize*i, fileContent.length); } try { FileOutputStream fos = new FileOutputStream(fi); fos.write(eachContent); fos.close(); System.out.printf("サブファイル %s、そのサイズは %d、それぞれのサイズは%d\n", fi.getAbsoluteFile(), fi.length(), eachContent.length); } catch (Exception e) { // TODO:例外を処理する e.printStackTrace(); } } } }
まとめ
これで、java IOストリームを使用してファイルを複数のサブファイルに分割するコード例に関する本文の全内容が終わります。皆様に役立つことを願っています。興味がある方は、当サイトの他の関連トピックもご覧ください。不十分な点があれば、コメントをお願いします。皆様のサポートに感謝します。
声明:本文の内容はインターネットから取得しており、著作権者に帰属します。インターネットユーザーが自発的に提供し、自己でアップロードしました。当サイトは所有権を有しておらず、人工的な編集も行っていません。著作権侵害とされる内容があれば、メールで通報してください:notice#oldtoolbag.com(メールを送信する際、#を@に変更してください)で通報し、関連する証拠を提供してください。確認がとれ次第、当サイトは侵害とされる内容をすぐに削除します。