File和InputStream,OutputStream
目录
认识⽂件
树型结构组织 和 ⽬录
⽂件路径(Path)
文件的种类
File类
属性
构造方法
方法
代码示例
文件内容的读写——数据流
java中提供了一组类表示流
1.字节流
2.字符流
InputStream概述
方法
说明
FileInputStream概述
构造方法
OutputStream概述
方法
说明
认识⽂件
我们先来认识狭义上的⽂件(file)。针对硬盘这种持久化存储的I/O设备,当我们想要进⾏数据保存时, 往往不是保存成⼀个整体,⽽是独⽴成⼀个个的单位进⾏保存,这个独⽴的单位就被抽象成⽂件的概 念,就类似办公桌上的⼀份份真实的⽂件⼀般。
狭义的文件=》保持在硬盘上的文件
广义的文件=》操作系统进行资源管理的一种机制,很多软件/硬件资源抽象成”文件来表示
通俗的说文件夹是文件,专业上来说是目录
树型结构组织 和 ⽬录
同时,随着⽂件越来越多,对⽂件的系统管理也被提上了⽇程,如何进⾏⽂件的组织呢,⼀种合乎⾃ 然的想法出现了,就是按照层级结构进⾏组织⸺也就是我们数据结构中学习过的树形结构。这样, ⼀种专⻔⽤来存放管理信息的特殊⽂件诞⽣了,也就是我们平时所谓⽂件夹(folder)或者⽬录(directory)的概念。
从树根开始到最终的文件中间需要经过哪些目录,把这些目录记录下来就构成“路径”
一般使用/来分割路径中的多级目录
⽂件路径(Path)
如何在⽂件系统中如何定位我们的⼀个唯⼀的⽂件就成为当前要解决的问题,但这难不倒计算机科学 家,因为从树型结构的⻆度来看,树中的每个结点都可以被⼀条从根开始,⼀直到达的结点的路径所 描述,⽽这种描述⽅式就被称为⽂件的绝对路径(absolute path)
除了可以从根开始进⾏路径的描述,我们可以从任意结点出发,进⾏路径的描述,⽽这种描述⽅式就 被称为相对路径(relative path),相对于当前所在结点的⼀条路径
文件的种类
从 开发角度把文件分成两类
1.文本文件
2.二进制文件
即使是普通⽂件,根据其保存数据的不同,也经常被分为不同的类型,我们⼀般简单的划分为⽂本⽂ 件和⼆进制⽂件,分别指代保存被字符集编码的⽂本和按照标准格式保存的⾮被字符集编码过的⽂ 件
最后,很多操作系统为了实现接⼝的统⼀性,将所有的 I/O 设备都抽象成了⽂件的概念,使⽤这⼀理念 最为知名的就是 Unix、Linux 操作系统⸺万物皆⽂件。
Java标准库提供了一系列的类操作文件
1.文件系统操作
创建文件,删除文件,重命名,创建目录
2.文件内容操作
针对一个文件的内容进行读和写
File类
File用于操作文件系统
属性
构造方法
参数String文件的路径使用绝对路径/相对路径均可
方法
代码示例
import java.io.File;
import java.io.IOException;
public class Demo1 {
public static void main(String[] args) throws IOException {
File file = new File("./teat.txt");
System.out.println(file.getParent());
System.out.println(file.getName());
System.out.println(file.getPath());
System.out.println(file.getAbsolutePath());
System.out.println(file.getCanonicalPath());
}
}
import java.io.File;
import java.io.IOException;
public class Demo2 {
public static void main(String[] args) throws IOException {
File file = new File("./test.txt");
file.createNewFile();
System.out.println(file.exists());
System.out.println(file.isFile());
System.out.println(file.isDirectory());
}
}
import java.io.File;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
File file = new File("some-file.txt"); // 要求该⽂件不存在,才能看到相
System.out.println(file.exists());
System.out.println(file.createNewFile());
System.out.println(file.exists());
System.out.println(file.delete());
System.out.println(file.exists());
}
}
import java.io.File;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
File file = new File("some-file.txt"); // 要求 some-file.txt 得存在
File dest = new File("dest.txt"); // 要求 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());
}
}
import java.io.File;
import java.util.Arrays;
public class Demo4 {
public static void main(String[] args) {
File file = new File("./");
String[] list = file.list();
System.out.println(Arrays.toString(list));
}
}
文件内容的读写——数据流
java中针对文件内容的操作
主要是通过一组“流对象”来实现的
计算机中的“流”和水流非常相似
因此,计算机中针对读写文件,也是使用流(Stream)词
流是操作系统层面的术语,和语言无关
各种编程语言操作文件都叫流
java中提供了一组类表示流
分成两个大类别
1.字节流
读写文件,以字节为单位
是针对二进制文件使用的
InputStream 输入 从文件读数据
OutputStream 输出 往文件写数据
2.字符流
读写文件,以字符为单位
是针对文本文件使用的
Reader 输入 从文件读数据
Writer 输出 往文件写数据
InputStream概述
方法
说明
FileInputStream概述
构造方法
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
public class Demo7 {
public static void main(String[] args) throws IOException {
//InputStream inputStream = new FileInputStream("./test.txt");
//inputStream.close();
try(InputStream inputStream = new FileInputStream("./test.txt")){
while(true){
// int data = inputStream.read();
// if(data == -1){
// break;
// }
// System.out.println(data);
byte[] data = new byte[1024];
int n = inputStream.read(data);
if(n == -1){
break;
}
for (int i = 0; i < n; i++) {
System.out.println(data[i]);
}
}
}
}
}
FileInputStream
1.打开 try with resource
2.读read
3.关闭 Closable
OutputStream概述
方法
说明
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class Demo8 {
public static void main(String[] args) {
try(OutputStream outputStream = new FileOutputStream("./output.txt")){
outputStream.write(97);
byte[] bytes = {97,98,99};
outputStream.write(bytes);
}catch (IOException e){
throw new RuntimeException(e);
}
}
}
对于OutputStream来说默认情况下尝试创建不存在的文件
是会清除上次的文件内容的
追加写的模式避免内容被清空
1.流对象的使用流程
先打开,再读写,最后关闭
2.应该使用哪个流对象
先区分是文本,二进制
再区分度读还是写