当前位置 博文首页 > @王某人:最全IO---输入输出流---java
in,out
? ? 文件和目录路径名的抽象表示。
? ?? ?为了在不同操作系统上执行,提供了静态属性
? ?? ?File.pathSeparator ? ?分好
? ?? ?File.separator? ?? ?? ??? 斜杠
? ?? ?File?(String?pathname)
? ?? ?? ?? ?通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
? ?? ?File?(File?parent, String?child)
? ?? ?? ?? ?先传过来一个文件,然后在此文件中创建文件
? ?? ?? ?? ?File parent 也可以是String parent ,就看是传进对象还是传进路径
? ?? ?? ?? ?creatNewFile()? ? ? ? ? ? 创建成功返回True,如已经存在则返回False
? ?? ?? ?? ?mkdir() ? ?? ?? ?? ?? ?? ?? ?? 创建文件夹,跟名字没关系
? ?? ?? ?? ?mkdirs() ?? ?? ? ?? ?? ?? ? ? 创建层级目录,中间用“/”隔开
? ?? ?? ?? ?delete() ? ?? ?? ?? ?? ?? ?? ??删除文件,成功返回True,失败返回False
? ?? ?? ?? ?exists() ? ?? ?? ?? ?? ?? ?? ??判断当前文件是否存在
? ?? ?? ?? ?getAbsolutePath() ? ? ?返回抽象路径名的绝对路径字符串
? ?? ?? ?? ?getName()? ?? ?? ? ???返回抽象路径的文件名称
? ?? ?? ?? ?getParent()? ?? ?? ???返回此抽象路径的父文件路径
? ?? ?? ?? ?getParentFile()? ?? ?返回父抽象路径名
? ?? ?? ?? ?getPath() ? ?? ?? ?? ?? ?? ?获取路径
? ?? ?? ?? ?length()? ?? ?? ?? ?? ?? ????文件长度(字节长度)
? ?? ?? ?? ?isDirectory() ? ?? ?? ? ? ?判断是否是文件夹
? ?? ?? ?? ?isFile() ? ?? ?? ?? ?? ?? ?? ?判断是否是文件
? ?? ?? ?? ?listFiles() ? ?? ?? ?? ?? ?? ?获取当前文件夹里的所有文件对象,返回抽象路径名数组
? ?? ?? ?? ?renameTo?(File?dest) 重命名文件
public class Demo1 {
public static void main(String[] args) throws IOException {
File d = new File("D://");
File[] files = d.listFiles();
listFiles(files);
}
public static void listFiles(File[] files ){
if(files!=null && files.length>0){
for (File file: files) {
if (file.isFile()){
if (file.getName().endsWith(".png")){
System.out.println("找到了一个avi文件"+file.getAbsolutePath());
}
}else{
File[] files2 = file.listFiles();
listFiles(files2);
}
}
}
}
}
文件过滤器案例:
?
?
? ? ?绝对路径:从盘符开始,一个完整的路径,例如:C://a.txt
? ? ?相对路径:在Java代码中是相对于项目目录路径,这是一个不完整的便捷路径,在开发中常用
?
? ? ?概述:可以将这种数据传输方式,看做是一种数据的流动,按照流动的方向分为输入Input和输出Output,Java中的IO操作主要指的是IO包下的一些常用类的使用,通过这些类,可以对数据进行读取(输入Input)和写入(输出Output)
? ? ?按照传输的方向:输入流和输出流
? ? 按照传输数据类型:字节流和字符流
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?顶级父类
? ? 字节流:
? ? --- 输入流:? ? ?InputStream
? ? --- 输出流:? ? OutputStream
? ?字符流:
? ? --- 输入流:? ? ?Reader
? ? --- 输出流:? ? ?Writer
? ? 一切皆字节:计算机中任何数据都是以二进制存储
? ? 数据传输时,也都是以二进制方式存储的
? ? 后续的任何流,底层都是二进制
? ? ?此抽象类是表示输出字节流的所有类的超类。
? ? ? ? ? ?close() ? ? ? ? ? ?关闭流,使用完毕后必须关闭流
? ? ? ? ? ?flush() ? ? ? ? ? ?刷新此输出流并强制写出任何缓冲的输出字节。
? ? ? ? ? ?nullOutputStream() ? ? ? ? ? ?返回一个新的OutputStream,丢弃之前所有的字节
? ? ? ? ? ?write?(byte[]?b) ? ? ? ? ? ?从指定的字节数组写入到此输出流
? ? ? ? ? ?write?(byte[]?b, int?off, int?len) ? ? ? ? ? ?从指定字节数组的off开始的Len个字节写入到此输出流
? ? ? ? ? ?write(int b) ? ? ? ? ? ?将指定字节写入,24个高位被忽略
? ? ?构造方法:
? ? ? ? ? ?FileOutputStream?(File?file) ? ? ? ? ? ?创建输出流,传入指定的文件对象
? ? ? ? ? ?FileOutputStream?(File?file, boolean?append)? ? ? ?第二参数传入布尔值,指定是否在原
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?来的内容往后写,还是重新开始写
? ? ? ? ? ?FileOutputStream?(String?name)? ? ? ? ? ?创建输出流,传入指定的文件名称或路径
? ? ? ? ? ?FileOutputStream?(String?name,boolean append)? ? ? ? ? ? 布尔值原理同上
? ? ?方法:Close和write方法和OutputStream的方法相同
? ? ? 此抽象类是表示输入字节流的所有类的超类。
? ? ? ? ? ?close() ? ? ? ? ? ?关闭流,使用完毕后必须关闭流
? ? ? ? ? ?read() ? ? ? ? ? ?读取字节数据,返回值为int(0-255),返回-1表示后面无数据
? ? ? ? ? ?read?(byte[]?b) ? ? ? ? ? ?从输入流中读取一些字节数并将它们存储到缓冲区数组 b 。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?返回int为实际读取的字节数量,-1表示没有数据
? ? ? ? ? ?read?(byte[]?b, int?off, int?len)? ? ? ? ? 从此输入流数组第off开始读取len个数据
? ? ? ?构造方法:
? ? ? ? ? ?FileInputStream?(File?file) 传入一个文件对象,创建一个文件的读取输入流
? ? ? ? ? FileInputStream?(String?name) 传入指定的文件名或对象,创建输入流
? ? ? 方法:
? ? ? ? ? ?close和read方法同InputStream的方法相同
?
FileInputStream fis = new FileInputStream("D://a.txt");
while (true){
byte b = (byte) fis.read();
if(b==-1){
break;
}
System.out.println((char)b);
}
fis.close();
byte[] bytes = new byte[8];
int len = fis.read(bytes);
System.out.println(new String(bytes,0,len));
len = fis.read(bytes);
System.out.println(new String(bytes,0,len));
? ? ? ? ? 避免出现读取长度不够,自动补齐的情况
?
? ? 字符输出流,用于写入字符流的抽象类。避免字节流读取半个文字,造成乱码
? ? 方法:
? ? ? ? ? writer(char[]?cbuf) ? ? ? ? ? 写入一个数组
? ? ? ? ? write?(char[]?cbuf, int?off, int?len)? ? ? 写入一个数组的一部分
? ? ? ? ? writer(int c) ? ? ? ? ? 写入一个字符
? ? ? ? ? writer(String str)? ? ? ? ? 写入一个字符串
? ? ? ? ? write?(String?str, int?off, int?len) ? ? ? ? ? 写入一个字符串的一部分
? ? ? ? ? close() ? ? ? ? ? 关闭流
? ? ? ? ? flush() ? ? ? ? ? ? ? ? 刷新流
? ? ? ? ? append?(char?c)? 追加到文件
? ? ?构造方法:
? ? ? ? ? ?与FileoutStream的构造方法差不多,多一个
? ? ? ? ? ??FileWriter?(String?fileName, Charset?charset)? ? ?指定字符集去读取
? ? ? ? ? ??FileWriter?(String?fileName, Charset?charset, boolean?append)
? ? ? ? ? ?FileWriter?(File?file, Charset?charset)
? ? ? ? ? ?FileWriter?(File?file, Charset?charset, boolean?append)
? ? ?方法:
? ? ? ? ?同Writer
? ? ? ?字符输入流,用于读取字符流的抽象类
? ? ? ?方法:
? ? ? ? ? ?close()? ? ?关闭流
? ? ? ? ? read()? ?读取一个字符
? ? ? ? ??read?(char[ ]?cbuf) 读取一组字符
? ? ? ? ?read?(char[]?cbuf, int?off, int?len) 读取一组字符的一部分
? ? ? ?都也差不多
? ?flush()刷新管道:舒心缓存,将文字写入,close()方法会自动刷新,不刷写不进去
?
? ? 将字节流装饰为字符流 :使用了装饰者设计模式
?
FileOutputStream fos = new FileOutputStream("D://a.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos);
FileInputStream fis = new FileInputStream("D://a.txt");
InputStreamReader isr = new InputStreamReader(fis);
? ? ? PrintStream和PrintWriter类:
? ? ?方法:使用print和println
? ? 区别:PrintWriter需要刷新管道
? ? ?可以将字节流转换成打印流
? ? ?将字符输入流,转换为带有缓存,带有一次读一行的缓存字符读取流
? ? ? ? ? ? ? ?readline(): 一次读取一行 读到结尾返回null
? ? ? ? ? ? ?收集日常异常日志:
? ? ? ? ? ? ?写在try - catch 下
?
PrintWriter pw = new PrintWriter("D://a.txt");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
pw.println(sdf.format(new Date()));
e.printStackTrace(pw);
pw.close();
? ? ? 基于Map 存储的是 键=值
? ? ? ? ? ? load() 可以传入字节流或者字符流,读取
? ? ? ? ? ?store() 将map集合所有的键值对,变成Properties文件,第二个参数是注释“#”开头
? ?序列化与反序列化
? ? ? ? 序列化:将对象存储在文件中
? ? ? ? ?实现Serializable接口
? ? 部分属性序列化:
? ? ? ? 1.在不想被序列化的属性前加上transient修饰词
? ? ? ? 2.在不想被序列化的属性前加上static修饰词
? ? ? ? 3.在实体类中加上writeObject()和readObject()方法
? ? ? ? 4.Externalizable接口实现,他继承自Serializable接口,需要实现readExternal 和
writerExternal方法
?
try-with-resources
? ? ?在try小括号里面声明的资源,会自动在finally里面释放
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?