文件操作

File对象:文件和目录路径名的抽象表示

File对象:java本身不能直接操作文件,需要通过java虚拟机与操作系统进行联系,从而建立起java与文件之间的联系。因此,这里的File是个抽象的表示,可能存在、可能不存在、可能是文件、也可能是文件夹(目录)。

构建File对象

1、File(String pathname)

  1. String path="E:/idea/IO_study/ThreadState.png";
  2. //File(String pathname)
  3. File src=new File(path);

2、File(String parent, String child)

  1. File src=new File("E:/idea/IO_study","ThreadState.png");
  2. File src=new File("E:/idea/","IO_study/ThreadState.png");

3、File(File parent, String child)

  1. File src=new File(new File("E:/idea/IO_study"),"ThreadState.png");

完整代码

  1. public class FileDemo01 {
  2. public static void main(String[] args) {
  3. String path="E:/idea/IO_study/ThreadState.png";
  4. //1、构建File对象
  5. //File(String pathname)
  6. File src=new File(path);
  7. System.out.println(src.length());
  8. //2、构建File对象
  9. //File(String parent, String child)
  10. src=new File("E:/idea/IO_study","ThreadState.png");
  11. src=new File("E:/idea/","IO_study/ThreadState.png");
  12. System.out.println(src.length());
  13. //3、构建File对象
  14. //File(File parent, String child)
  15. src=new File(new File("E:/idea/IO_study"),"ThreadState.png");
  16. System.out.println(src.length());
  17. //构建不存在文件
  18. src=new File("tfp/a.png");
  19. System.out.println(src.getAbsoluteFile());
  20. }
  21. }

API方法

名称及路径

  1. 1getName():返回名称
  2. 2getPath():返回路径,相对或者绝对
  3. 3getAbsolutePath():返回绝对路径
  4. 4getParent():返回父路径,不存在返回空
  5. public class FileDemo02 {
  6. public static void main(String[] args) {
  7. File src=new File("E:\\idea\\IO_study\\ThreadState.png");
  8. System.out.println("名称:"+src.getName());
  9. System.out.println("路径:"+src.getPath());
  10. System.out.println("绝对路径:"+src.getAbsolutePath());
  11. System.out.println("父路径:"+src.getParent());
  12. System.out.println("父对象:"+src.getParentFile().getName());
  13. }
  14. }

文件状态

  1. 1、对象是否存在:isexists()
  2. 2、是否是文件夹:isDirectory()
  3. 3、是否是文件:isFile()
  4. public class FileDemo03 {
  5. public static void main(String[] args) {
  6. File src=new File("E:\\idea\\IO_study\\ThreadState.png");
  7. System.out.println("是否存在:"+src.exists());
  8. System.out.println("是否是文件夹:"+src.isDirectory());
  9. System.out.println("是否是文件:"+src.isFile());
  10. System.out.println("-----------------");
  11. src=new File("xxx");
  12. if(null==src||!src.exists()){
  13. System.out.println("文件不存在");
  14. }else {
  15. if(src.isDirectory()){
  16. System.out.println("文件夹操作");
  17. }else{
  18. System.out.println("文件操作");
  19. }
  20. }
  21. }
  22. }

文件的长度

  1. 文件的长度:length()字节数
  2. public class FileDemo04 {
  3. public static void main(String[] args) {
  4. File src=new File("E:\\idea\\IO_study\\ThreadState.png");
  5. System.out.println("文件长度:"+src.length());
  6. src=new File("E:\\idea\\IO_study\\ThreadState2.png");
  7. System.out.println("文件长度:"+src.length());
  8. }
  9. }

文件的创建与删除

  1. 1createNewFile():创建文件,不存在才创建
  2. 2delete():删除文件
  3. 3、不能创建文件夹
  4. 4、对于像con,com3.....等这样的操作系统的设备名无法创建
  5. public class FileDemo05 {
  6. public static void main(String[] args) throws IOException {
  7. File src=new File("E:\\idea\\IO_study\\io.txt");
  8. boolean flag=src.createNewFile();
  9. System.out.println("文件创建:"+flag);
  10. flag=src.delete();
  11. System.out.println("文件删除:"+flag);
  12. }
  13. }

目录的操作

创建目录

  1. 1mkdir():确保上级目录存在,才可以创建
  2. 2mkdirs():上级目录可以不存在,不存在一同来创建
  3. public class DirDemo01 {
  4. public static void main(String[] args) {
  5. File dir=new File("E:/idea/IO_study/dir/test");
  6. //创建目录mkdirs()
  7. boolean flag=dir.mkdirs();
  8. System.out.println(flag);
  9. //创建目录mkdir()
  10. dir=new File("E:/idea/IO_study/dir/test2");
  11. flag=dir.mkdir();
  12. System.out.println(flag);
  13. }
  14. }

子孙文件

  1. 1list();列出下一级名称
  2. 2listFile():列出下一级对象
  3. 3、列出所有盘符:listRoots()
  4. public class DirDemo02 {
  5. public static void main(String[] args) {
  6. File dir=new File("E:/idea/IO_study");
  7. //列出下一级名称
  8. String [] subNmaes=dir.list();
  9. for(String sname:subNmaes){
  10. System.out.println(sname);
  11. }
  12. //列出下一级对象
  13. File[] subFiles=dir.listFiles();
  14. for(File sf:subFiles){
  15. System.out.println(sf);
  16. }
  17. //列出所有盘符:listRoots()
  18. File[] roots=dir.listRoots();
  19. for(File rs:roots){
  20. System.out.println(rs);
  21. }
  22. }
  23. }

递归实现子孙文件列出

  1. public class DirDemo03 {
  2. public static void main(String[] args) {
  3. File src=new File("E:/idea/IO_study");
  4. printName(src,0);
  5. }
  6. private static void printName(File src,int deep) {
  7. //控制前面层次
  8. for(int i=0;i<deep;i++){
  9. System.out.print("-");
  10. }
  11. //打印名称
  12. System.out.println(src.getName());
  13. if(null==src||!src.exists()){
  14. return;
  15. }else if(src.isDirectory()){
  16. for(File s:src.listFiles()){
  17. printName(s,deep+1);
  18. }
  19. }
  20. }
  21. }
  1. //面向对象递归实现文件夹子孙级文件和文件夹的大小、个位
  2. public class DirCount {
  3. //文件大小
  4. private long len;
  5. //文件路径
  6. private String path;
  7. //文件的个数
  8. private int fileSize=0;
  9. //文件夹的个数
  10. private int dirSize=-1;
  11. //构造方法
  12. private File src;
  13. public DirCount(String path) {
  14. this.path = path;
  15. this.src=new File(path);
  16. count(this.src);
  17. }
  18. private void count(File src) {
  19. if(null!=src&&src.isFile()){
  20. this.fileSize++;
  21. len+=src.length();
  22. }else{
  23. this.dirSize++;
  24. for(File s:src.listFiles()){
  25. count(s);
  26. }
  27. }
  28. }
  29. public long getLen() {
  30. return len;
  31. }
  32. public int getDirSize() {
  33. return dirSize;
  34. }
  35. public int getFileSize() {
  36. return fileSize;
  37. }
  38. public static void main(String[] args) {
  39. DirCount dirCount=new DirCount("E:/idea/IO_study");
  40. System.out.println(dirCount.getLen()+"--->"+dirCount.getDirSize()+"--->"+dirCount.getFileSize());
  41. }
  42. }

文件夹大小

  1. public class DirDemo04 {
  2. public static void main(String[] args) {
  3. File src=new File("E:/idea/IO_study");
  4. count(src);
  5. System.out.println(dirlen);
  6. }
  7. private static long dirlen=0;
  8. private static void count(File src) {
  9. if(null!=src&&src.isFile()){
  10. dirlen+=src.length();
  11. }else{
  12. for(File s:src.listFiles()){
  13. count(s);
  14. }
  15. }
  16. }
  17. }

文件编码

编码与解码

编码:字符->字节

解码:字节->字符

编码:getBytes()

06.文件操作&&文件编码 - 图1

解码:new String()

06.文件操作&&文件编码 - 图2

字符集(大字典/码表)

常用字符集(每个字符集字符所占用的字节不同)

1、ASCII

2、utf-8(变长)

3、UTF-16BE(定长)

4、UTF-16(定长)

06.文件操作&&文件编码 - 图3

乱码

原因:

1、字节数不够

2、字符集不统一

  1. //字节数不够
  2. msg=new String(datas,0,data.length-2,"utf8");
  3. msg=new String(datas,0,data.length-1,"utf8");
  4. System.out.println(msg);
  5. //字符集不统一
  6. msg=new String(data,0,data.length-1,"gbk");
  7. System.out.println(msg);