一、文件类与IO流
1.File类
在Java.IO.File包下
File对象用于表示磁盘上的文件或者目录,使用File类中的方法操作File对象
构造方法:
File(文件路径\ 父目录,子文件\File文件(父目录)对象,子文件)
方法:
exists()–判断该文件对象是否存在
isFile() 判断对象表示的是否是文件,isDirectory()判断对象表示的是否是目录
getName() --获取文件或者目录名
canRead() 判断文件是否可读,canwrite–是否可写,canExecute()–是否可执行
lastModified()文件最后修改时间,返回的是Date类型的数据,new Date(数据).toString;
list(),返回当前目录下所有文件或者目录的名字,存放在String[]中
可以通过String类操作文件名,比如判断是否以指定字符串结尾,endsWith();
listFile(),返回当前目录下所有文件和目录对象,存放在File类类型的数组中,File[];
createNewFile(),判断是否存在该文件,若没有则可以使用该方法创建文件
delete() 删除当前文件
mkdir()判断该对象是否为目录,可以使用mkdir创建子目录,不能创建孙目录
mkdirs() 能在当前目录下创建孙目录
2、IO流
IO流作用:数据传输
根据传输方向可以分为输入流和输出流
根据传输处理单位可以分为字节流和字符流
根据功能可以分为:节点流,高级流
(1)字节输入流
inputStream抽象类,不能实例化,实现子类根据数据源不同划分
FileInputStream: 数据源是文件,数据源还可以是网络传输的数据(socket.getInputStream)
构造方法:
可以传入文件路径名,文件对象(推荐使用),append是true则传入的信息为追加
方法:
read(),每次读取一个字节的数据,i=一个字节
read(字节数组),将读取的数据存在字节数组中,String(字节,字符,字符串,空)
i=读取的字节数,还可以设置每次读取的长度read(字节数据,下标,下标);
byte[] b=new byte[5];
int i=fin.read(b);
while(i!=-1){
System.out.println(new String(b,1,i));
i=fin.read(b);
}
(2)字节输出流
outputStream–>实现类 FileOutputStream
String s="好好学习,天天向上";
byte[] bytes = s.getBytes();
fout.write(bytes);
复制文件:即先读后写
byte[] b=new byte[1024];
int i=fin.read(b);
while(i!=-1){
fout.write(b);
i=fin.read(b);
}
(3)字符流
InputStreamReader–字符输入流,OutputStreamWriter-- 字符输出流
实现类:以文件为数据源,FileReader,FileWriter
(4)字符流和字节流
字节流传输数据的单位是字节,字符是字符
字符流只能传输文本数据,字节能传输很多类型的数据
字符流写操作没有立即执行,等待刷新后执行,字节流写立即执行
(5)高级流
上述流只有基本读写功能
高级流是建立在节点流的基础上。
先建节点流,然后创建高级流。
转换流:
将字节流转为字符流,创建字节流,然后使用字符流的抽象父类
InputStreamReader,OutputStreamWriter
将创建的字节节点流作为参数传递给抽象父类
底层其实还是字节流,传输文本使用字节流方便
缓冲流
默认缓冲区大小:8192字节。
缓冲流读写原理:将读取的数据先临时存储在缓冲区;当缓冲区写满了,才会将缓冲区的数据写入目的端。减少了写的次数,
提高了IO效率,同时减少了对硬盘的损耗。
字节缓冲输入流:BufferedInputSteam
字节缓冲输出流:BufferedOutputStream
字符缓冲输入流:BufferedReader
字符缓冲输出流:BufferedWriter
使用方法同转换流
序列化流
对象存储或者传输时,必须是二进制形式,所以要进行序列化操作。
即需要将输入输出的数据单位转为类对象时:
序列化:输出对象–ObjectOutputSteam
反序列化:接收对象–ObjectInputStream
对象序列化前提:类必须实现序列化接口Serializable
为了防止修改该类时序列化版本号发生改变:
private static final long serialVersionUID=1L;
二、乱码
出现原因
机器只能识别二进制码,将字符编译为字节码需要使用字符集依据;
常见的字符集:gbk(英文、中文,windows默认–存储txt文件时注意转为utf—8,idea使用字符集为utf-8),utf-8(英文、中文、其他国家的符号)
所有字符集中都包含英文字符,且英文字符对应的编码都相同;所以英文不会乱码;
在读取文件时,文件的编码格式与java编译编码使用字符集不一致,输出的中文乱码;
解析时使用的字符集不含汉字编码
gbk中一个汉字占2个字节,utf-8中一个汉字占3个字节
并且对应的汉字编码不同,所以乱码
解决
使用一致的字符集