流分为字节流和字符流。字节流是按照字节读取数据。字符流按照字符读取数据,因为文件的编码不同,从而有了对字符进行高效操作的字符流对象。字符流底层还是基于字节流操作,自动搜寻了指定的码表。
IO的复制操作:先把文件读取到程序,然后再把程序输出到文件。
package IO;
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.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/**
* IO 图片的拷贝
*
* @author zhaoy
*
*/
public class TestCopy1 {
/**
* 图片读取到字节数组
*
* @param path
* @return
*/
public static byte[] fileToByetArray(String path) {
// 创建源
File src = new File(path);
// 选择流
InputStream is = null;
ByteArrayOutputStream os = null;
try {
is = new FileInputStream(src);
os = new ByteArrayOutputStream();
// 操作
byte[] flush = new byte[1024];
int len = -1;
while ((len = is.read(flush)) != -1) {
os.write(flush, 0, len);
}
os.flush();
return os.toByteArray();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭流
if (os != null) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
public static void byteArrayToFile(byte[] datas, String path) {
// 创建源
File dest = new File(path);
// 选择流
InputStream is = null;
OutputStream os = null;
try {
is = new ByteArrayInputStream(datas);
os = new FileOutputStream(dest);
// 操作
byte[] flush = new byte[10];
int len = -1;
while ((len = is.read(flush)) != -1) {
os.write(flush, 0, len);
}
os.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭源
if (os != null) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
byte[] datas = fileToByetArray("src/Img.png");
byteArrayToFile(datas, "src/p-Img.png");
}
}