如何用JAVA实现根据文件后缀名分类文件,并且将文件复制到不同的文件夹

如何用JAVA实现根据文件后缀名分类文件,并且将文件复制到不同的文件夹,第1张

处理的代码逻辑如下:

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.BufferedInputStream

import 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()

}

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12106812.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存