千里之行,始于足下——老子
文件,目录
文件:内存中存放的数据计算机关机后会消失,要长久的保存数据,就要使用硬盘,光盘等,为了便于数据的管理和检索,引入了文件的概念,可以有一篇文章,一段视频,一个可执行程序。
目录(文件夹):
成千上万的文件,如果不分类的话,会很难管理,于是我们用文件夹去分类,管理。
操作系统:
如果需要查看文件/目录星系,右键属性就好了,
现在我想用java来操纵文件/目录,我该如何?
java程序最典型的特点,面向对象,java程序最擅长的就是操纵对象,盘符上的 文件目录,将它们的各种信息封装,封装成一个对象,
java最擅长就是操作对象,这个对象属于—》file类
盘符上的文件—》封装为对象—?对象属于file类的对象–》有了这个对象,我们的程序就可以直接操作这个对象,通过获取文件的各种信息,还可以对文件进行操作,创建或者删除等等等.
对文件的操作:
public static void main(String[] args) throws IOException {
File f = new File("D:\\java工程师\\javaSE代码\\javaSE源码\\javaSE\\src\\test.txt");
File f1 = new File("D:\\java工程师\\javaSE代码\\javaSE源码\\javaSE\\src\\test.txt");//跨平台建议使用这种
// 常用方法
System.out.println("文件是否可读 : "+f.canRead());
System.out.println("文件是否可写 : "+f.canWrite());
System.out.println("文件的名字 : "+f.getName());
System.out.println("文件的上级目录 :"+f.getParent());
System.out.println("是否是一个目录 :"+f.isDirectory());
System.out.println("是否是一个文件 :"+f.isFile());
System.out.println("是否隐藏 :"+f.isHidden());
System.out.println("文件大小 : "+f.length());
// if (f.exists()){ 如果有那就删除,没有就创建
// f.delete();
// }else {
// f.createNewFile();
// }
System.out.println(f==f1);
System.out.println(f.equals(f1));
//和路径相关的
System.out.println("绝对路径 :"+f.getAbsolutePath());
System.out.println("相对路径 :"+f.getPath());
System.out.println("toString :"+f.toString());
File file = new File("demo.txt");
if (!file.exists()){
file.createNewFile();//创建到了项目根目录里
}
// 绝对路径指一个精确,完成的路径
System.out.println("绝对路径 :"+file.getAbsolutePath());
// 相对路径有一个参会造物,相对这个·参照物的路径
// 相对这个位置,main方法的相对位置为项目根路径
System.out.println("相对路径 :"+file.getPath());
// toString的效果永远是相对路径
System.out.println("toString :"+file.toString());
}
对目录的操作
public static void main(String[] args) {
File f = new File("D:\\java工程师\\javaSE代码\\javaSE源码\\javaSE\\src");
File f1 = new File("D:\\java工程师\\javaSE代码\\javaSE源码\\javaSE\\src");//跨平台建议使用这种
// 常用方法
System.out.println("文件是否可读 : "+f.canRead());
System.out.println("文件是否可写 : "+f.canWrite());
System.out.println("文件的名字 : "+f.getName());
System.out.println("文件的上级目录 :"+f.getParent());
System.out.println("是否是一个目录 :"+f.isDirectory());
System.out.println("是否是一个文件 :"+f.isFile());
System.out.println("是否隐藏 :"+f.isHidden());
System.out.println("文件大小 : "+f.length());
File f2 = new File("D:\\java工程师\\javaSE代码\\javaSE源码\\javaSE\\src\\a\\b\\c");
// f2.mkdir();创建单层目录
// f2.mkdirs();创建多层目录
// f2.delete();删除,只删除一层,如果是删除目录的话只删除没有内容的,如果有内容就不会删除
String[] list = f.list();//遍历目录下的对应的名字
for (String s : list) {
System.out.println(s);
}
System.out.println("============");
File[] files = f.listFiles();
for (File file : files) {//作用相对上面发那个发,多了file对象,作用更加广泛
System.out.println(file.getName());
}
}
file:封装文件/目录各种信息,对文件和目录进行操作,但是我们不可以获取到文件和目录的内容,
于是乎!io!!!流!!!
IO流体系结构:
I/O:input/output的缩写,用于处理设备之间的数据的传输
形象理解:
案例:通过java程序完成文件的复制
功能分解1:初体验io流的文件内容读取
public static void main(String[] args) throws IOException {
// 文件--》程序
// 1.有一个文件---》创建file类对象
File file = new File("D:\\java工程师\\javaSE代码\\javaSE源码\\javaSE\\demo.txt");
// 2.利用filereader这个流将流连接到源文件--》file流对象
FileReader fr = new FileReader(file);
// 3.进行操作 --》读取操作
// 下面的代码我们验证了,如果到了文件的结尾,那么读取的内容为-1
/*
int i = fr.read();
int i2 = fr.read();
int i3 = fr.read();
int i4 = fr.read();
int i5 = fr.read();
System.out.println(i);
System.out.println(i2);
System.out.println(i3);
System.out.println(i4);
System.out.println(i5);
*/
//方法一
// int i = fr.read();
// while (i!=-1){
// System.out.println(i);
// i = fr.read();
// }
// 方法二
int i =0;
while ((i = fr.read())!=-1){
System.out.print((char) i);
}
// 4.关闭流--》关闭
// 流,数据库,网络资源,考jvm无法帮助我们关闭,必须程序元手动关闭
fr.close();
}
新需求,我每次读取5个,不够我在继续读,读到没有为止。
public static void main(String[] args) throws IOException {
// 1.有一个文件---》创建file类对象
File file = new File("D:\\java工程师\\javaSE代码\\javaSE源码\\javaSE\\demo.txt");
// 2.利用filereader这个流将流连接到源文件--》file流对象
FileReader fr = new FileReader(file);
// 3.进行操作 --》读取操作
char [] ch = new char[5];
int len = fr.read(ch);//一次读取五个,返回值是数组中的有效长度
while (len!=-1){
/* 方法1
for (int i = 0; i < len; i++) {
System.out.println(ch[i]);
}
System.out.println("!");
len = fr.read(ch);*/
String str = new String(ch,0,len);
System.out.println(str);
len = fr.read(ch);
}
// 4.关闭操作
fr.close();
}
利用缓冲数组,做一个操作
一个一个向外输出,
public static void main(String[] args) throws IOException {
//目标文件
File file = new File("D:\\java工程师\\javaSE代码\\javaSE源码\\javaSE\\demo01.txt");
// fw连接到文件
FileWriter fw = new FileWriter(file);
//开始操作
String str = "你好,小朋友";
for (int i = 0; i < str.length(); i++) {
fw.write(str.charAt(i));
}
// 关闭流
fw.close();
}
发现:如果目标文件不存在,会自动创建文件写入,如果存在,
new FileWriter(file);,相当于对源文件覆盖,而并不是追加
new FileWriter(file,true);为true的时候才会有追加操作
new FileWriter(file,false);为false的时候会是覆盖操作,默认也是覆盖
批量,使用缓冲数组向外输出,
package TestIO.com.hyc.IO01;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
public class Test03 {
public static void main(String[] args) throws IOException {
//目标文件
File file = new File("D:\\java工程师\\javaSE代码\\javaSE源码\\javaSE\\demo01.txt");
// fw连接到文件
FileWriter fw = new FileWriter(file,true);//追加
//开始操作
String str = "老子开心";
char[] ch =str.toCharArray();
fw.write(ch);
// 关闭流
fw.close();
}
}
接下来是合并操作!
package TestIO.com.hyc.IO01;
import java.io.*;
public class Test04 {
public static void main(String[] args) throws IOException {
// 创建file类
// 一个复制本体,一个是接受复制
File file = new File("D:\\java工程师\\javaSE代码\\javaSE源码\\javaSE\\demo01.txt");
File file2 = new File("D:\\java工程师\\javaSE代码\\javaSE源码\\javaSE\\demo02.txt");
// 创建输出流
FileReader reader = new FileReader(file);
// FileReader reader1 = new FileReader(file2);
FileWriter writer = new FileWriter(file2,true);//用追加的形式不用覆盖的形式
//region 1.一个一个字符的形式
int n = reader.read();
while (n!=-1){
writer.write(n);
n = reader.read();
}
//endregion
//region 2.缓冲数组的形式
char[] ch = new char[5];
int len = reader.read(ch);
while (len!=-1){
writer.write(ch,0,len);//输出缓冲数组有效的长度
len = reader.read(ch);
}
//region 3.缓冲数组转成字符串的形式
char[] ch1 = new char[5];
int len1 = reader.read(ch1);
while (len1!=-1){
String s =new String(ch1,0,len1);
writer.write(s);//输出缓冲数组有效的长度
len1 = reader.read(ch1);
System.out.println(len1);
}
//endregion
//关闭流,后用先关
writer.close();
reader.close();
}
}
注意:不要用字符流去操作文本格式以外的文件!!!!!!!!!!!
好好学习,每天都在进步!!!!!!
我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=3btqwmdvn4cgo