文件,是储存在硬盘上面的,当硬盘储存数据时,不是全部数据直接储存,而是独立成一个个的单位来进行保存,这些单位就是文件.
根据保存数据的不同,我们一般分为两种文件:
整个文件系统,是呈树状组织

在文件系统中,通过路径来定位一个文件的位置
文件路径分为两类:
文件是被操作系统管理的,操作系统内核中有一个专门的模块,“文件系统”
java对文件系统进行了一系列的封装.
java中主要用 java.io.File 类来对一个文件进行描述, 但是即使有了File对象,也不一定代表该文件一定存在.
public static void main(String[] args) {
//通过绝对路径定位
File f1 = new File("D:/Test1.txt");
// 获取父路径
System.out.println(f1.getParent());
// 获取文件名
System.out.println(f1.getName());
// 获取文件路径
System.out.println(f1.getPath());
// 获取绝对路径
System.out.println(f1.getAbsolutePath());
// 获取File 对象的修饰过的绝对路径
System.out.println(f1.getAbsoluteFile());
}
运行结果

在idea中运用相对路径创建file对象,并创建文件后, file对象文件会在当前项目的文件夹中.
public static void main(String[] args) throws IOException {
//通过绝对路径定位
File f2 = new File("Test2.txt");
f2.createNewFile();
// 获取父路径
System.out.println(f2.getParent());
// 获取文件名
System.out.println(f2.getName());
// 获取文件路径
System.out.println(f2.getPath());
// 获取绝对路径
System.out.println(f2.getAbsolutePath());
// 获取File 对象的修饰过的绝对路径
System.out.println(f2.getAbsoluteFile());
}
运行结果

根据文件的读写,java提供了标准的类
上面所提到的都是抽象类,我们要使用这些类的子类
1 FileInputStream
2 FileOutputStream
3 FileReader
4 FileWriter
文件内容操作步骤:
try 内打开文件,文件在try的内容执行完后会自动关闭.
例如我们读取 Test.txt文件中的 hello

public static void main(String[] args) throws IOException {
try(InputStream inputStream = new FileInputStream("Test2.txt")){
byte[] b = new byte[1024];
int len;
while(true){
len = inputStream.read(b);
break;
}
for (int i = 0; i < len; i++) {
System.out.print(b[i]+" ");
}
}
}
结果

在上述例子中, 我们看到对字符类型直接使用IntputStream 是麻烦的, 所以我们可以用我们熟悉的类,Scanner来完成.
public static void main(String[] args) throws IOException {
try(InputStream inputStream = new FileInputStream("Test2.txt")){
try(Scanner scanner = new Scanner(inputStream)){
while(scanner.hasNext()){
String s = scanner.next();
System.out.print(s);
}
}
}
}
显示信息

在写数据的时候,会有一部分数据在缓冲区,我们需要调用.flush()方法将缓冲区清空.
public static void main(String[] args) throws IOException {
try(OutputStream outputStream = new FileOutputStream("Test2.txt")){
outputStream.write('l');
outputStream.write('i');
outputStream.write('f');
outputStream.write('e');
outputStream.flush();
}

此时可见文件中的内容变成了 life
但是在我们再次启动程序时,文件中的内容还是life,可见在输出的时候,会将文件中原有的数据清空, 如果想要追加数据, 我们需要在实例化时,多加一个参数, true.
public static void main(String[] args) throws IOException {
try(OutputStream outputStream = new FileOutputStream("Test2.txt",true)){
outputStream.write('l');
outputStream.write('i');
outputStream.write('f');
outputStream.write('e');
outputStream.flush();
}
}

当然,还可以整个数组输入:
public static void main(String[] args) throws IOException {
try(OutputStream outputSteam = new FileOutputStream("Test2.txt")){
String s = "hello";
byte[] b = s.getBytes();
outputSteam.write(b);
outputSteam.flush();
}
}
显示结果

因为OutputStream为字节流,所以在输出字符的时候有许多的不方便,我们可以将OutputStream处理一下, 借助PrintWriter来输出
PrintWriter有熟悉的println,print,printf方法
public static void main(String[] args) throws IOException {
try(OutputStream outputStream = new FileOutputStream("Test2.txt")){
try(PrintWriter writer = new PrintWriter(outputStream)){
writer.println("你好");
}
}
}
显示结果
`