1.核心类
类 | 说明 |
---|---|
File | 文件类 |
InputStream | 字节输入流 |
OutputStream | 字节输出流 |
Reader | 字符输入流 |
Writer | 字符输出流 |
Closeable | 关闭流接口 |
Flushable | 刷新流接口 |
Serializable | 序列化接口 |
1.1 字节流
1.2 字符流
- 字节流:按照字节读取数据(InputStream、OutputStream)
- 字符流:按照字符读取数据(Reader、Writer),因为文件编码的不同,从而有了对字符进行高效操作的字符流对象;
- 原理:底层还是基于字节流的操作,自动搜寻了指定的码表;
- File类
我们的文件存储在硬盘中,但是Java程序并不能直接操作硬盘,所以java通过虚拟机操作OS(操作系统),实现对硬盘中文件的读写操作,File就是建立Java–与--硬盘中文件的联系。
File这里可能为文件或者是文件夹。File代表一个抽象的表示形式。 - 路径的书写
不同的操作系统,分割符不同,’‘或’/’
public class PathDemo01 {
public static void main(String[] args) {
String path = "F:\\JAVAcode\\Test_IO\\photo.jpg";
System.out.println(File.separatorChar);
//方式1
//使用'/',建议用此方法
path = "F:/JAVAcode/Test_IO/photo.jpg";
System.out.println(path);
//方式2
//使用系统分隔符File.separator
path = "F:"+File.separator + "JAVAcode" + File.separator + "Test_IO"+ File.separator + "photo.jpg";
System.out.println(path);
}
输出:
\
F:/JAVAcode/Test_IO/photo.jpg
F:\JAVAcode\Test_IO\photo.jpg
- 构建File对象
//构建File对象,有三种构造器
String path = "F:/JAVAcode/Test_IO/photo.jpg";
File src = new File(path);
System.out.println(src.getParent());
System.out.println(src.length());
//当前目录
System.out.println(System.getProperty("user.dir"));
F:\JAVAcode\Test_IO
135083
F:\JAVAcode\Test_IO
File API说明
API | 说明 |
---|---|
pathSeparator separator | 路径|路径分隔符 |
File(String parent, String child) | |
File(File parent, String child) | 构造器 |
File(String pathname) | 构造器 |
getName() get path() | 文件名,路径名 |
getAbsolutePath() | |
getParent() | |
exists(), isFile(), isDirectory() | 判断状态 |
length() | 文件长度 |
createNewFile(), delete() | 创建新文件, 删除文件 |
- 文件夹创建–遍历
API | 说明 |
---|---|
mkdir(),madirs() | 创建目录,如果父目录链不存在,则一同创建 |
list() | 下级名称 |
listFiles | 下级File |
listRoots() | 根路径 |
mkdir():要确保上一级目录必须存在;
mkdirs():上一级目录若不存在,则一同创建;
- 编码
每个文件都有自己的编码格式,ASCII, UTF-8(可变长度编码), UTF-16(固定长度);
//编码:字符-->字节
String s = "小明和小红";
// 编码 字节数组
byte[] datas = s.getBytes();
System.out.println(datas.length);
Output:
15
- 解码
//解码:字节-->字符
//接着上面的代码,还原
//解码:字符串String(byte[] bytes, int offset, int length, String charsetName)
s = new String(datas,0,datas.length, StandardCharsets.UTF_8);
System.out.println(s);
Output:
小明和小红
乱码问题:
(1) 字节数不够
s = new String(datas,0,datas.length-2, StandardCharsets.UTF_8);
System.out.println(s);
Output:
(2) 字符集不统一
s = new String(datas,0,datas.length-2, Charset.forName("gbk"));
System.out.println(s);
Output: