文件的概念
文件分为狭义的文件和广义的文件,这里讨论的是狭义的文件。文件是针对硬盘抽象出来的概念,当我们想要将数据保存再硬盘上时,是以文件的形式来保存的,并且是以文件为单位来保存的。文件包含的信息有文件名,文件类型,文件大小等,我们把这些信息视为文件的原信息。
由于文件的繁复,为了对文件进行高效的管理,诞生了对文件按照层级结构组织管理的方式,这种方式就是树型结构组织,就像数据结构里的树型结构。于是就有了用于存放管理信息的文件,例如我们计算机上的文件夹和目录。
绝对路径和相对路径
绝对路径,如何在文件系统中定位到唯一的文件,根据管理文件的树型结构来看,要想定位到指定文件就要从根节点开始一步一步到达指定节点,把这个过程对应到文件的路径中就是绝对路径。
红色方框里的就是绝对路径。
相对路径,相对路径的起点不是根节点,而是以某个节点为参考,从参考节点出发到终点的叫做相对路径,就是以当前目录为参考的一条路径。假设当前目录为D:\temp,要想定位到image这个目录,就可以表示成 ./image,./就表示当前目录。
如果工作目录是D:\temp\movie,要想定位到image目录,相对路径为 ../image,../表示上级目录;
如果当前目录是D:\temp\movie\family,要想定位到image目录,相对路径为 ../../image。
Java中对文件的操作
1、针对文件系统操作(文件的创建,删除,重命名...);
2、针对文件内容的操作(读和写)。
Java中提供了File类。
在构造File对象时,要指定一个路径,此时File对象就是指定路径所对应的文件。
File类中提供了许多方法来操作文件,我们借助代码来讲解:
1、创建File对象
public static void main(String[] args) throws IOException { File file = new File("d:/text.txt"); //返回file对象的文件名称 System.out.println(file.getName()); //返回file对象的父目录文件路径 System.out.println(file.getParent()); //返回file对象的文件路径 System.out.println(file.getPath()); //返回file对象的绝对路径 System.out.println(file.getAbsoluteFile()); //返回file对象规范的绝对路径 System.out.println(file.getCanonicalFile()); }
创建一个File对象,此时的File对象就是d:/test.txt路径对应的文件test.txt(此时不要求d:/下真的有这个对象,这里只是创建了一个对象,而不是创建了一个文件)。看看执行结果:
注意:“/” 和 “\”的效果是一样的,windows上盘符大小写都可以。
我们将上述代码中构造对象的路径改为相对路径,其他不变:
看看执行结果:
两个结果对比,可以看到,getParent()是不会对路径中的“.”或“..”进行路转的,同理getAbsoluteFile()获取到的路径如果包含“.”或“..”是不进行路转的,而getCanonicalFile()是会对“.”或“..”进行路转的。
2、指定路径创建一个文件
public static void main(String[] args) throws IOException { File file = new File("./test.txt"); //创建一个文件 file.createNewFile(); //判断文件是否真的存在 System.out.println(file.exists()); //判断File对象代表的是否为一个普通文件 System.out.println(file.isFile()); //判断file对象代表的文件是否是以个目录 System.out.println(file.isDirectory()); }
可以看到左侧目录也多了text.txt这个文件,如果想删除文件,直接调用delete()就行。
数据流
“流”可以理解为川流不息的水流,Java中将数据流分为两大类,字节流和字符流。
字节流,对文件进行进行读写时,是以“字节”为单位进行10个字节或100个字节的读写操作。Java中提供了以字节流方式读取文件内容的类:InputStream,InputStream是抽象类,不能直接进行new操作,要使用就需要实现具体的类,这里使用FileInputStream。同样的我们借助代码来讲解InputStream的使用:
public static void main(String[] args) throws IOException { InputStream inputStream = new FileInputStream("d:/cat.jpg"); //读取文件 while(true){ //read()返回类型是int,每次读取一个字节的数据,等于-1表示读取完成。 int b = inputStream.read(); if(b == -1){ break; } System.out.printf("%x\n", (byte)b); } //关闭字节流,使用InputStream最后一定要进行这个操作 inputStream.close(); }
Java中提供写操作的类OutputStream,与InputStream类似也是抽象类,要使用具体实现的类,这里使用FileOutputStream。
public static void main(String[] args) throws IOException { //使用write()来进行写操作 try(OutputStream outputStream = new FileOutputStream("d:/test.txt")){ outputStream.write(97);//a对应的ascii为97 outputStream.write(98);//b outputStream.write(99);//c outputStream.write(100);//d //不要忘记这一步 outputStream.flush(); } }
数据流,Java中提供读的类是Reader,Reader也是抽象类,这里使用FileReader,提供写的操作是Writer,也是抽象类,这里使用FileWriter。
public static void main(String[] args) throws IOException {
//进行读操作 Reader reader = new FileReader("d:/test.txt"); while(true){ int ch = reader.read();//read()返回类型为int,当等于-1时,读取完毕 if(ch == -1){ break; } System.out.print("" + (char)ch); } }
写操作:
public static void main(String[] args) throws IOException { Writer writer = new FileWriter("d:/test.txt"); writer.write("hello world"); //刷新缓冲区 writer.flush(); }标签:文件,file,io,System,File,println,操作,out From: https://www.cnblogs.com/xbyss/p/17697509.html