java 开发问题集

1.反序列化java.io.EOFException

刚开始在反序列化流的时候,抛出了EOFException异常;

处理办法:

自定义类中有没有实现Serializable接口;

在反序列化流的时候需要将ovbject强转自定义类

Student obj = (Student) ois.readObject();

相关博文:https://blog.csdn.net/ysk_xh_521/article/details/77396696

并不一定正确,仅供参考,

2.byte保存数值超过127,如何存储?是否影响计算?不影响位运算,影响普通的数学运算.

byte short int long 等字符类型具体在计算机里保存数据的方式

Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。

byte:

  • byte 数据类型是8位、有符号的,以二进制补码表示的整数;
  • 最小值是 -128(-2^7);
  • 最大值是 127(2^7-1);
  • 默认值是 0;
  • byte 类型用在大型数组中节约空间,主要代替整数,因为 byte 变量占用的空间只有 int 类型的四分之一;
  • 例子:byte a = 100,byte b = -50。

short:

  • short 数据类型是 16 位、有符号的以二进制补码表示的整数
  • 最小值是 -32768(-2^15);
  • 最大值是 32767(2^15 - 1);
  • Short 数据类型也可以像 byte 那样节省空间。一个short变量是int型变量所占空间的二分之一;
  • 默认值是 0;
  • 例子:short s = 1000,short r = -20000。

int:

  • int 数据类型是32位、有符号的以二进制补码表示的整数;
  • 最小值是 -2,147,483,648(-2^31);
  • 最大值是 2,147,483,647(2^31 - 1);
  • 一般地整型变量默认为 int 类型;
  • 默认值是 0 ;
  • 例子:int a = 100000, int b = -200000。

long:

  • long 数据类型是 64 位、有符号的以二进制补码表示的整数;
  • 最小值是 -9,223,372,036,854,775,808(-2^63);
  • 最大值是 9,223,372,036,854,775,807(2^63 -1);
  • 这种类型主要使用在需要比较大整数的系统上;
  • 默认值是 0L;
  • 例子: long a = 100000L,Long b = -200000L。
    "L"理论上不分大小写,但是若写成"l"容易与数字"1"混淆,不容易分辩。所以最好大写。

float:

  • float 数据类型是单精度、32位、符合IEEE 754标准的浮点数;
  • float 在储存大型浮点数组的时候可节省内存空间;
  • 默认值是 0.0f;
  • 浮点数不能用来表示精确的值,如货币;
  • 例子:float f1 = 234.5f。

double:

  • double 数据类型是双精度、64 位、符合IEEE 754标准的浮点数;
  • 浮点数的默认类型为double类型;
  • double类型同样不能表示精确的值,如货币;
  • 默认值是 0.0d;
  • 例子:double d1 = 123.4。

boolean:

  • boolean数据类型表示一位的信息;
  • 只有两个取值:true 和 false;
  • 这种类型只作为一种标志来记录 true/false 情况;
  • 默认值是 false;
  • 例子:boolean one = true。

char:

  • char类型是一个单一的 16 位 Unicode 字符;
  • 最小值是 \u0000(即为0);
  • 最大值是 \uffff(即为65,535);
  • char 数据类型可以储存任何字符;
  • 例子:char letter = 'A';。

3.两个byte如何转char  移位操作

//char转化为byte
    public static byte[] charToByte2(char c) {
    	byte[] b = new byte[2];
        b[0] = (byte) ((c & 0xFF00) >> 8);
        b[1] = (byte) (c & 0xFF);
        return b;
    }
 
	//byte转换为char
    public static char byteToChar(byte[] b) {
	    char c = (char) (((b[0] & 0xFF) << 8) | (b[1] & 0xFF));
	    return c;
    }

4.11位数字(电话)转BDC(6)

/**
	 * 12位 字符串电话转BCD[6]
	 * @param phone
	 * @return
	 */
	public static byte[] phoneToBytes(String phone) {
		byte[] phoneBytes = new byte[6];
		if (phone.length() != 12) return phoneBytes;
        for (int i = 0; i < 12; i++)
        {
        	int high = Integer.parseInt(phone.substring(i, 1));
        	i++;
        	int low = Integer.parseInt(phone.substring(i, 1));
        	
        	phoneBytes[i] =(byte)(high*16+low);
        }
        return phoneBytes;
	}
	/**
	 * BCD[6] 转12位 String电话
	 * @param bytes
	 * @return
	 */
	public static String bytesToPhone(byte[] bytes) {
		StringBuffer sb = new StringBuffer();
		for (byte b : bytes) {
			int high = (int) ((b & 0xF0) >> 4);
			sb.append(high);
	        int low = (int) (b & 0x0F);
	        sb.append(low);
		}
		return sb.toString();
	}

5.序列化与反序列化操作,对应的对象头要加上一句:implements Serializable

//序列化 
    public static byte[] serialize(Object obj){
        ObjectOutputStream obi=null;
        ByteArrayOutputStream bai=null;
        try {
            bai=new ByteArrayOutputStream();
            obi=new ObjectOutputStream(bai);
            obi.writeObject(obj);
            byte[] byt=bai.toByteArray();
            return byt;
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
        	try {
        		obi.close();
        		bai.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
        return null;
    }
    
    //反序列化
    public static Object unserizlize(byte[] data){
        ObjectInputStream oii=null;
        ByteArrayInputStream bis=null;
        Object obj = null;
        try {
        	bis=new ByteArrayInputStream(data);
            oii=new ObjectInputStream(bis);
            obj=oii.readObject();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
        	try {
				oii.close();
				bis.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
        
        return obj;
    }

6.打印16进制的byte数组

public static void printByteData(byte[] data) {
		for (byte b : data) {		
			System.out.print("0x");
			
			if((b&0xF0)>>4==10)
				System.out.print("A");
			else if((b&0xF0)>>4==11)
				System.out.print("B");
			else if((b&0xF0)>>4==12)
				System.out.print("C");
			else if((b&0xF0)>>4==13)
				System.out.print("D");
			else if((b&0xF0)>>4==14)
				System.out.print("E");
			else if((b&0xF0)>>4==15)
				System.out.print("F");
			else
				System.out.print((b&0xF0)>>4);
			
			if((b&0x0F)==10)
				System.out.print("A");
			else if((b&0x0F)==11)
				System.out.print("B");
			else if((b&0x0F)==12)
				System.out.print("C");
			else if((b&0x0F)==13)
				System.out.print("D");
			else if((b&0x0F)==14)
				System.out.print("E");
			else if((b&0x0F)==15)
				System.out.print("F");
			else
				System.out.print(b&0x0F);
			
			System.out.print(" ");
			
		}
		System.out.println();
	}

7.java除法保留小数操作,把被除数强转double  or  float,如果没有这个操作,结果是个整数

long a= (b0 << 24) | (b1 << 16) | (b2 << 8) | b3;
return  (double)a/(double)1000000; 

保留多少位数据的操作。示例:保留两位小数:

public static void main(String[] args) throws ParseException {
		int a=1099;
		int b=93;
		double f1 = new BigDecimal((float)a/b).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
		System.out.println("ddd==="+f1);
 
	}

public static void main(String[] args) throws ParseException {
		int a=1099;
		int b=93; 
		DecimalFormat df = new DecimalFormat("0.00");//格式化小数  
		String num = df.format((float)a/b);//返回的是String类型  
		System.out.println("ddd==="+num);
 
	}

8.对byte[]里出现的特殊数值进行的替换操作技巧  利用流操作  示例:

/**
	 * 对消息里出现的特殊byte 0x7e 0x7d进行转义
	 * @param msg 消息
	 * @return
	 */
	public static byte[] escapeCode(byte[] msg) {
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		for(int i=0;i<msg.length;i++) {
			out.write(msg[i]);
			if(i>0&&i<msg.length-1) {
				if(msg[i]==0x7e) {
					out.write(0x02);
				}
				if(msg[i]==0x7d) {
					out.write(0x01);
				}
			}
		}
		return out.toByteArray();
	}

9.两个byte[] 合并

/**
	 * 两个byte[]数组合并
	 * @param data1
	 * @param data2
	 * @return
	 */
	public static byte[] addBytes(byte[] data1, byte[] data2) {
		byte[] data3 = new byte[data1.length + data2.length];
		System.arraycopy(data1, 0, data3, 0, data1.length);
		System.arraycopy(data2, 0, data3, data1.length, data2.length);
		return data3;
 
	}

10.建立连接后发现客户端(服务端)回传消息每次都一样,我们需要考虑接收流和发送流的问题。

11.每个操作完成时记住要关闭流,但是在某些情况下不一样。在TCP通信,接收完数据关闭流会导致socket关闭?尚不知道什么原因。如果有回传消息,流对象要在所有操作完毕后再关闭流对象。

12.流的清空操作  os.reset  is.reset  有些时候并不好用?据说可以用BufferOutputStream,BufferInpputStream包装一下即可以?保持怀疑。

13.如何遍历key:value(key不是固定变量)这种结构的json数据。

参考操作:字符串截取获取key,再根据key获取value

猜你喜欢

转载自blog.csdn.net/ido1ok/article/details/83993706