代码:
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
中的第一段注释掉。
效果:
原来情况下,每个文件夹下都有唯一一个同名文件:
处理之后: