基本概念
- 操作系统中,信息可以持久化的存储在硬盘上,存储在硬盘上的数据就是文件
- 文件夹是用于将不同的文件进行分类的单位
在JDK中提供了java.io.File类对文件进行相关的操作
文件的基本操作
创建一个文件对象(并不代表在硬盘上就创建一个文件,只是将这个文件的基本信息存储在内存中而已)
//绝对路径File file1 = new File("d:/temp/a.txt");File file2 = new File("d:\\temp\\a.txt");//相对路径,相对是当前的工程目录srcFile file3 = new File("a.txt");
需要通过相关的代码才可以真正的创建文件
//判断文件是否存在if(file3.exists()){System.out.println("file3存在");}else{System.out.println("file3并不存在,创建一个新的");//在硬盘上创建一个文件file3.createNewFile();}
文件的相关api操作 :::info createNewFile()//创建一个新文件
mkdir()//创建一个新目录
delete()//删除文件或空目录
exists()//判断File对象所对象所代表的对象是否存在
getAbsolutePath()//获取文件的绝对路径
getName()//取得名字
getParent()//获取文件/目录所在的目录
isDirectory()//是否是目录
isFile()//是否是文件
length()//获得文件的长度
listFiles()//列出目录中的所有内容
renameTo()//修改文件名为 :::
文件的增删改查操作
查询文件夹下所有的文件
public static void showAllFile(File folder){//判断是否是文件夹if(folder.isDirectory()){File[] files = folder.listFiles();//获取当前文件夹下所有的文件for (File file :files) {System.out.println(file.getAbsoluteFile());}}else{System.out.println("当前的文件不是文件夹");}}
创建文件夹
public static void createFolder(String folderPath){File file = new File(folderPath);if(!file.exists()){file.mkdir();System.out.println("创建文件夹成功");}}
修改名称
file.renameTo(dist);删除文件夹
//要支持删除文件夹public static void deleteFile(File file){if(file.isDirectory()){//是文件夹File[] files = file.listFiles();for (File f :files) {deleteFile(f);//删除当前目录下所有的文件}}file.delete();//删除当前文件System.out.println(file.getAbsoluteFile()+"被删除了");}
流操作
基本概述
流的操作,就是实现了两个媒介之间的信息通信,总的来说主要是内存和其他存储设备之间的数据传递
- 根据方向可以分为两类
- 输入流(InputStream):参照物体是内存,指的是从其他媒介将数据输入到内存中。
- 输出流(OutputStream):参照物体是也是内存,指的是从内存中向其他的媒介输出数据
按照单位进行分类
文件夹流是对一般的流的子类实现,主要是对文件进行操作
文件的读取(输入流的使用)
- 基本的读取操作
File file = new File("a.txt");//通过文件创建一个输入InputStream is = new FileInputStream(file);//将文件中的内容读取出来int size = is.available();byte[] buffer = new byte[size];is.read(buffer);//读取数据is.close();//关闭流System.out.println("文件内容的大小:"+size);System.out.println("文件中的内容:"+new String(buffer));
- 基本的读取操作
文件的写入操作
- 基本操作
File file = new File("a.txt");//打开一个输出流,第二参数是append是否是新增OutputStream os = new FileOutputStream(file,true);os.write("这个是新添加的内容".getBytes(StandardCharsets.UTF_8));os.close();;
- 基本操作
实现文件的复制
public static void copy(File srcFile, File distFile){try {//1,打开读取流InputStream in = new FileInputStream(srcFile);//2,打开输出流OutputStream os = new FileOutputStream(distFile);//将数据出来放在内存的缓存中byte[] buffer = new byte[in.available()];in.read(buffer);//将buffer中的数据输出到dist文件中os.write(buffer);//关闭流in.close();os.close();System.out.println("复制完毕");} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
字节缓冲流
为什么要使用缓存流?
- 就是为了减少io的次数
不使用available读取数据(会带上000多余的数据)
File file = new File("a.txt");InputStream in = new FileInputStream(file);byte[] buffer = new byte[1024];StringBuilder sb = new StringBuilder();//获取每次堆区数据的长度while(in.read(buffer)!=-1){//每次读取完毕,都将buffer中的数据放入到StringBuffersb.append(new String(buffer));}//读取数据完毕in.close();System.out.println(sb.toString());
解决多余的000的问题
File file = new File("a.txt");InputStream in = new FileInputStream(file);byte[] buffer = new byte[1024];StringBuilder sb = new StringBuilder();//获取每次堆区数据的长度int len;while( (len=in.read(buffer))!=-1){//每次读取完毕,都将buffer中的数据放入到StringBuffersb.append(new String(buffer,0,len));}//读取数据完毕in.close();System.out.println(sb.toString());
缓存读取流
File file = new File("a.txt");InputStream in = new FileInputStream(file);//使用缓存流,减少io的次数BufferedInputStream bis = new BufferedInputStream(in);byte[] buffer = new byte[1024];StringBuilder sb = new StringBuilder();//获取每次堆区数据的长度int len;while( (len=bis.read(buffer))!=-1){//每次读取完毕,都将buffer中的数据放入到StringBuffersb.append(new String(buffer,0,len));}//读取数据完毕bis.close();in.close();//输出结果System.out.println(sb.toString());
缓存输出流
File file = new File("e:/2.mp4");File distFile = new File("b.mp4");InputStream in = new FileInputStream(file);//使用缓存流,减少io的次数BufferedInputStream bis = new BufferedInputStream(in);//创建输出流OutputStream os = new FileOutputStream(distFile);BufferedOutputStream bos = new BufferedOutputStream(os);byte[] buffer = new byte[1024];//获取每次堆区数据的长度int len;while( (len=bis.read(buffer))!=-1){bos.write(buffer,0,len);//输出到缓存中}bos.flush();//确保缓存流中的数据输出到文件中bos.close();os.close();//读取数据完毕bis.close();in.close();System.out.println("复制完毕");
字符流
是为了简化对字符串的操作,字符流只能对字符串进行操作,不可以对文件进行操作
- Reader:读取字符到内存中
- Writer:从内存中输出字符
字符读取流的使用
基本使用
File file = new File("a.txt");Reader reader = new FileReader(file);//创建缓存流BufferedReader br= new BufferedReader(reader);StringBuilder sb = new StringBuilder();String line;while( (line=br.readLine())!=null){sb.append(line +"\n");}System.out.println(sb.toString());
缓存流的使用(BufferedReader)
File file = new File("a.txt");Reader reader = new FileReader(file);//创建缓存流char[] ch = new char[1024];StringBuilder sb = new StringBuilder();int len;while((len =reader.read(ch))>0){sb.append(new String(ch,0,len));}System.out.println(sb.toString());
字符在输出的时候,可以使用打印流(PrintWriter)
File file = new File("b.txt");PrintWriter printWriter = new PrintWriter(file);printWriter.println("第一行数据");printWriter.print("1,小明;");printWriter.print("2,小黑;");printWriter.close();
文件流
可以直接将对象输出到文件中
创建一个对象,必须要实现序列化
public class UserEntity implements Serializable {String name;String password;}
实现对象的输出
UserEntity userEntity = new UserEntity("小明","123");File file = new File("d:/user.dat");//文件输出流OutputStream os = new FileOutputStream(file);//对象输出流ObjectOutputStream oos = new ObjectOutputStream(os);//输出对象oos.writeObject(userEntity);oos.flush();//清除缓存流//关闭流oos.close();os.close();System.out.println("对象保存到文件中");
也可以从文件中读取对象
File file = new File("d:/user.dat");//根据文件创建输入流InputStream is = new FileInputStream(file);//创建对象输入流ObjectInputStream ois = new ObjectInputStream(is);//读取对象UserEntity userEntity = (UserEntity) ois.readObject();System.out.println(userEntity.getName()+":"+userEntity.getPassword());
什么是序列化?
- 对象在内存中存储的数据不一定是连续,这样在传递的数据(脱离内存)的时候并不方便
- 需要将内存的数据进行压缩排序,一次性发送
- 有序列化就会有反序列化
- 由于序列化的对象只存储数据,可能会在反序列化的时候出现混淆的问题
- 这个时候可以使用serialVersionUID 为每个不同的类进行标识
public static final long serialVersionUID = 3121231L;
- 主要用于java的配置文件的设置
- 可以在java工程创建创建后缀名称为properties的文件
- 在文件中以key=value的形式存储内容
name=小王
在代码中通过Properties对象读取数据
//创建一个PropertiesProperties ps = new Properties();//加载properties文件//从src目录下获取InputStream in = TestProperties.class.getClassLoader().getResourceAsStream("com/java2022/io/ps/my.properties");//可以从当前类所在的包下打开一个文件的io流//InputStream in = TestProperties.class.getResourceAsStream("my.properties");/*File file = new File("my.properties");InputStream in = new FileInputStream(file);*/ps.load(in);//加载完毕之后直接可以key获取值String name = ps.getProperty("name");System.out.println("名称:"+name);
