目录
1.File概述
1.1:File概述的方法
2:文件内容的读写
2.1:字节流
2.1.1:读--InputStream
2.1.2:写---OutputStream
2.2:字符
前言:
这一篇我们将讲文件操作的相关方法,以及数据流和字符流的相关操作
说到file,我们首先要弄清楚相对路径,绝对路径,网络路径。
如果基准路径:C:\Software\exercise,那么hello.txt相对路径就是:.\hello.txt
如果基准路径:C:\Software,那么hello.txt 的相对路径就是:.\exercise\hello.txt
那么hello.txt的绝对路径就是:C:\Software\exercise.\hello.txt。
返回值类型 | 方法签名 | 说明 |
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);}}
结果显示:
字节流对象,针对二级制文件,是以字符为单位进行读写。
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
结果显示:
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
结果显示:
每次写入到指定的文件中,会清除指定文件的内容。
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();}}
结果显示:
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的相关知识点,若有错误之处,请各位铁子留言纠错。若感觉不错,请一键三联。