学习笔记:Java之IO(一)

夯实基础!!

学习来源慕课网:文件传输基础—-Java IO流


字符流

不同的操作系统有不同的编码,处理不同的编码是一个大问题,但是,这些被编码的字符本质上都是一个一个的byte,其中,Java是双字节编码,也就是utf-16be,而utf-8中文为三字节,英文为一字节,gbk中文为两字节,英文为一字节。

使用StringgetBytes方法将其转换为byte数组,可以向其中添加一个参数,为想转换为的编码类型。

代码片段如下

如果是utf-8的情况

1
2
3
4
5
6
String s = "慕课ABC";
byte[] bytes = s.getBytes("utf-8");
for (byte b : bytes) {
// 将byte转换为16进制数z
System.out.printf(Integer.toHexString(b & 0xff) + " ");
}

输出如下

1
e6 85 95 e8 af be 41 42 43

其中Integer.toHexString是将整形数字转换为十六进制字符串,所以其中每一个都是由两个十六进制数组成的。可以看出,前两个中文有46/8=3字节,而后三位为42/8=1字节

如果把getBytes中的参数分别改成gbkutf-16be,自结果如下

1
2
3
4
慕    课   A  B  C
c4 bd bf ce 41 42 43
慕 课 A B C
61 55 8b fe 0 41 0 42 0 43

将byte数组组装成String时也可以指定编码类型,但必须一一对应,否则会乱码,如下

1
2
3
4
5
6
7
String s = "慕课ABC";
byte[] btyes3 = s.getBytes("utf-16be");

String str1 = new String(btyes3, "utf-8");
System.out.println(str1);
String str2 = new String(btyes3, "utf-16be");
System.out.println(str2);

结果如下

1
2
aU��ABC
慕课ABC

访问文件信息

Java为我们提供了java.io.File类来对文件进行访问,但是仅仅是对文件信息的访问,比如文件名称,文件路径,文件类型,文件大小,类似于操作系统中的FCB。

使用如下语句初始化

1
2
3
// 文件路径
String filePath = "";
File file = new File(filePath);

一些常用api

1
2
3
4
5
6
7
8
file.exists(); // 文件是否存在
file.mkdir(); // 创建当前路径下的目录
file.mkdirs(); // 递归创建目录
file.createNewFile(); // 新建文件
file.isFile(); // 是否为文件
file.isDirectory(); // 是否为目录
file.listFiles(); // 如果为目录,则列出目录下的所有文件
file.getParentFile(); //获取上级目录

可以运用这些工具写一个递归程序列出当前路径下的所有目录和文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package com.example;

import java.io.File;
import java.lang.IllegalArgumentException;

public class PrintDirTree {

public static String DIR_PATH = "/Users/nizhenyang/workspace/java/learning/test";

/**
* 列出指定目录下的所有目录及文件
* @param fileAbsPath 绝对路径
* @param level 深度
*/
public static void getTreePrint(String fileAbsPath, int level) {
File file = new File(fileAbsPath);

// 如果目录不存在
if (!file.exists()) {
throw new IllegalArgumentException("目录"+file+"不存在");
}

// 输出名字,如果是目录的话则在前面加一个'-'
for (int i = 0; i < level; i++) {
if (file.isDirectory() && i == level-1) {
System.out.print("-");
} else {
System.out.print(" ");
}
}
System.out.println(file.getName());

// 如果是目录,则继续递归遍历
if (file.isDirectory()) {
File[] files = file.listFiles();
if (files != null) {
for (File child : files) {
PrintDirTree.getTreePrint(child.getAbsolutePath(), level+1);
}
}
}
}

public static void main(String[] args) {
PrintDirTree.getTreePrint(args[0], 1);
}
}

试一试

1
2
javac com/example/PrintDirTree.java
java com.example.PrintDirTree /Users/nizhenyang/workspace/java/learning/test
1
2
3
4
5
6
7
8
9
-test
test1.txt
test3.txt
-test1
test6.txt
test5.txt
-test3
-test2
test4.txt