数据源从硬盘文件转为字节数组(内存中),流的关闭交由gc控制,其close方法是空方法,写不写均可。
一切对象均可转变为字节数组。
ByteArrayInputStream(byte[] bytes)
ByteArrayOutputStream()
ByteArrayOutputStream(int size) 创建一个新的字节数组输出流(具有指定大小的缓冲区容量,以字节为单位)
ByteArrayOutputStream实现将数据写入字节数组的输出流。当数据写入缓冲区时,缓冲区将自动增长,可以使用toByteArray()(创建一个新分配的字节数组)及toString()(使用平台默认字符集将字节数组转为字符串)检索数据。
toByteArray是子类特有方法,不能使用多态。
import java.io.*;
public class TestIO {
/**
* 图片写入字节数组
* 字节数组输出到文件
*/
public static void main(String[] args) {
fileToByteArray("1.jpg");
byteArrayToFile(byteStore,"2.jpg");
}
private static byte[] byteStore = new byte[1024 * 100];
public static void byteArrayToFile(byte[] bytes, String filePath) {
FileOutputStream fos = null;
try {
fos = new FileOutputStream(filePath);
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
int len = -1;
byte[] byteBuffer = new byte[1024];
while ((len = (bais.read(byteBuffer))) != -1) {
fos.write(byteBuffer, 0, len);
}
} catch (Exception ex) {
ex.printStackTrace();
}finally {
if(null!=fos){
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void fileToByteArray(String filePath) {
FileInputStream fis = null;
try {
fis = new FileInputStream(filePath);
ByteArrayOutputStream boas = new ByteArrayOutputStream();
byte[] bytes = new byte[1024];
int len = -1;
while ((len = fis.read(bytes)) != -1) {
boas.write(bytes, 0, len);
}
byteStore = boas.toByteArray();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != fis) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
jdk1.7推出try...with resource方法
try(is;os){
...
}
这样可以不用关闭流,系统能够自动关闭流。
网友评论