发布时间:2024-02-19 16:00
IO流,主要是用于处理数据的传输,包含字节输入流,字节输出流,字符输入流,字符输出流,今天着重说下字节流;
所有的字节输入流继承 InputStream
所有的字节输出流继承 OutputStream
使用输入流输出流时注意是否需要成对出现,就好比大管道小管道似的,输入管道要与输出管道匹配才行。
使用以上介绍的输入输出流,简单的测试代码
public static void main(String[] args) {
try ( InputStream inputStream =new FileInputStream(\"E:\\\\测试.txt\");//读取文件输入流
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);//声明BufferedInputStream
OutputStream outputStream = new FileOutputStream(\"E:\\\\测试输出.txt\");
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream)
){
//每次读取1024个字节
byte[] buffer=new byte[1024];
int len;
//读到文件末尾时返回-1
while ((len = bufferedInputStream.read(buffer))!=-1){
//b - 数据。
//off - 数据中的起始偏移量。
//len - 要写入的字节数。
bufferedOutputStream.write(buffer,0,len);
}
bufferedOutputStream.flush();//刷新此输出流,并强制将任何缓冲的输出字节写入流
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
读取固定的字节数,效率上肯定是有一定的影响的
public static void main(String[] args) {
try(InputStream inputStream =new FileInputStream(\"E:\\\\测试.txt\");//读取文件输入流
ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
int len = -1;
byte[] buffer = new byte[1024];
while ((len = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, len);
}
System.out.println(outputStream.toString(\"gb2312\"));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
第一节说输入输出流成对的出现,接着使用StreamUtils或者Hutool工具转换文件输入流为字节数组
public static void main(String[] args) {
try(InputStream inputStream =new FileInputStream(\"E:\\\\测试.txt\");//读取文件输入流
ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
byte[] bytes = StreamUtils.copyToByteArray(inputStream);
outputStream.write(bytes);
System.out.println(outputStream.toString(\"gb2312\"));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
使用流操作时,就一定要注意资源是否关闭,如果是手动关闭,则需要注意的是关闭的顺序,遵循后打开的流先关闭的顺序。
如果非正常关闭,则会造成资源的浪费,文件的写入错误,如zip文件会出现 “不可预料的压缩文件末端”导致无法打开。