zoukankan      html  css  js  c++  java
  • 动手解决jar转txt软件的一个缺陷

    代码

    import java.io.BufferedOutputStream;
    import java.io.BufferedReader;
    import java.io.DataOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;

    //有一些文件,当从jar转换成txt时,发现它为每个文件外建了一个同名的文件夹来保存这个文件
    //大概是默认地把一本书建立一个文件夹,然后按照每章独立生成一个文件
    //目标是把所有只有一个文件的文件夹里的文件移出,然后删除该文件夹
    public class HandleTextBooks
    {
    private static void deleteFolderOrFile(File file)
    {
      if(file.exists())
      {
       if(file.isDirectory())//文件,需要遍历目录下文件或文件夹,文件直接删除,文件夹则递归
       {
        File []files = file.listFiles();
        for(int i=0;i<files.length;i++)
         deleteFolderOrFile(files[i]);
       }
       file.delete();//删除文件或空文件夹
      }
    }
    //去除点及后缀,取得文件名
    static String getFileNameWithoutPostfix(String fileName)
    {
      int index = fileName.lastIndexOf('.');
      return fileName.substring(0, index);
    }

    //参数file是一个txt文件,这个方法把这该文件复制到所在目录的上一层目录里,再把该文件所在的目录删除
    static void createATextBook(File file) throws IOException
    {
      //在这个例子中,如果文件名(除去“点+后缀”)与所在目录名相同,才需要进行这个方法的操作
      System.out.println(getFileNameWithoutPostfix(file.getName()));System.out.println(file.getParentFile().getName());
      if(getFileNameWithoutPostfix(file.getName()) != file.getParentFile().getName())
       return;
      String fileName = file.getAbsolutePath();
      System.out.println("function 'void createATextBook(File file)-1':"+fileName);
      InputStreamReader reader = new InputStreamReader(new FileInputStream(fileName),"GB2312");
      BufferedReader in = new BufferedReader(reader);
      String readLineStr = new String();    
      //在文件所在目录的上一级目录创建一个与之同名的文件
      System.out.println("function 'void createATextBook(File file)-2':"+file.getParentFile().getParent());
         DataOutputStream out = new DataOutputStream(
        new BufferedOutputStream(new FileOutputStream(file.getParentFile().getParent()+"/"+file.getName())));
         while((readLineStr = in.readLine())!= null)
         {
          out.write((readLineStr+"\r\n").getBytes("GB2312"));//在Windows下换行必须是"\r\n"
         }
         in.close();
         out.close();
         deleteFolderOrFile(file.getParentFile());//删除该文件所在的目录
    }
    //为了递归调用,单独写成一个方法
    static void handleTextBooks(File file)throws IOException
    {
      if(file.exists()&&file.isDirectory())
      {
       File temFile = file.listFiles()[0];
       if((file.list().length == 1)&&(temFile.isFile()))
       {
        createATextBook(temFile);
       }
       else
       {
        File []files = file.listFiles();
        for(int i=0;i<files.length;i++)
        {
         handleTextBooks(files[i]);
        }
       }
      }
    }
    public static void main(String[]args)throws IOException
    {
      File file = new File("F:/EBooks/常识作d/");
      handleTextBooks(file);
    }
    }

    :在Java中,File对象即可以是文件也可以是文件夹,所以在一个File文件夹上要写入数据,会提示:拒绝访问。

            Java不提供直接复制的API,所以复制一个文件时,只能是先读取再写入。实验过程中发现,读一行写一行的执行速度远快于读全文再写全文。

            实际上还有些情况,即文件与所在目录名不同,但仍属于本文所要处理的那种情况,所以,可以简单地把方法static void createATextBook(File file) throws IOException
    中的第一段注释掉。

    效果

    原来情况下,每个文件夹下都有唯一一个同名文件:

    zrclip_001p3e9030cc

    zrclip_002n3e9d6353

    处理之后

    zrclip_003n1339991

  • 相关阅读:
    CF-1328 F. Make k Equal
    CF-1328 E. Tree Queries
    USACO_1.1_Greedy_Gift_Givers_(模拟+水题)
    USACO_1.1_Your_Ride_Is_Here_(字符串+水题)
    第3章 文件系统
    BZOJ_1629_[Usaco2007_Demo]_Cow_Acrobats_(贪心)
    BZOJ_1628_[Usaco2007_Demo]_City_skyline_(单调栈)
    BZOJ_1030_[JSOI2007]_文本生成器_(AC自动机+DP)
    BZOJ_1029_[JSOI2007]_建筑抢修_(贪心+优先队列)
    BZOJ_1028_[JSOI2007]_麻将_(模拟+贪心)
  • 原文地址:https://www.cnblogs.com/xiaxiazl/p/2415917.html
Copyright © 2011-2022 走看看