JAVASE02-Unit06: 文件操作——File 、 文件操作—— RandomAccessFile
Unit06: 文件操作——File 、 文件操作—— RandomAccessFile
java.io.File
File的每一个实例是用来表示文件系统中的一个文件或目录
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package day06; import java.io.File; /** * java.io.File * File的每一个实例是用来表示文件系统中的一个 * 文件或目录 * 使用File可以: * 1:访问文件或目录的属性信息 * 2:操作文件或目录(创建,删除) * 3:访问一个目录的子项 * 但是不能: * 访问文件数据。 * @author adminitartor * */ public class File_Properties { public static void main(String[] args) { /* * 描述路径时应当使用相对路径。 * 常用相对路径: * 类加载路径 * * 当前目录".",在eclipse下是当前类所在 * 项目的跟目录(jsd1611_se这个目录) */ File file = new File( "."+File.separator+"demo.txt" ); String name = file.getName(); System.out.println("name:"+name); long length = file.length(); System.out.println("length:"+length); boolean canRead = file.canRead(); boolean canWrite = file.canWrite(); System.out.println("可读:"+canRead); System.out.println("可写:"+canWrite); //最后修改时间 long time = file.lastModified(); boolean isHidden = file.isHidden(); } }
使用File创建一个文件
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package day06; import java.io.File; import java.io.IOException; /** * 使用File创建一个文件 * @author adminitartor * */ public class File_CreateNewFile { public static void main(String[] args) throws IOException { /* * 当前目录下创建一个名为test.txt的文件 */ File file = new File("test.txt"); /* * boolean exists() * 判断当前File表示的文件或目录是否已经真实 * 存在 */ if(!file.exists()){ /* * 创建File表示的文件 */ file.createNewFile(); System.out.println("文件已创建!"); }else{ System.out.println("文件已存在!"); } } }
删除一个文件
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package day06; import java.io.File; /** * 删除一个文件 * @author adminitartor * */ public class File_Delete { public static void main(String[] args) { /* * 将当前目录下的test.txt文件删除 */ File file = new File("test.txt"); if(file.exists()){ file.delete(); System.out.println("删除完毕!"); }else{ System.out.println("文件不存在!"); } } }
创建一个目录
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package day06; import java.io.File; /** * 创建一个目录 * @author adminitartor * */ public class File_Mkdir { public static void main(String[] args) { /* * 当前目录下创建一个目录demo */ File dir = new File("demo"); if(!dir.exists()){ dir.mkdir(); System.out.println("目录创建完毕!"); }else{ System.out.println("该目录已存在!"); } } }
创建一个多级目录
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package day06; import java.io.File; /** * 创建一个多级目录 * @author adminitartor * */ public class File_Mkdirs { public static void main(String[] args) { /* * 在当前目录下创建目录: * a/b/c/d/e/f */ File dir = new File( "a"+File.separator+ "b"+File.separator+ "c"+File.separator+ "d"+File.separator+ "e"+File.separator+ "f" ); if(!dir.exists()){ /* * 在创建File表示的目录同时将所有 * 不存在的父目录自动创建出来 */ dir.mkdirs(); System.out.println("目录已创建!"); }else{ System.out.println("该目录已存在!"); } } }
删除一个目录
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package day06; import java.io.File; /** * 删除一个目录 * @author adminitartor * */ public class File_Delete2 { public static void main(String[] args) { File dir = new File("a"); if(dir.exists()){ /* * 若删除目录,必须保证该目录是一个 * 空目录(不含有任何子项) */ dir.delete(); System.out.println("删除目录完毕!"); }else{ System.out.println("该目录不存在!"); } } }
获取一个目录中的所有子项
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package day06; import java.io.File; /** * 获取一个目录中的所有子项 * @author adminitartor * */ public class File_ListFiles { public static void main(String[] args) { /* * 查看当前目录下的所有子项 */ File dir = new File("."); /* * boolean isFile() * 判断当前File表示的是否是一个文件 * boolean isDirectory() * 判断当前File表示的是否是一个目录 */ if(dir.isDirectory()){ File[] subs = dir.listFiles(); for(File sub : subs){ if(sub.isFile()){ System.out.print("文件:"); }else{ System.out.print("目录:"); } System.out.println(sub.getName()); } } } }
(用递归实现)编写一个方法,用来将给定的File表示的文件或目录删除
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package day06; import java.io.File; /** * 编写一个方法,用来将给定的File表示的文件或 * 目录删除 * @author adminitartor * */ public class Test { public static void main(String[] args) { File dir = new File("a"); delete(dir); } public static void delete(File f){ //若是一个目录,需要先将其所有子项删除 if(f.isDirectory()){ File[] subs = f.listFiles(); for(File sub : subs){ delete(sub); } } f.delete(); } } /* * 1:编写一段代码,实现1+2+3+....100 * 并输出结果。 * 要求在整段代码中不得出现while,for关键字 * * 2:一个人有20块钱,去买汽水 * 1块钱1瓶汽水,3个瓶盖可以换一瓶汽水,2个 * 空瓶可以换一瓶汽水,问:总共可以喝多少瓶汽水 * */
* File提供了一个重载的listFiles方法,允许传入
* 一个文件过滤器java.io.FileFilter,然后将满足
* 该过滤器要求的子项返回。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package day06; import java.io.File; import java.io.FileFilter; /** * File提供了一个重载的listFiles方法,允许传入 * 一个文件过滤器java.io.FileFilter,然后将满足 * 该过滤器要求的子项返回。 * @author adminitartor * */ public class File_ListFiles2 { public static void main(String[] args) { File dir = new File("."); /* * 获取当前目录下所有的文本文件 */ FileFilter filter = new FileFilter(){ /** * 过滤器中的accept方法的作用是定义过滤 * 规则。若给定的File对象满足要求则返回 * true。listFiles方法将来就会将所有满足 * 要求的子项返回。 */ public boolean accept(File f) { String fileName = f.getName(); System.out.println("正在过滤:"+fileName); return fileName.endsWith(".txt"); } }; File[] subs = dir.listFiles(filter); for(File sub : subs){ System.out.println(sub.getName()); } } }
java.io.RandomAccessFile
用于读写文件数据
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package day06; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; /** * java.io.RandomAccessFile * 用于读写文件数据,读写操作是基于指针进行的,即 * RAF总是在指针位置读写字节,并且指针会自动向后 * 移动。 * RAF有两种常用的创建模式: * "r":只读模式,仅对文件进行读取操作 * "rw":读写模式,对文件又读又写 * * @author adminitartor * */ public class RandomAccessFile_Write { public static void main(String[] args) throws IOException { /* * RandomAccessFile提供的常用构造方法: * RandomAccessFile(String path,String mode) * RandomAccessFile(File file,String mode) * * mode对应的就是操作模式:"rw","r" */ RandomAccessFile raf = new RandomAccessFile( "raf.dat","rw" ); /* * void write(int d) * 将给定的int值对应的2进制的"低八位"写 * 入文件.写出1个字节 * vvvvvvvv * 00000000 00000000 00000000 00000001 */ raf.write(1); System.out.println("写出完毕!"); raf.close(); } }
使用RandomAccessFile读取文件数据
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package day06; import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; /** * 使用RandomAccessFile读取文件数据 * @author adminitartor * */ public class RandomAccessFile_Read { public static void main(String[] args) throws IOException { RandomAccessFile raf = new RandomAccessFile( "raf.dat","r" ); /* * 读取一个字节,并以10进制形式的int值 * 返回。若返回值为-1,则表示读取到了文件 * 的末尾。 * * 00000000 00000000 00000000 00000001 */ int d = raf.read();//1 System.out.println(d); d = raf.read(); System.out.println(d);//? raf.close(); } }
复制文件
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package day06; import java.io.IOException; import java.io.RandomAccessFile; /** * 复制文件 * @author adminitartor * */ public class CopyDemo1 { public static void main(String[] args) throws IOException { RandomAccessFile src = new RandomAccessFile( "mv.mp4","r" ); RandomAccessFile desc = new RandomAccessFile( "mv_cp.mp4","rw" ); int d = -1; long start = System.currentTimeMillis(); while( (d = src.read()) != -1 ){ desc.write(d); } long end = System.currentTimeMillis(); System.out.println("复制完毕!耗时:"+(end-start)+"ms"); src.close(); desc.close(); } }
若想提高读写效率,可以通过提高每次读写的数据量减少读写次数来达到
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package day06; import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; /** * 若想提高读写效率,可以通过提高每次读写的数据 * 量减少读写次数来达到 * @author adminitartor * */ public class CopyDemo2 { public static void main(String[] args) throws IOException { RandomAccessFile src = new RandomAccessFile( "mv.mp4","r" ); RandomAccessFile desc = new RandomAccessFile( "mv_cp2.mp4","rw" ); /* * int read(byte[] data) * 一次性读取给定字节数组长度的字节量,并 * 将读取到的字节存入到该数组中。返回值为 * 实际读取到的字节量,若本次没有读取到任 * 何字节(文件末尾)则返回值为-1 */ // 10k byte[] buf = new byte[1024*10]; //表示每次实际读取到的字节量 int len = -1; long start = System.currentTimeMillis(); while( (len = src.read(buf)) !=-1 ){ /* * void write(byte[] data) * 将给定的字节数组中的所有字节一次性 * 写出 * * void write(byte[] data,int i,int len) * 将给定的字节数组中从下标为i处的字节开始的连续 * len个字节写出 */ desc.write(buf,0,len); } long end = System.currentTimeMillis(); System.out.println("复制完毕!耗时:"+(end-start)+"ms"); src.close(); desc.close(); } }
使用RAF读写数据,以及理解基于指针的操作
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package day06; import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; /** * 使用RAF读写数据,以及理解基于指针的操作 * @author adminitartor * */ public class RandomAccessFile_RW_DATA { public static void main(String[] args) throws IOException { RandomAccessFile raf = new RandomAccessFile( "raf.dat","rw" ); //获取指针当前位置 long pos = raf.getFilePointer(); System.out.println("pos:"+pos); //向文件中写入int值 int max = Integer.MAX_VALUE; /* * vvvvvvvv * 01111111 11111111 11111111 11111111 */ raf.write(max>>>24); System.out.println("pos:"+raf.getFilePointer()); raf.write(max>>>16); raf.write(max>>>8); raf.write(max); System.out.println("pos:"+raf.getFilePointer()); /* * void writeInt(int d) * 将给定的int值对应的4个字节的2进制 * 写入文件 */ raf.writeInt(max); System.out.println("pos:"+raf.getFilePointer()); raf.writeDouble(123.123); System.out.println("pos:"+raf.getFilePointer()); raf.writeLong(1234L); System.out.println("pos:"+raf.getFilePointer()); System.out.println("写出完毕!"); /* * void seek(long pos) * 将指针移动到指定位置 */ //移动到文件最开始 raf.seek(0); System.out.println("pos:"+raf.getFilePointer()); /* * RAF提供了方便读取基本类型的方法 * 如: * int readInt() * 该方法会连续读取4个字节并转换为int值 * 返回,若在文件末尾读取,则抛出 * EOFException这个异常. * End Of File 文件末尾 */ int n = raf.readInt(); System.out.println(n); System.out.println("pos:"+raf.getFilePointer()); //读取long raf.seek(16); long l = raf.readLong(); System.out.println(l); System.out.println("pos:"+raf.getFilePointer()); //读取double raf.seek(8); double d = raf.readDouble(); System.out.println(d); raf.seek(0); l = raf.readLong(); System.out.println(l); raf.close(); } }
读写字符串
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package day06; import java.io.IOException; import java.io.RandomAccessFile; /** * 读写字符串 * @author adminitartor * */ public class RandomAccessFile_RW_String { public static void main(String[] args) throws IOException { RandomAccessFile raf = new RandomAccessFile( "raf.txt","rw" ); String str = "简单点,说话的方式简单点."; /* * byte getBytes() * byte getBytes(String csn) * 字符串提供了将内容转换为一组字节的方法。 * 无参的是按照系统默认字符集,有参数的 * 则是按照给定名字的字符集转换。 */ byte[] data = str.getBytes("UTF-8"); raf.write(data); str = "递进的情绪请省略,你又不是个演员,别设计那些情节"; raf.write(str.getBytes("UTF-8")); System.out.println("写出完毕!"); raf.seek(0); byte[] array = new byte[200]; int len = raf.read(array); /* * String提供了构造方法可以将给定的字节数组 * 按照指定的字符集转换为字符串内容 */ String s = new String(array,0,len,"UTF-8"); System.out.println(s); raf.close(); } }