目录
前言:
这一篇我们将讲文件操作的相关方法,以及数据流和字符流的相关操作
1.File概述
说到file,我们首先要弄清楚相对路径,绝对路径,网络路径。
- 相对路径:必须要有一个基准路径。相对路径:就是从基准路径出发,看从那种的路径来看找到对应的文件。
如果基准路径:C:\Software\exercise,那么hello.txt相对路径就是:.\hello.txt
如果基准路径:C:\Software,那么hello.txt 的相对路径就是:.\exercise\hello.txt
- 绝对路径:是以盘符开头的。
那么hello.txt的绝对路径就是:C:\Software\exercise.\hello.txt。
- 网络路径:就是通过一个网络路径就可以打开一个网络上的东西。
1.1:File概述的方法
返回值类型 | 方法签名 | 说明 |
String | getParent() | 返回File对象的父目录文件路径 |
String | getName() | 返回File对象的纯文件名称 |
String | getpath() | 返回File对象的文件路径(相对路径) |
String | getAbsolutedPath() | 返回File对象的绝对路径(基准路径加相对路径) |
String | getCanonicalPath() | 返回File对象的绝对路径 |
boolean | exists() | 判断File对象描述的文件是否真实存在 |
boolean | isDirectory() | 判断File对象描述的文件是否是一个目录 |
boolean | isFile() | 判断File对象描述的文件是否是一个普通文件 |
boolean | createNewFile() | 根据File对象,自动创建一个空文件,成功后返回true |
boolean | delete() | 根据File对象,删除该文件,成功后返回true |
void | deleteOnExit() | 删除文件,删除动作回到JVM运行结束时才会进行。 |
String[] | list() | 返回File对象代表的目录下的所有文件名 |
file[] | listFiles() | 返回File对象代表的目录下的所有文件,以File对象表示 |
boolean | mkdir() | 创建File对象代表的目录 |
boolean | mkdirs() | 创建File对象代表的目录 |
boolean | renameTo(Filedest) | 对文件重命名 |
boolean | canRead() | 判断是否有可读权限 |
boolean | canWrite() | 判断是否有可写权限 |
1.File对象:
File file=new File("./text.txt"); //这个并不要求改文真实存在
2.getAbsolutedPath() /getCanonicalPath()----返回file对象的文件绝对路径(返回String)
例如:System.out.println(file.getAbsolutePath());
结果显示:D:\编程\代码\gittee\fighting\File_boke \.\text.txt
这里多了一个 .\ 在这个方法getAbsolutePath(),返回的结果是基准路径加上相对路径
D:\编程\代码\gittee\fighting\File_boke ,这个是当前的代码文件路径(也是text.txt的基准路径)。
./text.txt 这是相对路径。
例如:System.out.println(file.getCanonicalPath());
结果显示:D:\编程\代码\gittee\fighting\File_boke\text.txt。
这个就是正常的绝对路径。
代码演示:
示例一:
File file=new File("./text.txt");
//这个并不要求改文件是否真实存在
System.out.println("文件名:"+file.getName());
System.out.println("文件的绝对路径"+file.getAbsolutePath());
System.out.println("文件的绝对路径"+file.getCanonicalPath());
System.out.println("文件的相对路径:"+file.getPath());
System.out.println("父目录路径"+file.getParent());
结果显示:
示例二:
public static void main(String[] args) throws IOException {
File file=new File("./hello.txt");
//创建一个文件
file.createNewFile();//会抛出IOException
//判断文件是否真实存在
System.out.println("文件是否真实存在:"+file.exists());
System.out.println("改名前的文件名:"+file.getName());
//判断是否是一个文件
System.out.println("是否是一个文件:"+file.isFile());
//判断是否是一个目录
System.out.println("是否是一个目录:"+file.isDirectory());
//对文件重命名
File file1=new File("./word.txt");
System.out.println(file.renameTo(file1));
System.out.println("word.txt文件是否存在:"+file1.exists());
System.out.println("hello.txt文件是否存在:"+file.exists());
System.out.println("改名后的文件名:"+file.getName());
结果显示:
文件重命名:为啥改名前和改名后的文件名是一样的勒?
因为这个只是把磁盘上的文件给改动,file对象不变的。
示例三:
public static void main(String[] args) {
//创建一个单级目录
File file=new File("./ddd");
file.mkdir();
//判断是否是一个目录
System.out.println("是否是一个目录:"+file.isDirectory());
//创建多级目录
File file1=new File("./aaa/bbb/ccc");
file1.mkdirs();
//返回File对象代表的目录下的所有文件名
System.out.println("返回File1对象代表的目录下的所有文件名");
String [] arr=file1.list();
for (String s:arr) {
System.out.println(s);
}
System.out.println("返回File1对象代表的目录下的所有文件名,以File对象表示:");
File []files=file1.listFiles();
for (File f:files) {
System.out.println(f);
}
}
结果显示:
2:文件内容的读写
2.1:字节流
字节流对象,针对二级制文件,是以字符为单位进行读写。
2.1.1:读--InputStream
1.read()---读取一个字节的数据 ,返回-1就代表已经完全读取完了。
public static void main(String[] args) throws FileNotFoundException {
File file=new File("./aaa/bbb/ccc/hello.txt");
try(FileInputStream inputStream=new FileInputStream(file)) {
while(true){
int len=inputStream.read();
if(len==-1){//如果读取时负一,说明就是读取到文件末尾
break;
}
System.out.print(len);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
结果显示:
这里大家产生了一个疑问了吗?一次返回一个字节,不是应该返回一个byte吗?为啥是int类型的勒?
如果返回的是byte,本身就是-128 到127 。当读取到一个-1的时候,你到底是读取到文件末尾了,还是刚好有一个值-1(0xff)。这时候为了表示这个非法状态,就约定了-1来表示,因此就需要一个使用范围大与byte的类型。
针对字符流,也是类似的设定,一次读一个char,因此此处使用int就会更适合一些,可以让字符和字节流统一。
2:read(byte[] b)---最多读取到b.length 字节的数据到b中,-1代表读完
public static void main(String[] args) {
File file=new File("./aaa/bbb/ccc/hello.txt");
try (FileInputStream inputStream=new FileInputStream(file)){
while(true) {
//一次读取多个字符
byte[] arr = new byte[1024];
int len = inputStream.read(arr);
if(len==-1){//这里的len是你实际读取到的字节长度
break;
}
for (int i = 0; i <len ; i++) {
System.out.print(arr[i]+" ");
}
}
}catch (IOException e){
e.printStackTrace();
}
}
结果显示:
3.read(byte[] b ,int off, int len) ----最多读取len-off字节的数据到b中,放到off开始,返回实际读取的字节数量。-1代表已经读取完。
public static void main(String[] args) {
File file=new File("./aaa/bbb/ccc/hello.txt");
try(FileInputStream inputStream=new FileInputStream(file)) {
while(true) {
byte[] arr = new byte[1024];
int len=inputStream.read(arr,2,5);
if(len==-1){
break;
}
for (int i = 0; i <len; i++) {
System.out.print(arr[i]+" ");
}
}
}catch (IOException e){
e.printStackTrace();
}
}
结果显示:
2.1.2:写---OutputStream
每次写入到指定的文件中,会清除指定文件的内容。
1.write(int b)---写入要给字节的数据
public static void main(String[] args) {
try(OutputStream outputStream=new FileOutputStream("./aaa/bbb/ccc/hello.txt")) {
outputStream.write(110);
outputStream.write(111);
outputStream.write(112);
outputStream.close();//关闭文件资源
}catch (IOException e){
e.printStackTrace();
}
}
结果显示:
2.write(byte []b)---将b这个字符数组中的数据全部写入指定文件中
public static void main(String[] args) {
try(OutputStream outputStream=new FileOutputStream("./aaa/bbb/ccc/hello.txt" )){
byte [] arr=new byte[]{110,111,112,113,114,115};
outputStream.write(arr);
outputStream.close();//关闭文件资源
}catch(IOException e){
e.printStackTrace();
}
}
结果显示:
2.2:字符
1:read()--读
try(Reader reader=new FileReader("./aaa/bbb/ccc/hello.txt")) {
while(true){
char [] arr=new char[1024];
int len=reader.read(arr);
if(len==-1){
break;
}
String str=new String(arr,0,len);
System.out.println(str);
}
}catch (IOException e){
e.printStackTrace();
}
结果显示:
2.wirte()---写
public static void main(String[] args) {
try(Writer writer=new FileWriter("./aaa/bbb/ccc/hello.txt")) {
writer.write("xyz");
writer.close();
}catch (IOException e){
e.printStackTrace();
}
}
结果显示:
3.FileWriter---追加
public static void main(String[] args) {
try (FileWriter url=new FileWriter("./aaa/bbb/ccc/hello.txt",true)){
url.write("word");
url.close();
}catch (IOException e){
e.printStackTrace();
}
}
结果显示:
总结:
以上就是我总结的文件IO的相关知识点,若有错误之处,请各位铁子留言纠错。若感觉不错,请一键三联。