中国語辞典開発-assets,rawのInputStreamデータストリーム操作(ファイル分割合併)



ファイルの移動
一.アプリケーションでは、さらに使用するために、様々な理由でassetsまたはrawフォルダ内に外部ファイルを配置する必要がある.この2つのフォルダには、次の違いと連絡先があります.
  • はいずれもデータストリームの形式で読み取りを行い、Javaの他のいくつかの読み取り方式がこれらのファイルにうまく機能しない.例えば、RandomAccessFile、FileReaderなどのクラスである.ファイルベースのクラスを使用する必要がある場合は、データストリームに基づいて一時ファイル(File.createTempFile)を作成することを折衷の方法として使用できます.これは1つの方法であり、次に別の方法
  • を紹介する.
  • rawフォルダ内のファイルにはディレクトリ構造が含まれず、各ファイルはidにマッピングされますが、assetsフォルダにはディレクトリ構造があります.ファイル名に敏感なプログラムではrawを用いる外部ファイルの格納が便利であるが、ディレクトリ構造に依存するファイルではassetsを用いる
  • を格納する.
  • この2つのフォルダのファイルはあまり大きくできません.公式データは1 M未満です.この点は、発生した問題が非常に隠れているため、プログラムでこのファイルを見つけることができてもinputStreamを生成することができますが、読み込み時にIOException異常が放出されることを常に覚えておく必要があります.この中の大きなファイルは、まず、読み出しを行う
  • に分割する必要がある.
  • この2つのフォルダはファイル名の大文字と小文字に敏感で、名前はできるだけ小文字で、分割合併後もファイル名に注意しなければならない.そうしないと、プログラムはそれらが異なるファイルだと思っているが、作成時に以前のファイルを上書きする(これはあまりにも隠蔽されている、~~~~(><)~~~)
  •   
    データを分割するコードは次のとおりです.
     
    	public static void CutFilesInSizeParts(InputStream fis,
    			String OutputFileName, int MaxPartSize) {
    		try {
    			
    			int TotalLength = fis.available();
    			byte[] buffer = new byte[TotalLength + 1];
    			int len = fis.read(buffer);
    
    			int nbPart = len / MaxPartSize + 1;
    			int CurPos = 0;
    
    			for (int i = 0; i < nbPart; i++) {
    				int PartLen = MaxPartSize;
    				if (CurPos + PartLen >= len)
    					PartLen = len - CurPos;
    				String outRealFileName = OutputFileName + (i + 1);
    				FileOutputStream fos = new FileOutputStream(outRealFileName);
    				fos.write(buffer, CurPos, PartLen);
    				CurPos += PartLen;
    			}
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    
     
     
    二つ目は、以上の2つのフォルダがInputStreamデータストリームしか生成できないことであり、プログラムに他の必要がある場合、何もできません.たとえば、apkに組み込まれてこの2つのフォルダにしか入れられないsqliteのdbファイルが外に作成されますが、必要に応じてsdcardまたはdatabaseに配置することができます.そのため、ファイルを読み取り、該当する場所で目的のファイルを生成し、自分の必要に応じて読み取る必要があり、これも第2の方法を提供する.このステップでは、次の点に注意してください.
     
  • ファイルの権限.そうしないと、
  • が別のアプリケーションで使用される可能性があります.
  • 分割後のファイルをマージする場合は、ファイル順序
  • に注意する.
     
    データをマージしてコピーするコードを添付します
    //       
    	public static void CreateFromRawDbFiles(File[] filelist,
    			FileOutputStream Fos) {
    
    		try {
    			for (File file : filelist) {
    				InputStream inputFile = new FileInputStream(file);
    				int TotalLength = 0;
    				try {
    					TotalLength = inputFile.available();
    				} catch (IOException e) {
    				}
    				// Reading and writing the file Method 1 :
    				byte[] buffer = new byte[TotalLength];
    				int len = 0;
    				try {
    					len = inputFile.read(buffer);
    				} catch (IOException e) {
    				}
    				Fos.write(buffer,0,len);
    				inputFile.close();
    			}
    			Fos.close();
    		} catch (IOException e) {
    		}
    	}