Java学习知识点小结4(IO)

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.装饰器设计模式:(扩展)
一.抽象组件:需要装饰的抽象对象(接口或抽象父类 ) ,例如饮料类的价格与信息
二.具体组件:需要装饰的对象 例如一个饮料咖啡类
三.抽象装饰类:包含了对具体组件的引用以及共有的方法 例如咖啡添加的配料
四.具体装饰类:被装饰的对象 ,例如牛奶咖啡,鸳鸯咖啡

装饰实际是类与类的关系,在一个类的构造方法内将另一个类作为参数传入进来。

  1. 字节缓冲流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包,使用工具类

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值