目录
目录的操作 (windows文件夹), 在java中目录也被当作一个文件,方式使用没有区别
close和flush都可以实现写入,但是close相等于flush我刷新还有个关闭
InputStreamReader上面的问题用转换流后得到解决
文件
什么是文件
文件流
常用的文件操作
创建文件方式一
创建文件方式二
创建文件方式三
这里这样写也是可以的,反斜杠
tip:为什么new file 了还有执行createNewFile?
new File的时候其实是在内存中创建了文件对象, 还没有在磁盘中, 当执行createNewFile的时候才是往磁盘中写入
获取文件的信息 (常用)
目录的操作 (windows文件夹), 在java中目录也被当作一个文件,方式使用没有区别
Io流
io原理即流的分类
字节流和字符流那个效率高呢?字符流(应用于文本文件等), 因为字符流的单位比字节大, 至于一个字符等于多少个字节需要看他的编码格式; 那为什么还用字节流呢? 因为还有一些二进制文件,例如声音文件,视频文件, word文件
字节流常用子类
文件输入流
演示读取文件(这种方法不能有汉字,因为是一个字节一个字节读的, 汉字是三个字节,只读了一个, 就会乱码)
单个字节的读取,效率比较低
改为字节数组的方式,效率比较快
文件输出流
文件拷贝
一定要使用write(buf,0,readLen)这个方法写, 如果用 write(buf),在最后几个字节传输长度不够数组长度但是还是传了这么多的时候,图片不会显示
此时运行可能会报这个错,这是c盘需要管理员权限才能访问 , 所以可以改用其他盘上面测试
字符流
FileReader
第二种方式, 效率会高一点
FileWriter
不关流不会成功写入
第二种数组写入
第三种写入
第四种写入
第五种写入
close和flush都可以实现写入,但是close相等于flush我刷新还有个关闭
节点流和处理流(包装流)
因为BufferedWriter的构造器传进去的是Writer, 也就是说继承了 Writer的子类都可以传进去, 这也是一种设计模式叫修饰器模式
处理流修饰器模式模拟
现在上面的FileReader和StringReader相当于节点流, 对单个数据源类别进行读取, 如果我们要扩展怎么扩展呢
将Reader作为一个属性, 同时通过构造器传进来, 因为继承了Reader就可以调用它的方法
现在给Reader_加两个未实现的方法
在处理流里面, 调用传进来的字节流的方法
在处理流对象中就可以进行调用到字节流的读取
扩展:上面是示意写了两个方法, 其实可以统一为read:
其他的对应跟着改, 让他动态绑定去实现
节点流和处理流的区别
BufferedReader使用方法
BufferedWriter使用方法
文本文件拷贝的案例
字节处理流
字节处理流视频拷贝使用方法
对象流
对象流的使用
序列化
反序列化
对象流的细节
标准输入输出流
转换流
字节转换为字符
案例:
目前有一个utf-8的文件,去读取里面文件内容, 可以看到能正确读取
把它转为国标码之后(这个国标码每个国家有自己的国标码, 根据当前系统来看的, 如果当前系统用的是gbk那么国标码就是gbk)
现在再来读取就会乱码
具体实现
InputStreamReader
上面的问题用转换流后得到解决
OutputStreamWriter
字节打印流
打印到文件
字符打印流
打印到显示器, 因为传入的是标准输出
输出到指定文件中去
如果不关流, 文件是进不去的
Properties
传统的方式读取
传统的方法如果我们要获取指的的值,只能自己写判断, 其他的不要
用Properties