处理的代码逻辑如下:
public static void main(String args[]) {String saveToFileDir = "F:\\整理后的文件存放目录"
File file = new File("F:\\所需整理的文件目录")
processFileFenLei(saveToFileDir, file)
}
private static void processFileFenLei(String saveToFileDir, File file) {
if (file.getName().startsWith(".")) {
return
}
System.out.println("当前处理位置===>" + file.getAbsolutePath())
if (file.isFile()) {
processCopyFile(saveToFileDir, file)
} else {
File[] subFiles = file.listFiles()
for (File subFile : subFiles) {
processFileFenLei(saveToFileDir, subFile)
}
}
}
private static void processCopyFile(String saveToFileDir, File file) {
String extFileName = FileCreateUtil.getFileExtension(file)
String wholeDir = saveToFileDir + "\\" + extFileName
File fileDir = new File(wholeDir)
if (!fileDir.exists()) {
fileDir.mkdirs()
}
File saveToFile = new File(wholeDir + "\\" + file.getName())
FileCreateUtil.saveFileToFile(file, saveToFile)
}
以上代码中所用到的文件 *** 作工具类:
import java.io.BufferedInputStreamimport java.io.BufferedOutputStream
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.File
import java.io.FileInputStream
import java.io.FileNotFoundException
import java.io.FileOutputStream
import java.io.FileReader
import java.io.FileWriter
import java.io.IOException
import java.io.InputStream
import java.io.InputStreamReader
import java.sql.Blob
import java.sql.SQLException
/**
* @作者 王建明
* @创建日期 Feb 4, 2010
* @创建时间 9:56:15 AM
* @版本号 V 1.0
*/
public class FileCreateUtil {
private static final String CONTENT_TYPE_IMAGE = "image/jpeg"
/**
* @说明 将二进制字节流保存为文件
* @param byteArry二进制流
* @param file要保存的文件
* @throws SQLException
* @throws IOException
*/
public static void saveByteArry2File(byte[] byteArry, File file)
throws SQLException, IOException {
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream(file))
bos.write(byteArry)
bos.close()
}
/**
* @说明 将文件转换为二进制字节流
* @param file要转换的文件
* @return
* @throws SQLException
* @throws IOException
*/
public static byte[] changeFile2Bytes(File file) throws SQLException,
IOException {
long len = file.length()
byte[] bytes = new byte[(int) len]
FileInputStream inputStream = new FileInputStream(file)
BufferedInputStream bufferedInputStream = new BufferedInputStream(
inputStream)
int r = bufferedInputStream.read(bytes)
if (r != len) {
throw new IOException("File read error")
}
inputStream.close()
bufferedInputStream.close()
return bytes
}
/**
* @说明 将Blob类类型的文件转换成二进制字节流
* @param pic
* @return
* @throws SQLException
* @throws IOException
*/
public static byte[] changeBlob2Bytes(Blob pic) throws SQLException,
IOException {
byte[] bytes = pic.getBytes(1, (int) pic.length())
return bytes
}
/**
* @说明 将Blob类类型的数据保存为本地文件
* @param blob
* @param file
* @throws SQLException
* @throws IOException
*/
public static void saveBlob2File(Blob blob, File file) throws SQLException,
IOException {
InputStream is = blob.getBinaryStream()
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream(file))
int b = -1
while ((b = is.read()) != -1) {
bos.write(b)
}
bos.close()
is.close()
}
/**
* @说明 将一个文件拷贝到另一个文件中
* @param oldFile源文件
* @param newFile目标文件
*/
public static void saveFileToFile(File oldFile, File newFile) {
FileInputStream fis = null
FileOutputStream fos = null
try {
fis = new FileInputStream(oldFile) // 建立文件输入流
fos = new FileOutputStream(newFile)
int r
while ((r = fis.read()) != -1) {
fos.write((byte) r)
}
} catch (FileNotFoundException ex) {
System.out.println("Source File not found")
} catch (IOException ex) {
System.out.println(ex.getMessage())
} finally {
try {
if (fis != null)
fis.close()
if (fos != null)
fos.close()
} catch (IOException ex) {
System.out.println(ex)
}
}
}
/**
* @说明 获取文本形式文件的内容
* @param file要读取的文件
* @return
*/
public static String getTxtFileContent(File file) {
BufferedReader br = null
try {
br = new BufferedReader(new FileReader(file))
String line = null
StringBuilder sb = new StringBuilder((int) file.length())
while ((line = br.readLine()) != null) {
sb.append(line)
sb.append("\n")
}
return sb.toString()
} catch (FileNotFoundException e) {
e.printStackTrace()
System.out.println("File not found")
} catch (IOException e) {
e.printStackTrace()
System.out.println("Read file error")
} finally {
try {
if (br != null)
br.close()
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace()
}
}
return ""
}
/**
* @说明 把一个文件转化为字节
* @param file
* @return byte[]
* @throws Exception
*/
public static byte[] getByteFromFile(File file) throws Exception {
byte[] bytes = null
if (file != null) {
InputStream is = new FileInputStream(file)
int length = (int) file.length()
if (length > Integer.MAX_VALUE) // 当文件的长度超过了int的最大值
{
System.out.println("this file is max ")
return null
}
bytes = new byte[length]
int offset = 0
int numRead = 0
while (offset < bytes.length
&& (numRead = is.read(bytes, offset, bytes.length - offset)) >= 0) {
offset += numRead
}
// 如果得到的字节长度和file实际的长度不一致就可能出错了
if (offset < bytes.length) {
System.out.println("file length is error")
return null
}
is.close()
}
return bytes
}
/**
* @说明 将指定文本内容写入到指定文件中(原文件将被覆盖!)
* @param content要写入的内容
* @param file写到的文件
*/
public static void writeContentIntoFile(String content, File file) {
try {
if (file.exists()) {
file.delete()
}
file.createNewFile()
FileWriter fw = new FileWriter(file, true)
BufferedWriter bw = new BufferedWriter(fw)
bw.write(content)
bw.close()
fw.close()
} catch (IOException e) {
System.out.println("Write file error")
e.printStackTrace()
}
}
/**
* @param file
* @param encode
* @return
* @throws Exception
* T:2012-03-01 11:12:51 A:王建明 X:问题ID—— R:备注——读取文件时设置txt文件的编码方式
*/
public static String readFileContent(File file, String encode)
throws Exception {
StringBuilder sb = new StringBuilder()
if (file.isFile() && file.exists()) {
InputStreamReader insReader = new InputStreamReader(
new FileInputStream(file), encode)
BufferedReader bufReader = new BufferedReader(insReader)
String line = new String()
while ((line = bufReader.readLine()) != null) {
// System.out.println(line)
sb.append(line + "\n")
}
bufReader.close()
insReader.close()
}
return sb.toString()
}
/**
* @param file
* @return T:2012-03-01 11:12:25 A:王建明 X:问题ID—— R:备注——获取txt文件的编码格式
*/
public static String getTxtEncode(File file) {
String code = ""
try {
InputStream inputStream = new FileInputStream(file)
byte[] head = new byte[3]
inputStream.read(head)
code = "gb2312"
if (head[0] == -1 && head[1] == -2)
code = "UTF-16"
if (head[0] == -2 && head[1] == -1)
code = "Unicode"
if ((head[0] == -17 && head[1] == -69 && head[2] == -65))
code = "UTF-8"
} catch (FileNotFoundException e) {
e.printStackTrace()
} catch (IOException e) {
e.printStackTrace()
}
return code
}
/**
* @说明 获取文件后缀名
* @param file
* @return
*/
public static String getFileExtension(File file) {
if (file != null && file.isFile()) {
String filename = file.getName()
int i = filename.lastIndexOf(".")
if (i > 0 && i < filename.length() - 1) {
return filename.substring(i + 1).toLowerCase()
}
}
return ""
}
/**
* @说明 删除文件或文件夹
* @param file
* @作者 王建明
* @创建日期 2012-5-26
* @创建时间 上午09:36:58
* @描述 ——
*/
public static void deleteFile(File file) {
if (file.exists()) { // 判断文件是否存在
if (file.isFile()) { // 判断是否是文件
file.delete() // delete()方法 你应该知道 是删除的意思
} else if (file.isDirectory()) { // 否则如果它是一个目录
File files[] = file.listFiles() // 声明目录下所有的文件 files[]
for (int i = 0 i < files.length i++) { // 遍历目录下所有的文件
deleteFile(files[i]) // 把每个文件 用这个方法进行迭代
}
}
file.delete()
} else {
System.out.println("所删除的文件不存在!" + '\n')
}
}
/**
* @说明 创建文件夹,如果不存在的话
* @param dirPath
* @作者 王建明
* @创建日期 2012-5-26
* @创建时间 上午09:49:12
* @描述 ——
*/
public static void createMirs(String dirPath) {
File dirPathFile = new File(dirPath)
if (!dirPathFile.exists())
dirPathFile.mkdirs()
}
}
以下都是one by one letter打的,不容易,给点分吧。
import java.io.File
import java.io.FileInputStream
import java.io.FileOutputStream
import javax.swing.JFileChooser
/**
* 1.选择被复制的源目录:sourcePath
* 2.选择文件被复制后存放的目标目录:targetPath
* 3.文件后缀名分类文件,并且将文件复制到不同的文件夹
*
*/
public class FileDemo {
/**
* 启动方法
* @param args
*/
public static void main(String[] args) {
/**
* 选择被复制的源目录:sourcePath
*/
File sourcePath = getSourcePath()
/**
* 选择文件被复制后存放的目标目录:targetPath
*/
File outputPath = getOutputPath()
/**
* 执行复制 *** 作
*/
handlePath(sourcePath, outputPath)
}
/**
* 处理文件分类复制
* @param sourcePath
* @param outputPath
*/
private static void handlePath(File sourcePath, File outputPath) {
if (sourcePath == null || outputPath == null) //1.如果没有选择源目录或目标目录,则返回
return
for (File file : sourcePath.listFiles()) { //2.取得源目录下所有的文件或文件夹,并进行遍历
if (file.isDirectory()) {
//3.如果当前遍历的是文件夹,则使用递归调用,继续处理该文件夹下面的所有文件或文件夹
handlePath(file, outputPath)
} else {
//4.如果当前遍历的是不是文件夹而是文件,那么直接开始copy的 *** 作
//4.1.取得文件的文件名,包含文件后缀名
String fileName = file.getName()
if (fileName.contains(".")) {
//4.2.1.如果该文件有后缀名,即包含“.”点符号,则取得文件的后缀名为:最后一个点符号后面的字符串
String suffix = fileName.substring(fileName.lastIndexOf('.') + 1)
//4.2.2.根据文件最后的输出的目标目录和文件的后缀名,执行copy的 *** 作(因为最后输出格式为按文件的后缀名分类,即最后输出如:pdf目录下面有pdf文件,txt目录下面有txt文件)
copy(file, new File(outputPath, suffix))
} else {
//4.3.如果该文件没有后缀名,即不包含“.”点符号,则直接在文件最后的输出的目标目录下建立“nosuffix”目录,执行copy的 *** 作,将没有后缀名的文件复制到nosuffix目录下
copy(file, new File(outputPath, "nosuffix"))
}
}
}
}
/**
* 单个文件复制 *** 作
* @param sourceFile
* @param targetDir
*/
private static void copy(File sourceFile , File targetDir){
System.out.println("copying " + sourceFile)
//1.如果目标目录不存在,则新建,此处的目标目录为按文件后缀名命名的目录,如pdf目录,txt目录以及nosuffix目录
if(!targetDir.exists()){
targetDir.mkdir()//新建目录
}
try {
//2.将源文件读取到输入流中
FileInputStream fis = new FileInputStream(sourceFile)
//3.按照目标目录和文件名构建文件输出流
FileOutputStream fos = new FileOutputStream(new File(targetDir , sourceFile.getName()))
//4.定义缓冲区,大小为102400byte
byte[] buf = new byte[102400]
//5.定义输入流读取到的文件大小,下面会用到
int available = 0
//6.fis.available():使用输入流fis读取当前文件的大小,将读取到的大小赋值给available
while((available = fis.available()) >buf.length){
//7.如果当前读取到的大小available大于定义的缓冲区的大小102400,则用fis.read(buf)方法读取文件。
//此时,缓冲区buf会被完全读满,即源文件的前102400 byte的数据都会被读取到buf中,
//fis下一次读取就会从102401 byte开始读,即文件读取的开始位置移动到了available+1的位置上
fis.read(buf)
//8.使用文件输入流fos将缓冲区buf中的内容写入到目标文件中
fos.write(buf)
}
//9.上面的循环始终会结束,因为文件的大小不可能无限的大,当上面循环的判断使用fis.available()读取到当前剩余的文件大小小于102400 byte时,
//使用fis.read(buf, 0, available)将剩余的文件数据读取的buf对应的位置,
//例如,最后剩下的文件数据大小为100 byte,即available的值为100,那么使用执行方法fis.read(buf, 0, available),后,
//buf数组中的buf[0]到buf[99]会有数据,buf[100]之后的就都是空了。
fis.read(buf, 0, available)
//10.调用输出流fos.write(buf, 0, available)表示将buf中的前available大小的数据输出,
//例如上面举得例子,就只会将buf中的前100位数据输出。
fos.write(buf, 0, available)
fis.close()
fos.close()
} catch (Exception e) {
e.printStackTrace()
}
}
/**
* d出文件选择对话框,选择要被复制的源目录
* @return
*/
private static File getSourcePath(){
//1.d出文件选择对话框
JFileChooser chooser = new JFileChooser()
//2.设置只能选择目录
chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY)
//3.返回选择的目录,如果没有选择则返回null
if(chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION){
return chooser.getSelectedFile()
}
return null
}
/**
* d出对话框,选择文件复制后存放的目标目录
* @return
*/
private static File getOutputPath(){
//1.d出文件选择对话框
JFileChooser chooser = new JFileChooser()
//2.设置只能选择目录
chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY)
//3.返回选择的目录,如果没有选择则返回null
if(chooser.showSaveDialog(null) == JFileChooser.APPROVE_OPTION){
return chooser.getSelectedFile()
}
return null
}
}
//你需要先去去下载一个commons.io的jar包, 然后加载到你的project里.
//这个程序就实现了, 从根据 config.properties中第二列的file Type, 分别copy 第一列的file 到不同的folder. import java.io.File
import java.io.IOException
import java.util.HashMap
import java.util.Scanner
import org.apache.commons.io.FileUtils
public class FileCopyPasteDemo
{
public static void main(String[] args)
{
FileCopyPasteDemo demo = new FileCopyPasteDemo()
demo.loadProperties()
demo.copyPaste()
}
private HashMap<String, String> fileList
private void copyPaste()
{
File source = null
for (String srcString : fileList.keySet())
{
String fileType = fileList.get(srcString)
System.out.println(srcString + " is type of " + fileType)
source = new File(srcString)
if (source.exists())
if (fileType.equals("A"))
copyDirectory(source, new File("C:\\ATypeFolder"))
else if (fileType.equals("B"))
copyDirectory(source, new File("C:\\BTypeFolder"))
}
}
private void loadProperties()
{
Scanner scan = null
fileList = new HashMap<String,String>()
try
{
scan = new Scanner (new File("config.properties")) // File saved the file list
while(scan.hasNextLine())
{
String line = scan.nextLine()
String[] array = line.split(" ")
fileList.put(array[0], array[1])
}
}
catch (Exception ex)
{
ex.printStackTrace()
}
finally
{
if (scan != null)
{
scan.close()
}
}
}
private void copyDirectory(File source, File dest)
{
try
{
FileUtils.copyFileToDirectory(source, dest)
}
catch (IOException e)
{
e.printStackTrace()
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)