Offset文件名(绝对偏移量)

时间:2022-04-10 08:17:40

 

public class StoreUtils {
 
    /**
     * 绝对偏移量->文件名.
     * 
     * 
     * @param offset    偏移量
     * @return          文件名
     */
    public static String nameFromOffset(final long offset) {
        final NumberFormat nf = NumberFormat.getInstance();
        nf.setMinimumIntegerDigits(20);
        nf.setMaximumFractionDigits(0);
        nf.setGroupingUsed(false);
 
        return nf.format(offset);
    }
    
    /**
     * 文件名->偏移量.
     * 
     * <li> 文件名可以是偏移量
     * <li> 文件名可以是偏移量+后缀名
     * 
     * 
     * @param name
     * @return      文件名为空时,返回-1
     */
    public static long offsetFromName(final String name){
        if(StringUtils.isBlank(name)){
            return -1;
        }
        String digital = name;
        if(name.contains(ZQueueConstants.POSTFIX_SEPERATOR)){
           digital = name.substring(0, name.indexOf(ZQueueConstants.POSTFIX_SEPERATOR));
        }
        
        return Long.parseLong(digital);
        
    }
 
    /**
     * 文件名->byte[].
     * 
     * @param name
     * @return
     */
    public static byte[] byteFromName(final String name){
        if(StringUtils.isBlank(name)){
            return null;
        }
        return name.getBytes();
    }
    
    /**
     * 绝对偏移量->byte[].
     * 
     * @param offset
     * @return
     */
    public static byte[] byteFromLong(final long offset){
        String tem = nameFromOffset(offset);
        return byteFromName(tem);
    }
    
    /**
     * bytes->String
     * 
     * @param bytes
     * @return
     */
    public static String nameFromByte(final byte[] bytes){
        if(null == bytes){
            return null;
        }
        return new String(bytes);
    }
    
    /**
     * bytes->long
     * 
     * @param bytes
     * @return
     */
    public static long longFromByte(final byte[] bytes){
        return offsetFromName(nameFromByte(bytes));
    }
    
    /**
     * 将buf中的数据,每interval取一下,共取num次
     * 
     * @param buf       待转换的内容
     * @param interval  间隔
     * @param num       次数
     * @return          byte->long
     */
    public static long[] longFromByteBuffer(final ByteBuffer buf, final int interval, final int num){
        if( null == buf){
            return null;
        }
        
        byte[] bytes = new byte[interval];
        long[] result = new long[num];
        for(int i = 0; i< num; i++){
            buf.get(bytes, i*interval, (i+1)*interval-1);
            result[i] = longFromByte(bytes);
        }
        
        return result;
    }    
    
}