📄 viewutil.java
字号:
package org.xinguan.common.util;
@SuppressWarnings("unused")
public final class ViewUtil
{
private final static String SHOW_LINE="\r\n";
// ////////////////////////////////////////////
// 表格定义
//-----------------------------------------------------
// private final static String LU_CHAR="┌";
//
// private final static String LM_CHAR="├";
//
// private final static String LB_CHAR="└";
//
// private final static String RU_CHAR="┐";
//
// private final static String RM_CHAR="┤";
//
// private final static String RB_CHAR="┘";
//
// private final static String UL_CHAR="┌";
//
// private final static String UM_CHAR="┬";
//
// private final static String UR_CHAR="┐";
//
// private final static String ML_CHAR="├";
//
// private final static String MR_CHAR="┤";
//
// private final static String MU_CHAR="┬";
//
// private final static String MB_CHAR="┴";
//
// private final static String MM_CHAR="┼";
//
// private final static String MM_LOCT="+";
//
// private final static String BL_CHAR="└";
//
// private final static String BM_CHAR="┴";
//
// private final static String BR_CHAR="┘";
//
// private final static String VV_CHAR="│";
//
// private final static String HH_CHAR="─";
//-----------------------------------------------------
private final static String LU_CHAR="+";
private final static String LM_CHAR="+";
private final static String LB_CHAR="+";
private final static String RU_CHAR="+";
private final static String RM_CHAR="+";
private final static String RB_CHAR="+";
private final static String UL_CHAR="+";
private final static String UM_CHAR="+";
private final static String UR_CHAR="+";
private final static String ML_CHAR="+";
private final static String MR_CHAR="+";
private final static String MU_CHAR="+";
private final static String MB_CHAR="+";
private final static String MM_CHAR="+";
private final static String MM_LOCT="+";
private final static String BL_CHAR="+";
private final static String BM_CHAR="+";
private final static String BR_CHAR="+";
private final static String VV_CHAR="|";
private final static String HH_CHAR="-";
//-----------------------------------------------------
private final static String TABLE_LEFT=" ";
private final static double TABLE_FACT=1.5;
private final static int TABLE_ROW_SIZE=5;
private final static String TABLE_ROW_NAME="RowID";
// ////////////////////////////////////////////
// Byte定义
private final static String BYTES_LEFT_PAD=" ";
private final static String BYTES_MID_PAD=" ";
public final static short VIEW_LEFT=0x0002;
public final static short VIEW_BYTE_ADDR=0x0004;
public final static short VIEW_BYTE_EXPL=0x0010;
public static String viewBytes(byte[] bytes)
{
return viewBytes(bytes,0,bytes.length,16,VIEW_LEFT|VIEW_BYTE_ADDR|VIEW_BYTE_EXPL);
}
public static String viewBytes(byte[] bytes,int showlen)
{
return viewBytes(bytes,0,showlen,16,VIEW_LEFT|VIEW_BYTE_ADDR|VIEW_BYTE_EXPL);
}
public static String viewBytes(byte[] bytes,int start,int showlen)
{
return viewBytes(bytes,start,showlen,16,VIEW_LEFT|VIEW_BYTE_ADDR|VIEW_BYTE_EXPL);
}
/**
* 显示字节数字信息
* @param bytes 数据
* @param start 起始位置
* @param showlen 长度
* @param colwidth 列宽
* @param lpad 是否左补齐
* @param address 是否显示地址
* @param explain 是否解释字符
*/
public static String viewBytes(byte[] bytes,int start,int showlen,int colwidth,int conf)
{
boolean lpad=(conf&VIEW_LEFT)!=0,address=(conf&VIEW_BYTE_ADDR)!=0,explain=(conf|VIEW_BYTE_EXPL)!=0;
StringBuffer sb=new StringBuffer("");
if(start+showlen>bytes.length)
{
showlen=bytes.length-start;
}
int showrows=showlen/colwidth;
if(showlen%colwidth!=0)
{
showrows=showrows+1;
}
for(int i=0,ccurpos=0,dcurpos=0;i<showrows;i++)
{
if(lpad)
{
sb.append(BYTES_LEFT_PAD);
}
if(address)
{
sb.append(linenum(6,dcurpos+start));
sb.append(BYTES_MID_PAD);
}
for(int j=0;j<colwidth;dcurpos++,j++)
{
if(dcurpos<showlen)
{
String HexVal=Integer.toHexString(MathUtil.usbyte(bytes[start+dcurpos]));
if(HexVal.length()==1)
{
HexVal="0"+HexVal;
}
sb.append(HexVal.toUpperCase());
sb.append(" ");
}
else
{
sb.append(" ");
}
}
sb.append(BYTES_MID_PAD);
if(explain)
{
for(int j=0;j<colwidth&&ccurpos+start<bytes.length;ccurpos++,j++)
{
if(ccurpos<showlen)
{
if(bytes[ccurpos+start]>32&&bytes[ccurpos+start]<127)
{
sb.append((char)bytes[ccurpos+start]);
}
else
{
sb.append(".");
}
}
else
{
sb.append(" ");
}
}
}
if(i!=showrows-1)
{
sb.append(SHOW_LINE);
}
}
return sb.substring(0,sb.length());
}
private static String linenum(int showlen,int line)
{
String hvalue=Integer.toHexString(line);
for(int len=hvalue.length();len<showlen;len++)
{
hvalue="0"+hvalue;
}
String dvalue=Integer.toString(line);
for(int len=dvalue.length();len<showlen;len++)
{
dvalue="0"+dvalue;
}
return hvalue.toUpperCase()+":"+dvalue;
}
/**
* 显示表格
* @param name 显示表名称
* @param hsizes 头部大小
* @param headers 头部名称
* @param table 数据内容
* @param curpage 当前页
* @param pagesize 页大小
*/
public static String viewTable(String name,int[] hsizes,String[] headers,String[][] table,int curpage,int pagesize)
{
if(pagesize<=0)
{
pagesize=10;
}
if(curpage<0)
{
curpage=0;
}
if(curpage*pagesize>table.length)
{
curpage=table.length/pagesize;
}
int allpage=table.length/pagesize;
if(table.length%pagesize!=0)
{
allpage=allpage+1;
}
StringBuffer buffer=new StringBuffer();
int mwidth=hsizes.length;// +
int dwidth=0;
for(int idx=0;idx<hsizes.length;idx++)
{
dwidth+=Math.abs(hsizes[idx]);
}
// 十字光标
buffer.append(MM_LOCT+SHOW_LINE);
// 头部信息
buffer.append(TABLE_LEFT);
buffer.append(LU_CHAR);
for(int idx=0;idx<dwidth+mwidth+TABLE_ROW_SIZE;idx++)
{
buffer.append(HH_CHAR);
}
buffer.append(RU_CHAR);
buffer.append(SHOW_LINE);
// 表格名称
buffer.append(TABLE_LEFT);
buffer.append(VV_CHAR+centerString(NullUtil.nullString(name),dwidth+mwidth+TABLE_ROW_SIZE)+VV_CHAR);
buffer.append(SHOW_LINE);
// 准备头部
buffer.append(TABLE_LEFT);
buffer.append(LM_CHAR);
for(int idx=0;idx<TABLE_ROW_SIZE;idx++)
{
buffer.append(HH_CHAR);
}
buffer.append(MU_CHAR);
for(int idx=0;idx<hsizes.length;idx++)
{
for(int jdx=0;jdx<Math.abs(hsizes[idx]);jdx++)
{
buffer.append(HH_CHAR);
}
if(idx<hsizes.length-1)
{
buffer.append(MU_CHAR);
}
}
buffer.append(RM_CHAR);
buffer.append(SHOW_LINE);
// 显示表头
buffer.append(TABLE_LEFT);
buffer.append(VV_CHAR);
buffer.append(centerString(TABLE_ROW_NAME,TABLE_ROW_SIZE));
buffer.append(VV_CHAR);
for(int idx=0;idx<hsizes.length;idx++)
{
buffer.append(centerString(headers[idx],hsizes[idx]));
if(idx<hsizes.length-1)
{
buffer.append(VV_CHAR);
}
}
buffer.append(VV_CHAR);
buffer.append(SHOW_LINE);
// 封装表头
buffer.append(TABLE_LEFT);
buffer.append(LM_CHAR);
for(int idx=0;idx<TABLE_ROW_SIZE;idx++)
{
buffer.append(HH_CHAR);
}
buffer.append(table.length>curpage*pagesize?MM_CHAR:MB_CHAR);
for(int idx=0;idx<hsizes.length;idx++)
{
for(int jdx=0;jdx<Math.abs(hsizes[idx]);jdx++)
{
buffer.append(HH_CHAR);
}
if(idx<hsizes.length-1)
{
buffer.append(table.length>curpage*pagesize?MM_CHAR:MB_CHAR);
}
}
buffer.append(RM_CHAR);
buffer.append(SHOW_LINE);
// 显示数据
for(int ddx=0;ddx<pagesize&&ddx<table.length-curpage*pagesize;ddx++)
{
buffer.append(TABLE_LEFT);
buffer.append(VV_CHAR);
buffer.append(centerString((curpage*pagesize+ddx+1)+"",TABLE_ROW_SIZE));
buffer.append(VV_CHAR);
for(int idx=0;idx<hsizes.length;idx++)
{
buffer.append(centerString(table[curpage*pagesize+ddx][idx],hsizes[idx]));
buffer.append(VV_CHAR);
}
buffer.append(SHOW_LINE);
buffer.append(TABLE_LEFT);
buffer.append(LM_CHAR);
for(int idx=0;idx<TABLE_ROW_SIZE;idx++)
{
buffer.append(HH_CHAR);
}
buffer.append(table.length>curpage*pagesize+ddx+1?MM_CHAR:MB_CHAR);
for(int idx=0;idx<hsizes.length;idx++)
{
for(int jdx=0;jdx<Math.abs(hsizes[idx]);jdx++)
{
buffer.append(HH_CHAR);
}
if(idx<hsizes.length-1)
{
buffer.append(table.length>curpage*pagesize+ddx+1?MM_CHAR:MB_CHAR);
}
}
buffer.append(RM_CHAR);
buffer.append(SHOW_LINE);
}
// 表格统计
buffer.append(TABLE_LEFT);
String stat="CurPage:"+(allpage>0?curpage+1:0)+" TotPage:"+allpage+" RecCount:"+table.length;
buffer.append(VV_CHAR+centerString(stat,dwidth+mwidth+TABLE_ROW_SIZE)+VV_CHAR);
buffer.append(SHOW_LINE);
// 显示表尾
buffer.append(TABLE_LEFT);
buffer.append(LB_CHAR);
for(int idx=0;idx<dwidth+mwidth+TABLE_ROW_SIZE;idx++)
{
buffer.append(HH_CHAR);
}
buffer.append(RB_CHAR);
buffer.append(SHOW_LINE);
return buffer.toString();
}
private static String centerString(String string,int width)
{
int cncount=0,encount=0,sccount=string.length(),padlen=0;
for(int idx=0;idx<sccount;idx++)
{
String istr=string.substring(idx,idx+1);
if(istr.getBytes().length>1)
{
cncount++;
}
else
{
encount++;
}
}
// 计算显示长度
int showlen=encount;
if(cncount%2==0)
{
showlen+=cncount*TABLE_FACT;
}
else
{
showlen+=(int)(cncount*TABLE_FACT)+1;
}
if(width>=0)
{
if(showlen>width)
{
return string;
}
padlen=(width-showlen)/2;
return padstring(padlen," ")+string+padstring(width-padlen-showlen," ");
}
else
{
return padstring(width*-1-showlen," ")+string;
}
}
public static String padstring(int count,String pad)
{
StringBuffer buffer=new StringBuffer();
for(int idx=0;idx<count;idx++)
{
buffer.append(pad);
}
return buffer.toString();
}
public static void main(String[] args)
{
byte[] bytes=new byte[23000];
ByteUtil.writeInt(bytes,0,10);
ByteUtil.writeBytes(bytes,4,"1234567890".getBytes(),0,10);
System.out.println(viewBytes(bytes,0,100,16,ViewUtil.VIEW_BYTE_ADDR|ViewUtil.VIEW_BYTE_ADDR|ViewUtil.VIEW_BYTE_EXPL));
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -