前言
某些时候我们想存储一些整形长整形的内容到一些地方当然你可能会用分隔来存比如
这种形式并没有错但存以几个缺点
字符串格式占用空间太多在java里以上字符串至少条占*=Byte不管是读取还是写入都 要把字符串转化为整形或相反大家都应该知道字符串的操作对性能的影响还是挺大的那么我们把它直接用整形的字节流来存储会怎么样呢?
不需要互转节省开销空间*=byte效果也是很明显的问题来源
我这里说下的我一个应用实例也就是我开发这个网站(ZHUTIBO)的时候右上解不是有个搜索这是个全文检索涉及过的朋友应该知道全文检索有一个不太乐观的地方
更新索引比较迟缓因为影响性能所以我们发表的文章不能及时被搜索到然后我们就跟据需求重新写了一个全文检索功能中间有一个问题就是快速存取一堆文档号这就是问题的由来
正题
以下算法是本人改写自Java官网的RandomAccessFile类性能上有一定的保障大家可以放心使用
view plain package service
import javaioEOFExceptionimport javaioIOException
public class TypeService {
public int[] convertByteArrToIntArr(byte[] byteArr) {
int remained = int intNum =
remained = byteArrlength % if(remained != ){ throw new RuntimeException()}
//把字节数组转化为int[]后保留的个数
intNum = byteArrlength /
// int[] intArr = new int[intNum]
int ch ch ch chfor(int j= k= j<intArrlength j++ k+=){
ch = byteArr[k]ch = byteArr[k+]ch = byteArr[k+]ch = byteArr[k+]
//以下内容用于把字节的位 不按照正负 直接放到int的后位中
if (ch < ){ ch = + ch} if (ch < ){ ch = + ch} if (ch < ){ ch = + ch} if (ch < ){ ch = + ch}
intArr[j] = (ch << ) + (ch << ) + (ch << ) + (ch << )}
return intArr}
public byte[] convertIntArrToByteArr(int[] intArr){
int byteNum = intArrlength * byte[] byteArr = new byte[byteNum]
int curInt = for(int j= k= j<intArrlength j++ k+= ){ curInt = intArr[j]byteArr[k] = (byte) ((curInt >>> ) & xFF)byteArr[k+] = (byte) ((curInt >>> ) & xFF)byteArr[k+] = (byte) ((curInt >>> ) & xFF)byteArr[k+] = (byte) ((curInt >>> ) & xFF)}
return byteArr
}
public static void main(String[] args) throws IOException {
// TypeService typeService = new TypeService()// // int[] intArr = new int[]{IntegerMIN_VALUE}// byte[] byteArr = nvertIntArrToByteArr(intArr)// // File file = new File( C/Users/dell/Desktop/IT解决方案/aatxt)// RandomAccessFile r = new RandomAccessFile(file rw)// rwrite(byteArr)// rclose()// // Systemoutprintln( ArraystoString( nvertByteArrToIntArr(byteArr)) )
// byte b = (byte) // Systemoutprintln( (int)b )// Systemoutprintln(ByteMAX_VALUE)// Systemoutprintln(ByteMIN_VALUE)}