目录
File类
属性
常用的三种构造方法
public File(String parent,String child)
public file(String pathname)
public File(File parent ,String child)
常用的成员方法
判断方法
特殊的删除方法 :
mkdir() 和 mkdirs() 的区别
list() 和 Filelist()
renameTo()
InputStream 和 OutStream
InputStream
常用的方法
FileInputStream
利用Scanner进行字符读取
OutStream
实现一个简单的目录查询程序
每日一言
这里的重点主要就是File类中的属性,构造方法和他的一些常用方法
我们先来看看他的属性有哪些
static String pathSeparator : 依赖于系统的路径分隔符.类型是String
static char pathSeparator : 依赖于系统路径的分隔符, 类型是char
static static separator: 系统中一个路径中多个名称之间的分隔符
根据父目录 + 孩子文件路径,创建一个新的File实例
代码:
public static void main (String[] args) {
File file1 = new File("D:\\parent\\chile","parent");
System.out.println(file1.getName());
System.out.println(file1);
}
根据文件路径创建一个新的File实例,路径可以是绝对路径或者是相对路径
代码:
public static void main(String[] args) throws IOException {
//不要求这个文件真实存在
//根据文件路径创建一个File实例,路径可以是绝对路径或者是相对路径
// ./表示从当前路径下创建文件
File file = new File("./tt.jpg");
System.out.println("返回file对象的纯文件目录 :");
System.out.println(file.getName());
}
根据父目录 + 孩子文件路径,创建一个新的File实例,父目录用文件路径表示
代码:
public static void main(String[] args) {
File file1 = new File("D:\\parent\\chile","parent");
//System.out.println(file1.getName());
System.out.println("file1 的文件路径 : " + file1);
File file2 = new File(file1,"taat");
System.out.println("file2 的文件路径 : " + file2);
}
String | getParent() | 返回 File 对象的父目录文件路径 |
String | getName() | 返回 FIle 对象的纯文件名称 |
String | getPath() | 返回 File 对象的文件路径 |
String | getAbsolutePath() | 返回 File 对象的绝对路径 |
String | getCanonicalPath() | 返回 File 对象的修饰过的绝对路径 |
代码示例:
public static void main(String[] args) throws IOException {
//不要求这个文件真实存在
//根据文件路径创建一个File实例,路径可以是绝对路径或者是相对路径
File file = new File("./tt.jpg");
System.out.println("返回file对象的纯文件目录 :");
System.out.println(file.getName());
System.out.println("返回file父类对象的目录文件路径 :");
System.out.println(file.getParent());
System.out.println("返回file对象的文件路径 :");
System.out.println(file.getPath());
System.out.println("返回file对象的绝对路径 :");
System.out.println(file.getAbsolutePath());
System.out.println("返回file对象修饰过的绝对目录 :");
System.out.println(file.getCanonicalPath());
}
boolean | exists() | 判断 File 对象描述的文件是否真实存在 |
boolean | isDirectory() | 判断 File 对象代表的文件是否是一个目录 |
boolean | isFile() | 判断 File 对象代表的文件是否是一个普通文件 |
boolean | createNewFile() | 根据 File 对象,自动创建一个空文件。成功创建后返 回 true |
boolean | delete() | 根据 File 对象,删除该文件。成功删除后返回 true |
代码:
public static void main(String[] args) throws IOException {
File file = new File("./tt.jpg");
//判断file对象代表的文件是不是一个普通的文件
System.out.println(file.isFile());
//判断file对象描述的文件是否真实存在
System.out.println(file.exists());
//判断file对象代表的文件是否是一个目录
System.out.println(file.isDirectory());
//根据 File对象,自动创建一个空文件。成功创建后返回true
file.createNewFile();
System.out.println(file.isFile());
System.out.println(file.exists());
System.out.println(file.isDirectory());
//删除文件
file.delete();
System.out.println("删除文件之后");
//删除之后判断这个文件还是否还真实存在
System.out.println(file.exists());
}
deleteOnExit()
//会把这文件标识删除,真正删除的操作会在JVM停止运行后进行
public static void main(String[] args) throws IOException { File file = new File("./hello_world.txt"); //判断file对象代表的文件是不是一个普通的文件 System.out.println(file.isFile()); //判断file对象描述的文件是否真实存在 System.out.println(file.exists()); //判断file对象代表的文件是否是一个目录 System.out.println(file.isDirectory()); //根据 File对象,自动创建一个空文件。成功创建后返回true file.createNewFile(); System.out.println(file.isFile()); System.out.println(file.exists()); System.out.println(file.isDirectory()); file.deleteOnExit(); System.out.println("删除文件之后"); //判断删除后这个文件还是否真实存在 System.out.println(file.exists()); }
mkdir() : 必须要在存在的目录下创建文件夹,否则会创建失败
mkdirs() : 优化了mkdir() 在不存在的目录下创建文件夹,会先创建不存在的目录然后创建这个文件夹
class FileTest {
public static void main(String[] args) {
mkdir();
mkdirs();
}
public static void mkdir() {
boolean flag = false;
//使用不存的目录创建文件夹
String path = "D:\\cl1\\学习资料\\java";
File file = new File(path);
//他如果不存在,就开始创建
if (!file.exists() && !file.isDirectory()) {
//mkdir只能在已经存在的目录下进行创建
flag = file.mkdir();
}
System.out.println(flag);
}
public static void mkdirs() {
boolean flag = false;
String path = "D:\\Lzm1\\学习资料\\C++";
File file = new File(path);
if (!file.exists() && !file.isDirectory()) {
//mkdir 可以在不存在的目录下进行创建,如果整理目录不存在他会自己创建好这个目录
flag = file.mkdirs();
}
System.out.println(flag);
}
}
public static void main(String[] args) {
File file = new File("test-dir");
String[] results = file.list();
//返回该目录下所有文件名
System.out.println(Arrays.toString(results));
File[] results2 = file.listFiles();
//返回该目录下所有的文件名(File类型表示)
System.out.println(Arrays.toString(results2));
}
按照以下规则这样就可以完成重命名
public static void main(String[] args) {
File file = new File("D:\\Lzm\\666.txt"); // 这个文件需要存在
File dest = new File("dest.txt"); // 他是不存在的
System.out.println(file.exists());
System.out.println(dest.exists());
System.out.println(file.renameTo(dest));
System.out.println(file.exists());
System.out.println(dest.exists());
}
最常用的就是read()-读取 和 colse()-关闭
read:
有三个常用的重载方法
read() -- 读取一个字节的数据,返回-1表示已经读完了
read(byte[] b) --最多读取b.length字节的数据到b中,返回实际读到的数据量
read(byte[] b, int off,int len) --最多读取len到off字节的数据到b中 ,返回实际读到的数量
void colse() --关闭资源
InputStream 只是一个抽象类,要使用还需要具体的实现类。关于 InputStream 的实现类有很多,基本可以认为不同的输入设备都可以对应一个 InputStream 类,我们现在只关心从文件中读取,所以使用FileInputStream
public static void main(String[] args) throws IOException {
try (InputStream inputStream = new FileInputStream("d:/test.txt")) {
// 读文件 返回值为int
while (true) {
int b = inputStream.read();
if (b == -1) {
//读完之后直接结束
break;
}
System.out.printf("%x\n", b);
}
}
}
对字符类型直接使用 InputStream 进行读取是非常麻烦的,所以,我们使用一种我们之前比较熟悉的类来完成该工作,就是 Scanner类
构造方法
Scanner(InputStream is,String charSet) --使用charSet的字符集进行is的扫描读取
class Main {
public static void main(String[] args) throws IOException {
try (InputStream is = new FileInputStream("D:\\Lzm\\666.txt")) {
try (Scanner scanner = new Scanner(is, "UTF-8")) {
while (scanner.hasNext()) {
String s = scanner.next();
System.out.print(s);
}
}
}
}
}
常用的方法
write(int b) --写入要给的字节数据
write(byte[] b) -- 将b这个字符数组的数据全部写入OS中
write(byte[] b,int off, int len) --将b这个字符数组中从off开始的数据写入OS中,写入len个
close() --关闭字节流
flush() --调用flush (刷新) 操作,将数据刷到设备中
public static void main(String[] args) {
try (OutputStream outputStream = new FileOutputStream("d:/test.txt")) {
outputStream.write(97);
outputStream.write(98);
outputStream.write(99);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
//指定一个搜索的根目录
System.out.println("请输入要扫描的根目录: ");
File rootDir = new File(scanner.next());
//判断如果不是一个目录就进行报错
if (!rootDir.isDirectory()) {
System.out.println("输入有误, 您输入的目录不存在!");
return;
}
// 输入要查询的词
System.out.println("请输入要查询的词: ");
String word = scanner.next();
// 然后进行目录的遍历查找,放入根目录和要查询的词
scanDir(rootDir, word);
}
private static void scanDir(File rootDir, String word) {
//列出根目录下的子菜单,如果为空直接结束
File[] files = rootDir.listFiles();
if (files == null) {
return;
}
// 如果有东西就进行遍历查找
for (File f : files) {
System.out.println("当前搜索到: " + f.getAbsolutePath());
if (f.isFile()) {
//如果是文件就打开看看是否包含当前关键字
String content = readFile(f);
if (content.contains(word)) {
System.out.println(f.getAbsolutePath() + " 包含要查找的关键字!");
}
} else if (f.isDirectory()) {
//如果是目录就继续递归
scanDir(f, word);
} else {
//啥也不是就跳过
continue;
}
}
}
private static String readFile(File f) {
// 由于咱们匹配的是字符串, 此处只能按照字符流处理
StringBuilder stringBuilder = new StringBuilder();
try (Reader reader = new FileReader(f)) {
//一次读一个字符,读出来的进行拼接,以String的方式进行返回
while (true) {
int c = reader.read();
if (c == -1) {
break;
}
stringBuilder.append((char)c);
}
} catch (IOException e) {
e.printStackTrace();
}
return stringBuilder.toString();
}
奴才总不过是寻人诉苦。只要这样,也只能这样。——鲁迅先生