Java 21-1 IO技术输出输入流(缓冲 异常处理)
2019-01-29 本文已影响0人
第二套广播体操
需求:
怎么操作文件数据
使用io流对象 而且文件数据都是字节存在
学习了可以操作文件的字节流
out是写入文件 in是读入内存
OutPutStream
|--FileOutPutStream
![](https://img.haomeiwen.com/i14328939/48f4bc593d14c065.png)
InPutStream
|--FilePutStream
![](https://img.haomeiwen.com/i14328939/0a6f659537499901.png)
为了提高操作效率引用缓冲区
OutPutStream
|--FileOutPutStream
|--FilterOutPutStream
|--BufferedOutPutStream
![](https://img.haomeiwen.com/i14328939/58f9edcce28be762.png)
InPutStream
|--FileInPutStream
|--FilterInPutStream
|--BufferedInPutStream
![](https://img.haomeiwen.com/i14328939/05a6b7b45b49ec5e.png)
FileOutPutStream
创建字节输出流对象,用于操作文件,在对象初始化时,必须明确数据存储的目的地
FileOutputStream fos=new FileOutputStream("D:\\实验1\\test1.txt",true);
true为打开 append的续写功能 防止每一次写入文件都被重新覆盖
例:
public class FileOutPutStream_Test1 {
public static void main(String[] args) throws IOException {
File file=new File("D:\\实验1");//D:冒号
if (!file.exists())
{ file.mkdir();}
// file.createNewFile();这个是创建文件 我们要创建文件夹
FileOutputStream fos=new FileOutputStream("D:\\实验1\\test1.txt",true);
// 续写
String s=System.lineSeparator()+"abcds";
// Sys系统分割符是String类型
byte[] b=s.getBytes();
fos.write(b);
// 释放资源
fos.close();
}
}
获取一个想要的指定文件的集合 获取文件下(包含子目录)的所有.java文件对象 并储存到集合中
* 思路:
* 1.包含子目录 需要递归
* 2.在递归中需要过滤器
* 3。满足条件 都添加到集合中
public class FileOutPutStream_Test2 {
public static void main(String[] args) {
File file=new File("D:\\it");
List<File> list=fileList(file);
for (File f:
list) {
System.out.println(f);
}
}
public static List<File> fileList(File file){
List<File> list=new ArrayList<>();
FileFilter filter=new FilFilterBySuffix(".java");
// 过滤器
getJavaList(file,list,filter);
return list;
}
/*
定义一个获取指定过滤器条件的文件集合
dir 文件目录
al 集合
filter 过滤器
多级目录下要使用相同的集合和过滤器那么不要在递归方法中定义 要不断的传递
*/
public static void getJavaList(File dir, List<File> list, FileFilter filter) {
/*
* 通过listFile方法 获取所有当前文件下的文件和文件夹对象*/
File[] files=dir.listFiles();
// 如果是文件夹 就递归 如果不是就进行过滤器过滤
for (File f :
files) {
if (f.isDirectory())
getJavaList(f,list,filter);
else {
if(filter.accept(f))
// 调用过滤器方法
{list.add(f);}
// 添加到集合中
}
}
}
}
过滤器
public class FilFilterBySuffix implements FileFilter {
private String suffix;
public FilFilterBySuffix(String suffix) {
this.suffix = suffix;
}
@Override
public boolean accept(File pathname) {
return pathname.getName().endsWith(suffix);
}
}
异常处理
public class IoExceptionDemo_Test {
public static void main(String[] args) {
FileOutputStream fos=null;
try {
fos = new FileOutputStream("实验1\\1.txt");
fos.write("asada".getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
if(fos!=null)//一定要加判断 数据库释放资源前判断
try {
//如果没有成功创建对象 那么fos=null;finally一定运行 所以没有办法调用close();
// 造成NullPointerException 空指针异常
fos.close();
} catch (IOException e) {
throw new RuntimeException("e");
}
}
}
}
FileInPutStream
public class FileInPutStream_Test1 {
public static void main(String[] args) {
File file=new File("D:\\实验1\\test1.txt");
FileInputStream fis=null;
try {
fis=new FileInputStream(file);
byte[] buf=new byte[fis.available()];
// 文件大小一样的缓冲区
fis.read(buf);
System.out.println(new String(buf));
}catch (IOException e){
}finally {
if (fis!=null) {
try {
fis.close();
} catch (IOException e) {
throw new RuntimeException("不好使");
}
}
}
}
}
复制文件
public class FileInPutStream_Test2 {
public static void main(String[] args) {
copyPictureByBuf();
}
private static void copyPictureByBuf() {
FileInputStream fis=null;
FileOutputStream fos=null;
try {
fis=new FileInputStream("D:\\PanDownload.rar");
fos=new FileOutputStream("D:\\PanDownload123.rar");
byte[] bytes=new byte[1024];
int len=0;
while ((len=fis.read(bytes))!=-1)
fos.write(bytes,0,len);
}catch (IOException io){
// 异常日志
}
finally {
if (fis!=null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fos!=null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
BufferedOutputStream
BufferedInputStream
缓冲器
public class BufferStream_Test {
public static void main(String[] args) {
coppyByRar();
}
private static void coppyByRar() {
InputStream ips=null;
OutputStream ops=null;
BufferedInputStream bis=null;
BufferedOutputStream bos=null;
try {
ips=new FileInputStream("D:\\PanDownload.rar");
ops=new FileOutputStream("D:\\PanDownload789.rar");
bis=new BufferedInputStream(ips);
bos=new BufferedOutputStream(ops);
byte[] buf=new byte[2048];
int len;
while ((len=bis.read(buf))!=-1)
// 将文件按字节的形式读入到buf中
bos.write(buf,0,len);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ips!=null) {
try {
ips.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (ops!=null) {
try {
ops.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}