public void save (String filepath) throws IOException {
	new ShrinkTail(tail,begs,lens).shrink();
	
	int nodeSize = chck.size();

	// 末尾の未使用部分を取り除く
	for(; nodeSize > 0 && chck.get(nodeSize-1) == Node.Chck.VACANT_CODE; nodeSize--);
	nodeSize += Node.Chck.CODE_LIMIT;  // 検索時の範囲外アクセスを防ぐために、余白を設ける

	final int total = 4*3 + nodeSize*6 + begs.size()*6 + tail.length()*2;
	final FileMappedOutputStream fmos = new FileMappedOutputStream(filepath, total);
	try {
	    fmos.putInt(nodeSize);
	    fmos.putInt(begs.size());
	    fmos.putInt(tail.length());

	    // 4byte
	    for(Integer n : begs) fmos.putInt(n);
	    for(int i=0; i < nodeSize; i++)
		fmos.putInt(base.get(i, Node.Base.INIT_VALUE));

	    // 2byte
	    for(Short   n : lens) fmos.putShort(n);
	    for(int i=0; i < nodeSize; i++)
		fmos.putChar(chck.get(i, Node.Chck.VACANT_CODE));
	    
	    fmos.putString(tail.toString());
	} finally {
	    fmos.close();
	}
    }