import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
/*
* 1.图片读到字节数组
* 2.字节数组写出到文件
*/
public class test10 {
public static void main(String[] args) {
//图片转字节数组
byte[] datas=fileToByteArray("timg.jpg");
fileToByteAttay(datas,"c.jpg");
}
/*
* 图片到字节数组
* 1.图片到程序 FileInputStream
* 2.程序到字节数组 ByteArrayOutputStream
*/
public static byte[] fileToByteArray(String filePath) {
//源和目的地
File src=new File(filePath);
byte[] dest=null;
ByteArrayOutputStream baos=null;
//流
InputStream is=null;
/*在程序内部所释放资源的方法
* try(InputStream is=new FileInputStream(src);
* OutputStream baos=new ByteArrayOutputStream();){
* 直接在try()定义且声明流,可以不用使用close来手动释放流
*/
try {
is=new FileInputStream(src);
baos=new ByteArrayOutputStream();
//具体操作(读)
byte[] flush=new byte[1024*10];
int len=-1;
while((len=is.read(flush))!=-1) {
baos.write(flush,0,len);
}
baos.flush();
return baos.toByteArray();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
//释放
try {
if(is!=null)
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return null;
}
//字节数组到图片
//1.读取字节数组到程序 ByteArrayInputStream
//2.程序写出到文件 FileOutputStream
public static void fileToByteAttay(byte[] src,String filePath) {
//源
InputStream is=null;
FileOutputStream os=null;
//流
try {
is=new ByteArrayInputStream(src);
os=new FileOutputStream(filePath);
//具体操作(读)
byte[] flush=new byte[1024];//缓冲容器
int len=-1;
while((len=is.read(flush))!=-1) {
os.write(flush,0,len);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
if(os!=null)
os.close();
if(is!=null)
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
对前面代码的封装
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.Closeable;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/*
* 1.封装拷贝
* 2.封装释放资源
*/
public class FileUnit {
public static void main(String[] args) {
//文件到文件
try {
InputStream is=new FileInputStream("a.txt");
OutputStream os=new FileOutputStream("a-copy.txt");
copy(is,os);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
byte[] datas=null;
//文件到字节数组
try {
InputStream is=new FileInputStream("c.jpg");
ByteArrayOutputStream os=new ByteArrayOutputStream();
copy(is,os);
datas=os.toByteArray();
System.out.println(datas.length);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//从字节数组到文件
try {
InputStream is=new ByteArrayInputStream(datas);
OutputStream os=new FileOutputStream("c-copy.jpg");
copy(is,os);
System.out.println(datas.length);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//对接输入和输出流
public static void copy(InputStream is,OutputStream os) {
try {
//操作:分段读取
byte[] flush=new byte[1024];//缓冲容器
int len=-1;
while((len=is.read(flush))!=-1) {
os.write(flush,0,len);
}
os.flush();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {//输入输出流的释放:先打开的后关闭
try {
if(is!=null)
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if(os!=null)
os.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
close(is,os);
}
}
}
//释放资源
public static void close(InputStream is,OutputStream os) {
try {
if(is!=null)
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if(os!=null)
os.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//释放资源 可选择关闭一个或几个流
//可变参数Closeable
public static void close(Closeable... ios) {
for(Closeable io:ios) {
try {
if(io!=null)
io.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}