动手解决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

原文地址:https://www.cnblogs.com/xiaxiazl/p/2415917.html