java 流與 byte[] 的互轉(zhuǎn)操作
1. InputStream -> byte[]
引入 apache.commons.is 包
import org.apache.commons.io.IOUtils;
byte[] bytes = IOUtils.toByteArray(inputStream);
2. byte[] -> InputStream
InputStream inputStream = new ByteArrayInputStream(bytes);
補(bǔ)充知識(shí):byte[]與各種數(shù)據(jù)類型互相轉(zhuǎn)換示例
在socket開(kāi)發(fā)過(guò)程中,通常需要將一些具體的值(這些值可能是各種JAVA類型)轉(zhuǎn)化為byte[]類型,為此我總結(jié)了如下這個(gè)示例,貼出來(lái),以便經(jīng)常翻看
public class TestCase {
/**
* short到字節(jié)數(shù)組的轉(zhuǎn)換.
*/
public static byte[] shortToByte(short number) {
int temp = number;
byte[] b = new byte[2];
for (int i = 0; i < b.length; i++) {
b[i] = new Integer(temp & 0xff).byteValue();// 將最低位保存在最低位
temp = temp >> 8;// 向右移8位
}
return b;
}
/**
* 字節(jié)數(shù)組到short的轉(zhuǎn)換.
*/
public static short byteToShort(byte[] b) {
short s = 0;
short s0 = (short) (b[0] & 0xff);// 最低位
short s1 = (short) (b[1] & 0xff);
s1 <<= 8;
s = (short) (s0 | s1);
return s;
}
/**
* int到字節(jié)數(shù)組的轉(zhuǎn)換.
*/
public static byte[] intToByte(int number) {
int temp = number;
byte[] b = new byte[4];
for (int i = 0; i < b.length; i++) {
b[i] = new Integer(temp & 0xff).byteValue();// 將最低位保存在最低位
temp = temp >> 8;// 向右移8位
}
return b;
}
/**
* 字節(jié)數(shù)組到int的轉(zhuǎn)換.
*/
public static int byteToInt(byte[] b) {
int s = 0;
int s0 = b[0] & 0xff;// 最低位
int s1 = b[1] & 0xff;
int s2 = b[2] & 0xff;
int s3 = b[3] & 0xff;
s3 <<= 24;
s2 <<= 16;
s1 <<= 8;
s = s0 | s1 | s2 | s3;
return s;
}
/**
* long類型轉(zhuǎn)成byte數(shù)組
*/
public static byte[] longToByte(long number) {
long temp = number;
byte[] b = new byte[8];
for (int i = 0; i < b.length; i++) {
b[i] = new Long(temp & 0xff).byteValue();// 將最低位保存在最低位 temp = temp
// >> 8;// 向右移8位
}
return b;
}
/**
* 字節(jié)數(shù)組到long的轉(zhuǎn)換.
*/
public static long byteToLong(byte[] b) {
long s = 0;
long s0 = b[0] & 0xff;// 最低位
long s1 = b[1] & 0xff;
long s2 = b[2] & 0xff;
long s3 = b[3] & 0xff;
long s4 = b[4] & 0xff;// 最低位
long s5 = b[5] & 0xff;
long s6 = b[6] & 0xff;
long s7 = b[7] & 0xff;
// s0不變
s1 <<= 8;
s2 <<= 16;
s3 <<= 24;
s4 <<= 8 * 4;
s5 <<= 8 * 5;
s6 <<= 8 * 6;
s7 <<= 8 * 7;
s = s0 | s1 | s2 | s3 | s4 | s5 | s6 | s7;
return s;
}
/**
* double到字節(jié)數(shù)組的轉(zhuǎn)換.
*/
public static byte[] doubleToByte(double num) {
byte[] b = new byte[8];
long l = Double.doubleToLongBits(num);
for (int i = 0; i < 8; i++) {
b[i] = new Long(l).byteValue();
l = l >> 8;
}
return b;
}
/**
* 字節(jié)數(shù)組到double的轉(zhuǎn)換.
*/
public static double getDouble(byte[] b) {
long m;
m = b[0];
m &= 0xff;
m |= ((long) b[1] << 8);
m &= 0xffff;
m |= ((long) b[2] << 16);
m &= 0xffffff;
m |= ((long) b[3] << 24);
m &= 0xffffffffl;
m |= ((long) b[4] << 32);
m &= 0xffffffffffl;
m |= ((long) b[5] << 40);
m &= 0xffffffffffffl;
m |= ((long) b[6] << 48);
m &= 0xffffffffffffffl;
m |= ((long) b[7] << 56);
return Double.longBitsToDouble(m);
}
/**
* float到字節(jié)數(shù)組的轉(zhuǎn)換.
*/
public static void floatToByte(float x) {
//先用 Float.floatToIntBits(f)轉(zhuǎn)換成int
}
/**
* 字節(jié)數(shù)組到float的轉(zhuǎn)換.
*/
public static float getFloat(byte[] b) {
// 4 bytes
int accum = 0;
for ( int shiftBy = 0; shiftBy < 4; shiftBy++ ) {
accum |= (b[shiftBy] & 0xff) << shiftBy * 8;
}
return Float.intBitsToFloat(accum);
}
/**
* char到字節(jié)數(shù)組的轉(zhuǎn)換.
*/
public static byte[] charToByte(char c){
byte[] b = new byte[2];
b[0] = (byte) ((c & 0xFF00) >> 8);
b[1] = (byte) (c & 0xFF);
return b;
}
/**
* 字節(jié)數(shù)組到char的轉(zhuǎn)換.
*/
public static char byteToChar(byte[] b){
char c = (char) (((b[0] & 0xFF) << 8) | (b[1] & 0xFF));
return c;
}
/**
* string到字節(jié)數(shù)組的轉(zhuǎn)換.
*/
public static byte[] stringToByte(String str) throws UnsupportedEncodingException{
return str.getBytes("GBK");
}
/**
* 字節(jié)數(shù)組到String的轉(zhuǎn)換.
*/
public static String bytesToString(byte[] str) {
String keyword = null;
try {
keyword = new String(str,"GBK");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return keyword;
}
/**
* object到字節(jié)數(shù)組的轉(zhuǎn)換
*/
@Test
public void testObject2ByteArray() throws IOException,
ClassNotFoundException {
// Object obj = "";
Integer[] obj = { 1, 3, 4 };
// // object to bytearray
ByteArrayOutputStream bo = new ByteArrayOutputStream();
ObjectOutputStream oo = new ObjectOutputStream(bo);
oo.writeObject(obj);
byte[] bytes = bo.toByteArray();
bo.close();
oo.close();
System.out.println(Arrays.toString(bytes));
Integer[] intArr = (Integer[]) testByteArray2Object(bytes);
System.out.println(Arrays.asList(intArr));
byte[] b2 = intToByte(123);
System.out.println(Arrays.toString(b2));
int a = byteToInt(b2);
System.out.println(a);
}
/**
* 字節(jié)數(shù)組到object的轉(zhuǎn)換.
*/
private Object testByteArray2Object(byte[] bytes) throws IOException,
ClassNotFoundException {
// byte[] bytes = null;
Object obj;
// bytearray to object
ByteArrayInputStream bi = new ByteArrayInputStream(bytes);
ObjectInputStream oi = new ObjectInputStream(bi);
obj = oi.readObject();
bi.close();
oi.close();
System.out.println(obj);
return obj;
}
}
以上這篇java 流與 byte[] 的互轉(zhuǎn)操作就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Android在JNI中使用ByteBuffer的方法
- node.js中的buffer.Buffer.byteLength方法使用說(shuō)明
- Java將byte[]轉(zhuǎn)圖片存儲(chǔ)到本地的案例
- Mybatis在sqlite中無(wú)法讀寫(xiě)byte[]類問(wèn)題的解決辦法
- Java任意長(zhǎng)度byte數(shù)組轉(zhuǎn)換為int數(shù)組的方法
- Java byte數(shù)組操縱方式代碼實(shí)例解析
- 解決redis與Python交互取出來(lái)的是bytes類型的問(wèn)題
- 基于JSON實(shí)現(xiàn)傳輸byte數(shù)組過(guò)程解析
- Java ByteBuffer網(wǎng)絡(luò)編程用法實(shí)例解析
相關(guān)文章
解決Spring session(redis存儲(chǔ)方式)監(jiān)聽(tīng)導(dǎo)致創(chuàng)建大量redisMessageListenerConta
這篇文章主要介紹了解決Spring session(redis存儲(chǔ)方式)監(jiān)聽(tīng)導(dǎo)致創(chuàng)建大量redisMessageListenerContailner-X線程問(wèn)題,需要的朋友可以參考下2018-08-08
Java DefaultListableBeanFactory接口超詳細(xì)介紹
這篇文章主要介紹了Java DefaultListableBeanFactory接口,DefaultListableBeanFactory是整個(gè)bean加載的核心部分,是Spring注冊(cè)機(jī)加載bean的默認(rèn)實(shí)現(xiàn)2022-11-11
SpringBoot+RabbitMQ+Redis實(shí)現(xiàn)商品秒殺的示例代碼
本文主要介紹了SpringBoot+RabbitMQ+Redis實(shí)現(xiàn)商品秒殺,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
SpringBoot靜態(tài)資源CSS等修改后再運(yùn)行無(wú)效的解決
這篇文章主要介紹了SpringBoot靜態(tài)資源CSS等修改后再運(yùn)行無(wú)效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
SpringBoot中@ComponentScan的使用詳解
這篇文章主要介紹了SpringBoot中@ComponentScan的使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
Spring Security 中細(xì)化權(quán)限粒度的方法
這篇文章主要介紹了Spring Security 中細(xì)化權(quán)限粒度的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
springsecurity實(shí)現(xiàn)登錄驗(yàn)證以及根據(jù)用戶身份跳轉(zhuǎn)不同頁(yè)面
Spring?Security是一種基于Spring框架的安全技術(shù),用于實(shí)現(xiàn)身份驗(yàn)證和訪問(wèn)控制,本文介紹了如何使用Spring?Security,結(jié)合session和redis來(lái)存儲(chǔ)用戶信息,并通過(guò)編寫(xiě)特定的登錄處理類和Web配置,實(shí)現(xiàn)用戶登錄和注銷功能2024-09-09
Mybatis-plus 批量插入太慢的問(wèn)題解決(提升插入性能)
公司使用的Mybatis-Plus操作SQL,用過(guò)Mybatis-Plus的小伙伴一定知道他有很多API提供給我們使用,但是批量插入大數(shù)據(jù)太慢應(yīng)該怎么解決,本文就詳細(xì)的介紹一下,感興趣的可以了解一下2021-11-11

