文章目录
File
文件
广义上的文件:
在Linux操作系统中会将其管理 的软硬件资源抽象成文件进行管理
如键盘,电脑需要读取用户从键盘上输入的东西,就是将键盘抽象成文件,读取该文件就能获取到用户的输入。
狭义上的文件:
存储在硬盘上的文件
比如普通文本,pdf文件,视频,音频,图片。
文件的类型
文件的类型通常以扩展名来体现,比如java文件的后缀是.java,一般的图片的后缀是.jpg,一般的文本文件的后缀是.txt。每种文件都有特定的格式,代表着该文件与二进制的 之间的映射关系。比如.md文件,其中可以包含图片,文字,字体颜色等。对于一种文件通常可以使用一个或者过个应用程序进行查看和编辑,一个应用程序可以解读一种或者多种文件。比如使用idea可以VS Code既可以打开普通文件又可以打开md文件。在操作系统上,一个扩展名通常关联一个程序,当用户双击某种文件时,操作系统会去寻找相关的程序,如果找到了会启动该程序,并将该文件的路径传递给它,程序再打开文件。
文件的类型可以大概分为以下两种:
- 1.文件文件
比如文本文件,html文件,java文件。 - 2.二进制文件
比如压缩文件,PDF文件,word文件 - 区分文本文件与二进制文件的方法
在电脑上使用记事本打开,如果没有出现乱码则是文本文件,出现乱码则是二进制文件。
文件系统
文件一般存放在硬盘上,一台机器上可能有多个硬盘,但是操作系统都会隐藏物理硬盘的概念,提供一个逻辑上的统一结构,在windows中,可以有多个逻辑盘,如C,D,E等。每个盘都可以被格式化成一种不同的文件系统,
文件路径
在逻辑上,Windows中有多个根目录,每个根目录下有一棵子目录和文件构成的树。每个文件都有路径路径概念,路径有两种形式,一种是绝对路径:从盘符开始的路径,如:D:\game\植物僵尸。另一种是相对路径:是相对于当前目录而言,并且不以盘符开头。相对路径必须的有一个基准路径,以D:\game\植物僵尸为基准,在植物大战僵尸的目录下,要找到PlantsVsZombies.exe,则使用相对路径可以表示为./PlantsVsZombies.exe,此处的.表示为当前目录即D:\game\植物僵尸。
Java中操作文件
File
Java 中通过 java.io.File 类来对一个文件(包括目录)进行抽象的描述。该类相当于一个抽象的文件路径,能够在此路径中进行文件的创建,修改,删除等。但是不能读写文件的内容。
注意
- 1.File对象可以定位文件和文件夹
- 2.File封装的对象仅仅是一个路径名,该路径名可以存在 可以不存在。
File的构造方法
代码示例
package com.kc.system.io; import java.io.File; public class FileDemo2 { public static void main(String[] args) { //定位到该绝对路径下的图片 File f = new File("D:/picture/1.jpg"); //输出文件的大小 System.out.println(f.length()); //使用相对路径定位到项目中的文件 File file2 = new File("./bbb.txt"); System.out.println(file2.length()); File file3 = new File("D:/tools"); System.out.println(file3.exists()); } }
File类的常用API
File类的判断文件类型、获取文件信息功能
代码示例
package com.kc.system.io; import java.io.File; import java.text.SimpleDateFormat; public class FileDemo3 { public static void main(String[] args) { File file = new File("D:\\game"); //判断是否为文件 System.out.println(file.isFile()); //判断是否为文件夹 System.out.println(file.isDirectory()); //判断该文件存在 System.out.println(file.exists()); //获取绝对路径 System.out.println(file.getAbsolutePath()); //获得该路径表示的文件或者文件夹的名称 System.out.println(file.getName()); //将该路径转换成字符串 System.out.println(file.getPath()); //返回文件最后的修改时间 System.out.println( new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(file.lastModified())); } }
File创建文件的功能
代码示例
package com.kc.system.io; import java.io.File; import java.io.IOException; public class FileDemo4 { public static void main(String[] args) throws IOException { File file = new File("D:/Demo"); //创建新的空的文件 System.out.println(file.createNewFile()); //创建一级文件夹 File file2 = new File("D:/test"); System.out.println(file2.mkdir()); //创建多级文件夹 File file3 = new File("D:/test/C/C++"); System.out.println( file3.mkdirs()); } }
File删除文件的功能
代码示例
package com.kc.system.io; import java.io.BufferedReader; import java.io.File; public class FileDemo5 { public static void main(String[] args) { File file = new File("D:/Demo"); System.out.println(file.delete()); File file3 = new File("D:/test/C/C++"); System.out.println(file3.delete()); } } //结果 //true //true
注意:
- 1.delete方法默认只能删除文件和文件夹
- 2.delete方法直接删除不走回收站
- 3.默认不能删除非空文件夹
File遍历文件夹
代码示例
package com.kc.system.io; import java.io.File; import java.util.Arrays; public class FileDemo6 { public static void main(String[] args) { File file = new File("D:/software"); //获得该路径下文件的名称 String[] list = file.list(); System.out.println(Arrays.toString(list)); File file2 = new File("D:/software"); //获得该路径下所有文件对象的抽象路径 System.out.println(Arrays.toString(file2.listFiles())); File file4 = new File("D:/demo"); //文件夹不存在时 System.out.println(Arrays.toString(file4.listFiles())); //抽象路径为文件(不是文件夹)时 File file5 = new File("D:/demo.txt"); System.out.println(Arrays.toString(file5.listFiles())); //当文件夹为空时 File file6 = new File("D:/test"); System.out.println(Arrays.toString(file6.listFiles())); } } //运行结果 //[nacicat, PyCharm Community Edition 2022.2, python, 新版navicat及破解软件, 新版navicat及破解软件_2.rar] //[D:\software\nacicat, D:\software\PyCharm Community Edition 2022.2, D:\software\python, D:\software\新版navicat及破解软件, D:\software\新版navicat及破解软件_2.rar] //[] //null //[]
字符集
字符集的基础知识
1.字符:计算机世界中关于文字和符合的统称,如一个汉字,一个字符,一个标点符号等。
2.字符编码:,由于计算机只能识别二进制,而十进制于二进制是可以互相转换的,所以人们对现实世界中字符用十进制进行编号,这些字符转换成计算机能够识别的二进制的过程,则被称为字符编码。
3.字符集:由于每个国家的文字不一样的,文字的个数也不相同,进行编号的规则也有所差异,这种编号规则就是字符集。
常见的字符集
ASCII字符集:
ASCII(American Standard Code for Information Interchange,美国信息交换标准代码):包括了数字、英文、符号。
SCII使用1个字节存储一个字符,一个字节是8位,总共可以表示128个字符信息,对于英文,数字来说是够用的。
GBK:
window系统默认的码表。兼容ASCII码表,也包含了几万个汉字,并支持繁体汉字以及部分日韩文字。
注意:GBK是中国的码表,一个中文以两个字节的形式存储。但不包含世界上所有国家的文字。
Unicode码表:
unicode(又称统一码、万国码、单一码)是计算机科学领域里的一项业界字符编码标准。
容纳世界上大多数国家的所有常见文字和符号。
由于Unicode会先通过UTF-8,UTF-16,以及 UTF-32的编码成二进制后再存储到计算机,其中最为常见的就是UTF-8。
注意
- 1.Unicode是万国码,以UTF-8编码后一个中文一般以三个字节的形式存储。
- 2.UTF-8也要兼容ASCII编码表。
- 3.技术人员都应该使用UTF-8的字符集编码。
- 4.编码前和编码后的字符集需要一致,否则会出现中文乱码。
- 汉字存储和解析过程
字符集的编码,解码操作
String编码
String解码
代码示例
package com.kc.system.io; import java.io.UnsupportedEncodingException; public class Demo6 { public static void main(String[] args) throws UnsupportedEncodingException { String str = "今天天气真好"; //指定编码 byte[] bytes = str.getBytes("UTF-8"); //解码 将字节转换成中文(编码前后的字符集需要一致,否则会乱码) String s = new String(bytes,"UTF-8"); System.out.println(s); } }
IO流
流
现实世界中有水流,电流。所谓的IO流就是对文件读写,当程序需要读取数据时,就可以想象有一个数据源,而数据源与程序之间就有一条管道,管道中流动的东西就是数据,这些数据就从数据源流向程序,数据源可以是硬盘,内存。同理当程序需要向文件写入数据时就会开启一个通往目的地管道,需要写入的数据就会像水流一般流过去。
注意
- 1.输入和输出是相对于内存而言
- 2.流只能单方向流动
- 3.输入流用来读
- 4.输出流用来读
流的分类
按流的方向分
- 输出流
- 输入流
- 按流中数据最小的单位分
- 字符流(任意文件)
- 字节流(只能操作纯文本文件)
字节流使用
IO流体系
FileInputStream
作用:以内存为基准,把磁盘文件中的数据以字节的形式读取到内存中去。
代码示例
package com.kc.system.io; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; public class InputStreamDemo { public static void main(String[] args) throws IOException { InputStream inputStream = new FileInputStream("bbb.txt"); int val; while ((val=inputStream.read())!=-1) { System.out.print(val+" "); } if (inputStream!=null) { inputStream.close(); } } } //运行结果 //97 98 51 97 98 99 100 99 100 package com.kc.system.io; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; public class InputStreamDemo2 { public static void main(String[] args) throws IOException { InputStream inputStream = new FileInputStream("bbb.txt"); byte[] buffer = new byte[3];//用于存储从文件中读取的内容 int len; // 记录每次读取的字节数。 while ((len = inputStream.read(buffer)) != -1) { // 读取多少倒出多少 System.out.print(new String(buffer, 0 , len)); } if (inputStream!=null) { inputStream.close(); } } } //运行结果 //ab3abcdcd
FileOutputStream
作用:以内存为基准,把内存中的数据以字节的形式写出到磁盘文件中去的流。
文件字节输出流(FileOutputStream)写数据出去的API
流的关闭与刷新
代码示例
package com.kc.system.io; import java.io.FileOutputStream; import java.io.OutputStream; public class OutputStreamDemo { public static void main(String[] args) throws Exception { //append设置为true表示为可以在文件后追加数据,不会将第一次的数据给刷了 OutputStream outputStream = new FileOutputStream("bbb.txt",true); outputStream.write(97); outputStream.write(98); outputStream.write(99); byte [] buffer = new byte[]{100,101,102}; outputStream.write(buffer); byte[] bytes = "1223".getBytes(); outputStream.write(bytes,0,2); //为了避免频繁对硬盘操作,是先将数据放到缓冲区,然后数据在将数据磁写到文件 outputStream.flush();//关闭前要刷新缓冲区,将剩余的数据全部写到文件 if (outputStream!=null) { outputStream.close(); } } }
文件字符输入流:Reader
作用:以内存为基准,把磁盘文件中的数据以字符的形式读取到内存中去。
代码示例
package com.kc.system.io; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.Reader; import java.util.Arrays; public class FileWriteDemo { public static void main(String[] args) throws IOException { Reader reader = new FileReader("bbb.txt"); // int read = 0; // while((read=reader.read())!=-1) { // System.out.print((char)read+" "); // } char [] arr = new char[3]; int read = 0; while ((read=reader.read(arr))!=-1) { System.out.print(Arrays.toString(arr)); } reader.close(); } } 运行结果 [a, b, c][d, e, f][1, 2, f]
字符流的好处:读取中文字符不会出现乱码,因为是一个字符一个字符读取的。
文件字符输出流:FileWriter
作用:以内存为基准,把内存中的数据以字符的形式写出到磁盘文件中去的流
文件字符输出流(FileWriter)写数据出去的API
流的关闭与刷新
代码示例
package com.kc.system.io; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; public class FileWriterDemo { public static void main(String[] args) throws IOException { //数据追加 Writer writer = new FileWriter("bbb.txt",true); writer.write("124"); writer.write(new char []{'a','b','c','d'},0,2); writer.write(new char []{'e','f','g','h'}); writer.write(new String("zxcvb"),0,3); writer.flush(); writer.write("1244434"); if (writer!=null) { writer.close(); } } }
缓冲流概述
缓冲流自带缓冲区,先是将要操作的数据存放在缓冲区,然后才和内存或者硬盘交互,可以提高字节流,字符流读写数据的性能。
字节缓冲流性能优化原理:
字节缓冲输入流自带了8KB缓冲池,以后我们直接从缓冲池读取数据,所以性能较好。
字节缓冲输出流自带了8KB缓冲池,数据就直接写入到缓冲池中去,写数据性能极高了
字节缓冲流
- 字节缓冲输入流:BufferedInputStream,提高字节输入流读取数据的性能,读写功能上并无变化。
- 字节缓冲输出流:BufferedOutputStream,提高字节输出流读取数据的性能,读写功能上并无变化。
- 代码示例
package com.kc.system.io; import java.io.*; /** * 复制文件夹下的文件 *1.首先将文件读入内存 * 2.将文件写到目标路径 * 硬盘--->内存---->硬盘 */ public class BufferDemo { public static void main(String[] args) { try( //这里面只能放置资源对象,用完会自动关闭:自动调用资源对象的close方法关闭资源 //1.创建一个字节p输入流管道与图片接通 InputStream inputStream = new FileInputStream("D:/picture/1.jpg"); // 2.把原始的字节输入流包装成高级的缓冲字节输入流 InputStream in = new BufferedInputStream(inputStream); // 3、创建一个字节输出流管道与目标文件接通 OutputStream outputStream = new FileOutputStream("D:/picture/3.jpg"); // 4.把字节输出流管道包装成高级的缓冲字节输出流管道 OutputStream out = new BufferedOutputStream(outputStream); ){ byte [] buffer = new byte[4]; int size = 0; while ((size=in.read(buffer))!=-1) { out.write(buffer,0,size); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
字符缓冲输入流
字符缓冲输入流:BufferedReader。
作用:提高字符输入流读取数据的性能,除此之外多了按照行读取数据的功能。
代码示例一
package com.kc.system.io; import java.io.*; public class BufferReaderDemo { public static void main(String[] args) { try(Reader reader = new FileReader("bbb.txt"); BufferedReader bufferedReader = new BufferedReader(reader); ){ char [] buffer = new char[4]; int len = 0; while ((len=bufferedReader.read(buffer))!=-1) { System.out.println(new String(buffer,0,len)); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
字符缓冲输出流
字符缓冲输出流:BufferedWriter。
作用:提高字符输出流写取数据的性能,除此之外多了换行功能
代码示例二
package com.kc.system.io; import java.io.*; public class BufferWriterDemo { public static void main(String[] args) { try(Writer write = new FileWriter("bbb.txt"); BufferedWriter bufferedWriter = new BufferedWriter(write);){ bufferedWriter.write(97); bufferedWriter.write(new char[]{'b','c','d','e','f'}); bufferedWriter.newLine(); bufferedWriter.write(new String("efasdfg")); write.flush(); } catch (IOException e) { e.printStackTrace(); } } }
总结
文件操作的类虽然看起来很多,但是只有用好一组类,其它的类基本上都是类似的使用。
最后的话
各位看官如果觉得文章写得不错,点赞评论关注走一波!谢谢啦!