目录
文件
-
文件定义:在计算机中,文件是一个广义的概念,它不仅包括平常在硬盘上以独立单位存储数据的文件,还包括文件夹(目录).在操作系统中,还会使用文件来描述一些硬件或者软件资源.
-
文件的结构:文件是按照层级结构进行组织的,也就说我们熟悉的树形结构.文件夹(目录)就是存储一类文件的特殊文件.如图是Windows上文件的树形结构组织.
-
文件路径(Path):在操作系统中,通过"文件路径"的概念来描述一个具体文件/目录的位置.路径分为两种:绝对路径和相对路径
- 绝对路径:从文件的根节点开始到目标文件的路径.例如:
C:\Program Files\Microsoft Office\Data
- 相对路径:从任意节点出法寻找到目标文件的路径.相对路径通常以".“或”. .“开头,其中.表示该层,”. ."表示上一层.
例如我们在Delta所在路径下去寻找到root文件:C:\Program Files\Microsoft Office\Data\..\root
- 绝对路径:从文件的根节点开始到目标文件的路径.例如:
Java中的文件操作
File
Java中通过Java,io.File来对一个文件进行描述.
- File的构造方法
- File的相关方法
- File相关方法演示
File file1 = new File("F:/leedcodeday/src/qrxedu");
System.out.println(file1.getParent());
System.out.println(file1.getName());
System.out.println(file1.getPath());
System.out.println(file1.getAbsolutePath());
System.out.println(file1.getCanonicalPath());
File file2 = new File("./qrxedu");
System.out.println("=========================");
System.out.println(file2.getParent()); // 父目录
System.out.println(file2.getName()); // 本文件的名字
System.out.println(file2.getPath()); // 本文件的相对路径
System.out.println(file2.getAbsolutePath()); // 绝对路径
System.out.println(file2.getCanonicalPath()); // 绝对路径简化版
//分隔符可以是'\' 也可以是 '/',大多数操作系统都是用'/'分隔,'\'在编程时会发生字符转义之间的误会、
//Windows由于历史遗留问题 导致输出的路径的分隔符 是'\',但兼容'/'
System.out.println("=============================");
File file3 = new File("./qiuruixiang.txt");
System.out.println(file3.exists());
file3.createNewFile();
System.out.println(file3.exists());
file3.delete();
System.out.println("=================================");
File file4 = new File("./aaa");
file4.mkdir();
System.out.println(file4.isDirectory());
file4.delete();
File file5 = new File("./aaa/abc/ccc/dde");
file5.mkdirs();
System.out.println(file5.isDirectory());
//file5.delete();
文件内容的读写——数据流
字节流
字节流就是以字节的形式读写文件中的数据.文件中的数据是以字节存储的.这样的文件也被称为二进制文件.常见的二进制文件的后缀名有:.jar,.jpg,.mp4,.zip,.png等等.
-
InputStream:InputStream是一个抽象类,还需要使用具体的实现类.InputStream的实现类有很多,不同的设备对应都一个InputStream的实现类.
-
FileInputSteam:InputStream的一个实现类,用以从二进制文件中读取数据.当然也可以从文本文件中读取数据.
FIleInputStream的使用演示:
//将某一个实现Closeable接口的对象放入try中可以自动触发close()方法. //而所有流对象都实现了Closeable接口 try(InputStream inputStream = new FileInputStream("./aa.txt")){ while(true){ int b = inputStream.read(); if(b == -1){ break; } System.out.println(b); } } catch (IOException e) { e.printStackTrace(); }
上述方法可以读取二进制文件的内容.但利用上述方法去读取文本文件比较麻烦.因为是按照字节去读取的,对于UTF-8编码中英文和中文的字符所占字节的不同,所以用这种方法读取文本文件很繁琐.
我们可以利用Scanner去读文本文件.try(InputStream inputStream = new FileInputStream("./aa.txt")){ try(Scanner scanner = new Scanner(inputStream,"utf-8")){ while(scanner.hasNext()){ String s = scanner.next(); System.out.println(s); } } } catch (IOException e) { e.printStackTrace(); }
-
OutputStream:与InputStream一样,OutputStream也是一个抽象类,使用的时候需要具体的实现类.
-
FileOutputStream:OutputStream的一个实现类,以字节的形式向文件中写数据.
FileOutputStream使用演示://每次按照写操作 打开文件都会自动清空文件旧有的内容,然后按照起始位置写 try(OutputStream outputStream = new FileOutputStream("./aa.txt")){ byte[] buffer = {95,96,97,98,99}; outputStream.write(buffer); outputStream.flush(); }catch (IOException e) { e.printStackTrace(); }
和FileInputStream中一样,直接用FileOutputStream向文件中写字符型属于也比较麻烦.这里有可以OutputStreamWriter和PrintWriter来向文件中写字符型数据
try(OutputStream outputStream = new FileOutputStream("./aa.txt")) { try(OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream,"utf-8")){ try(PrintWriter printWriter = new PrintWriter(outputStreamWriter)){ printWriter.println("aaaa"); printWriter.print("哈哈"); } } } catch (IOException e) { e.printStackTrace(); }
字符流
在上述介绍字节流时,我们已经演示过用字节流去读些文本文件.但需要一些流之间的转换.在Java中我们有专门用来读写文本文件的类
- Reader:Reader是一个抽象类,在读文本文件时还需要使用FileReader()实现类.
- Writer:Writer是一个抽象类,在向文件中写字符型数据时还需要使用FileWriter()实现类.
- 使用演示:
try(Reader reader = new FileReader("./aa.txt")){
char[] buffer= new char[1024];
while(reader.read(buffer) != -1){
System.out.println(buffer);
}
}catch (IOException e) {
e.printStackTrace();
}
try(Writer writer = new FileWriter("./aa.txt")){
writer.write("hhh");
} catch (IOException e) {
e.printStackTrace();
}
总结
本篇文章主要介绍了文件以及在Java中如何利用数据流去操作文件.虽然数据流对应的类的种类比较多,但使用各种数据流去读写文件的过程都是类似的.