Java文件的相关操作

1.创建文件

  

  public static boolean createFile(String filePath){
        boolean result = false;
        File file = new File(filePath);
        if(!file.exists()){
            try {
                result = file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
        return result;
    }

2. 创建文件夹

   

 public static boolean createDirectory(String directory){
        boolean result = false;
        File file = new File(directory);
        if(!file.exists()){
            result = file.mkdirs();
        }
        
        return result;
    } 

3.删除文件 

        

public static boolean deleteFile(String filePath){
        boolean result = false;
        File file = new File(filePath);
        if(file.exists() && file.isFile()){
            result = file.delete();
        }
        
        return result;
    }

4.递归删除目录中的指定文件

public static void main(String[] args) {
   System.out.println("请输入正确的目录:");
   Scanner scanner =new Scanner(System.in);
   String rootpath=scanner.nextLine();
   //先判断这个是不是一个目录,再进行下面的操作
   File file=new File(rootpath);
   if(!file.isDirectory()) {
      System.out.println("输入的目录有误");
      return ;
   }
   System.out.println("请输入文件中想要查找的关键词:");
   String word=scanner.nextLine();
   File[] files=file.listFiles();
   for (File file1:files) {
      //分开处理
      //如果是一个文件就看是否包含了关键词
      if(file1.isFile()) {
         checkDeleteFile(file1,word);
      } else {
         //扫描文件
         scanDirectory(file1,word);
      }
   }
}

private static void scanDirectory(File file1, String word) {
   if(file1==null) {
      return ;
   }
   File[] files=file1.listFiles();
   if(file1.isDirectory()) {
      for(File file:files) {
         System.out.println("当前扫描的路径为:"+file.getPath());
         if(file.isDirectory()) {
            scanDirectory(file,word);
         } else {
            checkDeleteFile(file,word);
         }
      }
   }
}
private static void checkDeleteFile(File file1, String word) {
   if(!file1.getName().contains(word)) {
      return ;
   }
   //接下来就是该真正的删除了
   System.out.println("当前文件:"+file1.getAbsolutePath()+"是否要删除:(Y/n)");
   Scanner scanner =new Scanner(System.in);
   String choice=scanner.nextLine();
   if(choice.equals("y")||choice.equals("Y")) {
      file1.delete();
      System.out.println("删除成功");
   } else {
      System.out.println("取消删除");
   }
}

4.文件写入操作

这里所谓的写入操作是指我们将硬盘的文件内容写入到内存中,文件操作的角度应该站在内存的角度上来的看的。

1.按字节的形式进行读取数据 
public static  void main(String[] args){
   //这是按照字节进行输出
   try(InputStream inputStream=new FileInputStream("d:/test.txt")) {
         byte [] buf=new byte[1024];
         int len =inputStream.read(buf);
         System.out.println("len "+len);
         for(int i =0;i<len;i++) {
            System.out.printf("%x\n", buf[i]);
      }
   }catch(Exception e) {
      e.printStackTrace();
   }
}

以上这种读取方式,是按照字节流,也就是一个字节一个字节将文件的内容读取到这个byte数组中。 读到数组的中的内容全是ASCII值,之后以十六进制的形式打印出来。

2.按字符进行读取数据
//将字节流转化为字符流直接输出
try(InputStream inputStream=new FileInputStream("d:/test.txt")) {
   Scanner scanner=new Scanner(inputStream);
   while(scanner.hasNextLine()) {
      String str=scanner.nextLine();
      System.out.println(str);
   }
} catch (IOException e) {
   throw new RuntimeException(e);
}

 将字节流转化成一个字符流,一行的一行的进行读取出来。  以上这种方式我们直接读取到一个字符串中直接输出了。这样我们拿不到全部文件内容。我们可以使用StringBuffer来进行获取到全部数据

StringBuffer stringBuffer=new StringBuffer();
//将字节流转化为字符流直接输出
try(InputStream inputStream=new FileInputStream("d:/test.txt")) {
   Scanner scanner=new Scanner(inputStream);
   while(scanner.hasNextLine()) {
      String str=scanner.nextLine();
      stringBuffer.append(str);
      stringBuffer.append("\n");
   }
} catch (IOException e) {
   throw new RuntimeException(e);
}
System.out.println(stringBuffer);

这样我们就可以获取到文件的全部内容了。注意:由于我们在读取文件的时候是一行进行读取的,所以在向stringbuffer中追加的时候 加上换行。 

5.文件输出操作

所谓文件输出操作是指在应用程序上向硬盘文件中写入数据。

1.按字节的形式进行输出数据

try(InputStream is=new FileInputStream(scrfile)) {
   try(OutputStream os=new FileOutputStream(destFile,true)) {
      byte [] buf=new byte[1024];
      int len;
      while(true) {
         len=is.read(buf);
         if(len==-1) {
            break;
         }
         os.write(buf,0,len);
      }
      os.flush();
   }

先将scrfile文件的内容读取到一个字节数组中,然后再这个字节数组的内容写入到destfile文件中。

注意:之所以用flush是因为有一个缓冲区,内容先写入到由内存构成的缓冲区,再写入到硬盘的文件中,写入到内存中的速度是写入到硬盘中的速度上千倍,此时如果不及时的去刷新缓冲区,进程结束,这份数据也就丢失了同时也要记得在使用完文件的时候,要记得关闭文件,不关闭文件大概率会造成文件资源泄露。 文件资源泄露是因为在打开一个文件的时候,进程中有一个文件描述表。这里没有进行关闭文件的操作是因为,这个文件的使用生命周期很短,而且是全局使用的,进程结束了,文件描述表自然也就销毁了。

2.按照字符的形式进行输出数据
try (OutputStream os = new FileOutputStream("d:/test.txt")) {
      //这里还是将一个字节流转化成一个字符流
      try (OutputStreamWriter osWriter = new OutputStreamWriter(os, "UTF-8")) {
         //这里再包裹一层是,利用prinln的特性将字符串转化成字符写入到OutputStreamWriter中
         try (PrintWriter writer = new PrintWriter(osWriter)) {
            writer.println("你好世界");
            writer.flush(); // 进行数据刷新操作
         }
      }
   }
}

6.文件复制

public static void main(String[] args) throws IOException {
   //文件的复制
   Scanner scanner =new Scanner(System.in);
   System.out.println("请输入源文件绝对路径:");
   String srcFile=scanner.nextLine();
   File scrfile=new File(srcFile);

   //先要判断文件在不在,在的话,仍要判断文件是不是一个目录
   if(!scrfile.exists()) {
      System.out.println("输入的文件不存在,输入有误");
      return ;
   }
   if(scrfile.isDirectory()) {
      System.out.println("输入的是一个目录,输入有误");
      return ;
   }

   //然后开始输入目的文件,仍要判断目的文件在不在
   System.out.println("请输入目的文件的绝对路径: ");
   String destFile=scanner.nextLine();
   File destfile=new File(destFile);

   if(!destfile.exists()) {
      System.out.println("输入的文件不存在,输入有误");
      return ;
   }
   if(destfile.isDirectory()) {
      System.out.println("输入的是一个目录,输入有误");
      return ;
   }
   System.out.println("开始复制文件");
   try(InputStream is=new FileInputStream(scrfile)) {
      try(OutputStream os=new FileOutputStream(destFile,true)) {
         byte [] buf=new byte[1024];
         int len;
         while(true) {
            len=is.read(buf);
            if(len==-1) {
               break;
            }
            os.write(buf,0,len);
         }
         os.flush();
      }
      System.out.println("复制成功");
   }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值