狭义的文件,指的是文件和文件夹
广义的文件则是泛指计算机的软硬件资源.操作系统把许多硬件设备和软件资源抽象成了文件,按照文件的格式进行管理.
路径可以使用/和,但是优先使用/ 因为\有转义字符的问题.
1.1路径
路径分为绝对路径和相对路径
相对路径: 以当前所在的目录为基准(,/ 就表示当前的目录即工作目录)
…/ 当前路径的上一级路径
比如定位到d:/tmp/111
工作目录是d:/ 相对路径就是 ./tmp/111
工作目录是d:/tmp 相对路径就是 ./111
工作目录是d:/tmp/222 相对路径就是 …/111
工作目录是d:/tmp/222/bbb 相对路径就是 …/…/111
即上一级目录可以叠加
文件
文件的类型:二进制文件和文本文件
文本文件:是字符串构成的.每个字符都是由ASCII码构成的.
二进制文件:没有任何限制.
如何区分文本文件和二进制文件?
随便一个文件使用记事本打开,如果乱码了就是二进制文件.
java对文件的操作:
1对文件系统进行操作(增删改)
2对文件内容进行操作(读和写)
1 对文件系统进行操作
File:
File file = new File("d:/a/test.txt");
//不要求这个文件真的存在
file.createNewFile();
file.mkdir();
file.delete
file.mkdirs(): 创建多级目录
重命名:
File file = new File("./test");
File dest = new File("./dest");
file.renameTo(dest);
IO流
1打开文件(构造对象)
2关闭文件close
3读文件 read 针对inputStream和Reader
4写文件 write 针对OutputStream 和Writer
1字节流
InputStream FileInoutStream(读文件,文件不存在就异常)
OutputStream FileOutputStream(写文件,文件不存在就自动创建)
处理二进制文件
用字符流打印文本,读出来的是一个一个的字符的acsii码
public class Demo2 {
public static void main(String[] args) throws IOException {
InputStream inputStream = new FileInputStream("./test.txt");
while (true){
int a = inputStream.read();
if (a == -1){
break;
}
System.out.println(" "+(byte)a);
}
inputStream.close();
}
}
//单次IO操作是比较消耗时间的,如此频繁的操作,耗时是会增大的,所以应该缩短IO次数.
try(OutputStream outputStream = new FileOutputStream("./text.txt")){
outputStream.write(97);
outputStream.write(98);
} catch (IOException e) {
e.printStackTrace();
}
2字符流
Reader(读文件)
Writer
package io;
import java.io.*;
public class Demo3 {
public static void main(String[] args) throws FileNotFoundException {
try(Reader reader = new FileReader("./text.txt")){
while (true) {
char[] buffer = new char[1024];
int read = reader.read(buffer);
if (read == -1){
break;
}
for (int i = 0; i < read; i++) {
System.out.println(buffer[i]);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
练习
1扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录),并且后续询问用户是否要删除该文件★
package io;
import java.io.File;
import java.util.Scanner;
public class Select {
private static Scanner scanner = new Scanner(System.in);
public static void main(String[] args) {
/**
* 给定一个目录和关键词 查看是否有匹配结果
* 如果有匹配结果就进行删除
*/
//用户输入指定的目录和要搜索的关键词 判断是文件则删除 是目录就递归
System.out.println("亲输入目录名");
String path = scanner.next();//输入根目录 next空格换行都可以 nextLine只能是换行 比较不方便
File root = new File(path); //构造根节点
if (!root.isDirectory()){ //如果不是文件夹就没办法递归
System.out.println("您输入的目录有误");
return;
}
System.out.println("请输入要删除的关键词");
String nameToDelete = scanner.next();//要删除的关键词
scanDir(root,nameToDelete); //递归根目录
//如果有就放入结果集 之后继续遍历
}
private static void scanDir(File root, String nameToDelete) {
File[] files = root.listFiles(); //相当于打开文件夹 把里面的文件取出
if (files == null){
return; //结束递归
}
//遍历目录 判断是不是目录 不是目录就判断是不是关键词
for (File file: files) {
if (file.isDirectory()){
scanDir(file,nameToDelete); //如果是目录 就进一步递归
}else {
//不是目录 就判断有没有关键词
String name = file.getName();
if (name.contains(nameToDelete)){
//如果文件包含关键词就删除
System.out.println("确认删除 Y/N"+file.getAbsolutePath());
String choice = scanner.next();
if (choice.equals("Y") || choice.equals("y")){
file.delete();
System.out.println("删除成功");
}else {
System.out.println("删除取消");
}
}
}
}
}
}
2文件复制
package io;
import java.io.*;
import java.util.Scanner;
public class CopyDemo {
public static void main(String[] args) {
//文件复制
/**
* 输入两个路径 源 目标
* 源文件要存在 目标文件不能存在
*
*/
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要拷贝的文件");
String srcPath = scanner.next();
System.out.println("请输入目标地址");
String destPath = scanner.next();
File srcfile = new File(srcPath);
//校验
if (!srcfile.isFile()){
//如果输入的源地址不是一个文件 则返回
System.out.println("输入的源地址有误");
return;
}
File destFile = new File(destPath);
if (destFile.isFile()){
//如果目标文件已经存在则认为u不能拷贝
System.out.println("您输入的目标地址有误");
return;
}
try (InputStream inputStream = new FileInputStream(srcfile);
OutputStream outputStream = new FileOutputStream(destFile)){
while (true){
byte[] buffer = new byte[1024];
int b = inputStream.read(buffer);
if (b == -1){
break;
}
outputStream.write(buffer);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
附件
追加
OutputStream outputStream = new FileOutputStream("./test.txt",true);
Writer writer = new FileWriter("./test.txt",true); //true就是追加
false就是覆盖