1.IO核心类:
File文件类,InputStream字节输入流,OutputStream字节输出流,Reader字符输入流,Writer字符输出流
Closeable关闭流接口,Flushable刷新流接口,Serializable序列化接口
2.流分类:
节点流:直接从数据源读取数据,处于io操作第一线(如FileInputStream,ByteArrayInputStream)
处理流:通过对其他流的处理提高程序的性能(BufferedInputStream)
3.创建文件的方式:
File file1=new File(“path”);
//路径可以是绝对路径或相对路径(文件分割符使用/)有盘符是绝对路径
File file=new File(file1(父对象),文件名(子名称));
//在file1目录下创建文件
4.File方法:
获得文件上次修改时间: long time=file1.lastModified();
Date d=new Date(time);
System.out.println(d);
返回路径:getPath()返回构建时的路径
getAbsolutePath()返回绝对路径
getParent()返回父路径
判断状态:exists();
isFile();是否文件
isDirectory();是否文件夹
返回长度:length();返回文件long类型的字节数,不能返回文件夹的大小
创建文件:createNewFile();不存在创建文件,已存在抛出异常
delete();存在删除文件,不存在抛异常,返回值为boolean
创建目录:mkdir();//上一级目录必须存在
mkdirs();//所有目录一起创建(使用这个)
列出下级: list();//列出下级名称,返回一个字符数组
listFiles()//列出下级子文件,返回一个文件数组
列出子孙级:递归方法打印名称,递归头是文件是否为目录或文件是否为空
打印文件大小:在方法外部定义一个长度变量,如果传入的是文件则直接返回该文件的length()方法,是目录则递归累加子孙级文件大小
5.字符集编码与解码
String s=“四毛傻曈”
byte[] datas=s.getBytes();//将字符串编码为字节数组
s=new String(datas)//解码
乱码的原因:字节数不够,字符集不同
6**.IO流类抽象父类**:
InputStream 常用方法:int read();读取一个字节的数据, void close();关闭输入流对象
OutputStream 常用方法: void write(int n);向目的地中写入一个字节,void close();关闭输出流对象
Reader 常用方法: int read();读取一个字符的数据,并将字符的值作为int类型返回(Unicode值)。未读出字符或结束则返回-1。
Writer 常用方法: void write(int n): 向输出流中写入一个字符
7.IO流操作步骤:创建源-选择流-操作-释放资源
节点流:8~12
8.FileInputStream:File file=new File(地址);
InputStream is = null;//多态
is=new FileInputStream(file);创建流
is.read() //单个字节读取 ,结束返回-1
也可以定义一个缓冲数组 byte[] flush=new byte[1024] ,然后len=is.read(flush)按数组大小读取,len接收字节个数
if(is!=null) { is.close();} //避免空指针异常,如果上面创建失败不执行
9.FileOutputstream:与上面同理,具体看博客
10.Reader和InputStream操作类似,只不过字节数组变为了字符数组,纯字符文本选择reader避免乱码
11.字节数组流 ByteArray(Input,OutputStream)
FileInputStream是把文件当做数据源。ByteArrayInputStream则是把内存中的”某个字节数组对象”当做数据源,字节数组流不用释放。
ByteArrayOutputStream构造方法不用指定目的地(源),而是写完后将调用toByteArray()创建一个新分配的字节数组。
12.字节数组流与文件字节流的一些方法:
ByteArrayInputStream(byte[] buf) //构造方法,将buf 字节数组内的内容读取到程序中
FileInputStream(File f)//构造方法,读取文件f的内容
FileInputStream的read方法:read(byte[] b) ,b是自定的一个数组缓冲区,每次从文件中读数组大小的字节数
ByteArrayOutputStream的write方法:
os.write(byte[] b, int off, int len); //将数组b的内容写进自己的缓冲区里
os.toByteArray();//将缓冲区变为新分配的字节数组
FileOutputStream的write方法:
在构造函数里定义了新文件,os.write(byte[] b, int off, int len);直接将数组b写入新文件里
FileOutputStream的构造方法内有个布尔变量append,可以规定write方法对文件覆盖或续写
13.java可变长的形参声明格式:dataType…name
14.在try()里面声明IO类则不用手动释放,系统自动释放
处理流:
15.装饰器设计模式:(扩展)
一.抽象组件:需要装饰的抽象对象(接口或抽象父类 ) ,例如饮料类的价格与信息
二.具体组件:需要装饰的对象 例如一个饮料咖啡类
三.抽象装饰类:包含了对具体组件的引用以及共有的方法 例如咖啡添加的配料
四.具体装饰类:被装饰的对象 ,例如牛奶咖啡,鸳鸯咖啡
装饰实际是类与类的关系,在一个类的构造方法内将另一个类作为参数传入进来。
- 字节缓冲流BufferedInputStream
是字节流InputStream的装饰类:
BufferedInputStream bis=new BufferedInputStream(new FileInputStream(path),8k);
//path是节点流路径,8k是自定义缓冲区的大小,其他操作与节点流一致
17.字符缓冲流BufferedReader
是字符流Reader的装饰类 :
BufferedReader r=new BufferedReader(new FileReader(f1));
BufferedReader子类有新增方法readLine(),逐行读取,读不到时返回null
字符流加上缓冲装饰类能逐行操作!
18.转换流
InputStreamReader(System.in) 将字节流转换为字符流,System.in是一个字节流,可以在后面自己规定格式例如UTF-8
在有中文等双字节语言或者需要指定字符编码集的情况,必须用到InputStreamReader将字节流转化为字符流!
19.数据流
是字节流的装饰类 可以读取指定的类型的数据
DataOutputStream(OutputStream o)// 数据输出流将Java基本数据类型写到底层输出流o
DataInputStream(InputStream i)
数据流遵循先写出后读取,读取顺序与写出顺序一致
20.对象流
对象要implements java.io.Serializable接口才能进入流
对象类通过实现Serializable或Externalizable接口来控制它们是如何序列化
ObjectInputStream(InputStream i) //创建从指定的InputStream i读取的ObjectInputStream
对象流反序列化时是必须手动还原数据类型
21.A instanceof B
前一个A是一个引用变量,后一个B通常是一个类(接口),用于判断前面的对象是否是后面的类,或者其子类、实现类的实例。是返回true,否则返回false
22.打印流
PrintStream(OutputStream out,true)//true代表自动刷新
PrintStream(File file)// 创建file对应的FileOutputStream,然后将该FileOutputStream作为PrintStream的输出流,不自动flush
print()参数转换成字符串之后,再写入到输入流,print实际调用的是write函数
23.文件分割
RandomAccessFile raf=new RandomAccessFile(f,“r”);//f为文件,r为读取模式
raf.seek(n);//从第n个字节开始读取
具体看博客
24.博客:导入CommonsIOjar包,使用工具类