路径分隔符:pathSeparator
win:是一个;
lin:是一个:
名称分隔符:separator
win:\
lin:/
"C"+File.separator+"develop"...
转义符:\
绝对路径:
盘符开始的路径C:\\users\\a.txt
相对路径:
相对根目录简化a.txt
注意:路径不区分大小写
父路径和子路径创建file:
灵活,可更改
父路径是File,好处是 可调用File方法进行一些操作
File类获取功能方法:
File类判断功能方法:
File类创建删除功能的方法:
创建文件时,如果路径不存在,抛出IO异常
遍历目录的方法:
---------------------------------
递归:
要有限定条件,否则会有栈内存溢出
构造方法禁止递归
-----------------------------------
过滤器: listFiles方法的重载--listFiles(FileFilter)
实现过滤接口FileFilter,重写accept方法(或者直接匿名内部类的方式实现)
过滤规则:例如,accept中判断File对象是否是以.java结尾
过滤器中的accept方法是谁调用的?
listFiles方法一共做了3件事:
1.对构造方法传递的目录进行遍历,获取目录中每一个文件/文件夹,转为File对象
2.调用参数传递的过滤器中的方法accept
3.把得到的每一个File对象,传递给accept的参数pathname
accept方法返回布尔值,true:把传递过去的File对象保存到File数组中;false不会
accept方法的参数pathname是什么?
IO:
流:数据(字符,字节)1字符=2字节 1字节=8位
以内存作为第一人称
输入:硬盘->内存 读取
输出:内存-硬盘 写入
-----------------------
字节流:
字节输出流:
父类:OutputStream 抽象类
共性方法
子类↓
文件字节输出流:FileOutputStream类 把内存数据写入到硬盘文件
构造:
1.创建对象
2.如果没这个文件,会创建该文件。如果有,会清空文件数据
3.把对象指向创建好的文件
FileOutputStream(File file)
FileOutputStream(String name)
写入数据原理:java程序-jvm-os-os调用写数据方法-数据写入文件
写数据时会转成二进制,记事本或其他编辑器打开文件时会查询编码表,
0-127查询ascII,其他查询默认码表,中文查询gbk
使用步骤:
1.创建对象(构造传染写入地址)
2.调用write
3.释放资源close(流使用会占用一定内存)
方法:
write() 写入单个字节
write(byte[] b) 字节数组
write(byte[] b, int off, int len) 写字节数组一部分
byte[] String.getBytes 字符串转为字节数组
如果写入第一个字节为负数,那第1、2个字节会组成一个中文显示
数据追加续写:
FileOutputStream(File file, boolean append)
FileOutputStream(String name, boolean append)
append:true追加数据不会覆盖, false清空原有数据,不写默认false
换行:
windows \r\n
linux \n
mac \r
-----------
字节输入流:
InputStream 父类
共性方法:
void close()
abstract int read()
int read(byte[] b) 返回读取有效个数
文件字节输出流:FileInputStream 读取文件数据到内存
read()读取一个字节,读取到末尾返回-1,读一次把指针向后移动
read(byte[] b) 读取多个字节,数组起缓冲作用,一般长度设置为1024,存储读取到的多个字节,返回读取的有效长度
与String(byte[] b),String(byte[] b,int off, int length)配合遍历
先关闭写,后关闭读
------------------------------------
字符流:
注意utf-8 一个中文3个字节 gbk一个中文2字节
字符输入流:Reader 顶层父类 抽象
FileReader:文件字符输入流
配合String(char[] b),String(char[] b,int off, int length)
字符输出流:Writer 顶层父类 抽象
FileWriter:文件字符输出流
write把数据写入到内存缓冲区中(字符转换为字节的过程)--不会直接把数据写入到文件中
flush把内存缓冲区中数据刷新到文件中
close释放资源也会把内存缓冲区中数据刷新到文件中
flush和close区别:
flush刷新缓冲区,流对象可以继续使用
close先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用
void write(int c) 写入单个字符
void write(char[] cbuf) 写入字符数组
void write(char[] cbuf, int off, int len) 写入字符数组的某一部分,off数组的开始索引,len写的字符个数
void write(String str) 写入字符串
void write(String str, int off, int len) 写入字符串的某一部分
流的关闭原则:先开后关,后开先关
文件复制练习:一读一写,二流对接
-------------------------
IO异常处理:
1.7之前try catch finally
jdk7特性:
//确保了每个资源在语句结束时关闭
try ( FileWriter fw = new FileWriter("fw.txt"); ) {
// 写出数据
fw.write("xxx");
} catch (IOException e) {
e.printStackTrace();
}
jdk9特性:
A a = new A();
B b = new B();
try(a,b){//也可以自动释放
//代码
}catch(IOException e){
e.printStackTrace();
}
---------------------------
属性集:properties 双列集合,每个键和值都是字符串
store 集合临时数据写入硬盘
load 从硬盘读取到集合
Object setProperty(String key, String value) : 保存一对属性
String getProperty(String key) :使用此属性列表中指定的键搜索属性值
Set<String> stringPropertyNames() :所有键的名称的集合
void store(OutputStream out,String comments)
void store(Writer writer,String comments)
OutputStream out:字节输出流,不能写中文
Writer writer:字符输出流,可以写中文
String comments:注释,解释说明文件是做什么的。,中文会有乱码,一般使用空字符串""
load同上
文件中:
文本中的数据,必须是键值对形式,可以使用空格、等号、冒号等符号分隔
#注释,不会被读取
默认时字符串,不用再加引号
缓冲流(高效流,读写文件效率更高),内部维护了一个数组,解决内存到硬盘的IO次数:
原理:给传入的基本流增加一个缓冲区(数组,数据先读进去再传递回去),提高基本流的读取效率
字节缓冲流: BufferedInputStream,BufferedOutputStream
字符缓冲流: BufferedReader,BufferedWriter
构造第一个参数传递流对象,第二个参数传入size可以指定缓冲区大小,可不写,此时缓冲区默认大小
write方法是把数据写入到缓冲区中
flush刷新到文件
特有方法:
BufferedReader: String readLine() : 读一行文字,结束标记是\r \n到达末尾返回null
BufferedWriter: void newLine() : 写一换行分隔符,由系统属性定义符号
--------------------------
转换流:解决乱码
字符编码:
编码:
解码:
字符集:
原理:中文gbk 两个字节,utf-8 3个字节。可以自定义读写的编码。不指定会用默认的
InputStreamReader
OutputStreamWriter
-------------------------------
序列化:
ObjectOutputStream:把对象以流的方式写入到文件中,也叫写对象,对象的序列化
被序列化的对象必须实现 java.io.Serializable接口,标记接口,给类添加一个标记,序列化是会检测是否有该标记,没有会抛出异常
transient瞬态关键字修饰的成员变量,不会被序列化
static修饰的变量也不会被序列化
UId序列号
ObjectOutputStream(OutputStream out)
final void writeObject (Object obj) : 将指定的对象写出
ObjectInputStream:把文件中保存的对象以流的方式读取出来,也叫读对象,对象的反序列化
ObjectInputStream(InputStream in)
final Object readObject () : 读取一个对象
1.对于JVM可以反序列化对象,它必须是能够找到class文件的类。如果找不到该类的class文件,则抛出一个
ClassNotFoundException 异常
2.JVM反序列化对象时,能找到class文件,但是class文件在序列化对象之后发生了修改,那么反序列化操
作也会失败,抛出一个 InvalidClassException 异常,因为.class和.txt中的序列号不一致
解决:手动给类加一个序列号:final static long serialVersionUID
-------------------------------
打印流:
PrintStream
PrintStream(String fileName) : 使用指定的文件名创建一个新的打印流
特有方法:print print()
System.setOut(打印流对象) 改变输出语句输出的目的地 |
|