`
kingsli
  • 浏览: 1373 次
  • 性别: Icon_minigender_1
  • 来自: 成都
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

自己写的一个基于nio的文件夹扫描和文件转移删除

 
阅读更多
话不多说,直接上代码
是我用来读取ftp上传路径下面的文件并且转移和删除的
小文件很快,但是大文件就很满了,主要原因就是在缓冲数组扩容的地方的瓶颈
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

public class FtpIn {

public String path="C:"+File.separator+"ftpserver-1.0.4"+File.separator+"res"+File.separator+"home";
/**
* 递归获取指定文件夹下面的所有文件内容,包括子目录下面的文件
* @param delPath
* @throws Exception
*/
public void doGet(String delPath){
File file =new File(delPath);
if(file.isDirectory()){
String[] fileNames=file.list();
for(int i=0;i<fileNames.length;i++){
String fileName=delPath+File.separator+fileNames[i];
File tempFile=new File(fileName);
if(tempFile.isDirectory()){
//如果是个文件夹就递归继续读取
doGet(fileName);
}else{
//System.out.println("删除文件:"+tempFile.getName());
//tempFile.delete();
        byte[] req = getFileBytes(tempFile);
        System.out.println("读取到文件名:"+tempFile.getName()+" 大小为:"+req.length);
        if(req!=null&&req.length>0){
        writeFileByBytes(req,"d:"+File.separator+tempFile.getName());
        }
        //System.out.println("文件内容为:\n"+new String(req));
}
}
if(path!=file.getAbsolutePath()){
System.out.println("删除文件夹:"+file.getName());
//file.delete();
}
}else{
System.out.println("删除文件:"+file.getName());
//file.delete();
byte[] req = getFileBytes(file);
        System.out.println("读取到文件名:"+file.getName()+" 大小为:"+req.length);
        if(req!=null&&req.length>0){
        writeFileByBytes(req,"d:"+File.separator+file.getName());
        }
        //System.out.println("文件内容为:\n"+new String(req));
}
}
/**
* 把指定byte数组内的内容全写到指定文件中
* @param b
* @param path
* @return boolean 是否成功
*/
public boolean writeFileByBytes(byte[] b,String path){
FileOutputStream fo=null;
FileChannel fc=null;
boolean flag=false;
ByteBuffer buffer = ByteBuffer.wrap(b);
try {
fo=new FileOutputStream(path);
if(fo==null) return flag;
fc=fo.getChannel();
int i= fc.write(buffer);
System.out.println("写入了:"+i+"个字节");
//如果写的字节数和传入的字节数一致就表示写成功
if(i==b.length) flag=true;
if(fc!=null) fc.close();
if(fo!=null) fo.close();
} catch (FileNotFoundException e){
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
return flag;
}
/**
* 获得一个文件的byte[]内容
* @param file
* @return
*/
public byte[] getFileBytes(File file){
FileInputStream fi=null;
FileChannel fc=null;
ByteBuffer buffer = ByteBuffer.allocate(1024);
        int off = 0;
        int r = 0;
        byte[] data = new byte[1024 * 10];
try {
fi=new FileInputStream(file);
if(fi==null) return null;
fc=fi.getChannel();
        while ( true ) {
            buffer.clear();
            r = fc.read(buffer);
            if (r == -1) break;
            if ( (off + r) > data.length) {
                data = grow(data, 1024 * 10);
            }
            byte[] buf = buffer.array();
            System.arraycopy(buf, 0, data, off, r);
            off += r;
        }
        if(fc!=null)fc.close();
        if(fi!=null) fi.close();
} catch (FileNotFoundException e){
e.printStackTrace();
} catch (IOException e){
e.printStackTrace();
}
        byte[] req = new byte[off];
        System.arraycopy(data, 0, req, 0, off);
     
        return req;
}
/**
* 删除一个文件夹下面所有文件(包括子文件价下面的)
* @param delPath
* @throws Exception
*/
public void doDelete(String delPath){
File file =new File(delPath);
if(file.isDirectory()){
String[] fileNames=file.list();
for(int i=0;i<fileNames.length;i++){
String fileName=delPath+File.separator+fileNames[i];
File tempFile=new File(fileName);
if(tempFile.isDirectory()){
//递归
doDelete(fileName);
}else{
System.out.println("删除文件:"+tempFile.getName());
tempFile.delete();
}
}
if(path!=file.getAbsolutePath()){
System.out.println("删除文件夹:"+file.getName());
//file.delete();
}
}else{
System.out.println("删除文件:"+file.getName());
//file.delete();
}
}
    /**
     * 数组扩容
     * @param src byte[] 源数组数据
     * @param size int 扩容的增加量
     * @return byte[] 扩容后的数组
     */
    public static byte[] grow(byte[] src, int size) {
        byte[] tmp = new byte[src.length + size];
        System.arraycopy(src, 0, tmp, 0, src.length);
        return tmp;
    }
public static void main(String... args){
FtpIn fi=new FtpIn();
fi.doGet(fi.path);
}
}
分享到:
评论

相关推荐

    基于nio实现的多文件上传源码

    在Java编程领域,NIO(New IO)是一个重要的特性,它是Java 1.4版本引入的,用于替代标准的IO API。NIO提供了一种非阻塞I/O操作的方式,特别适用于处理大量的并发连接,例如在文件传输、网络通信等场景。本主题...

    java基于NIO实现Reactor模型源码.zip

    java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现...

    java NIO 写文件

    下面是一个简单的示例,展示了如何使用NIO写文件: ```java import java.io.RandomAccessFile; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; public class FileNioWrite { public static ...

    java删除指定文件夹下文件

    在JDK 7及以上版本中,Java提供了一种更加高效且灵活的方式来删除文件,包括递归删除整个文件夹及其子文件,这主要通过`java.nio.file`包中的`Files`类和`SimpleFileVisitor`类来实现。下面我们将详细探讨如何实现这...

    java nio 写文件

    Java NIO(New IO)是Java 1.4版本引入的一个新特性,它为Java提供了新的I/O操作方式,与传统的Java IO相比,NIO具有更高效、更灵活的特性,尤其是在处理大量并发I/O操作时。本篇将详细探讨Java NIO在写文件方面的...

    java移动文件夹下所有文件

    这个场景描述了一个程序能够遍历指定文件夹中的所有文件,并将它们移动到另一个目标文件夹,同时保持原有的文件结构。这样的功能对于数据迁移、备份或者文件整理都非常有用。下面我们将详细探讨如何实现这一功能,...

    基于NIO的socket举例

    基于NIO的socket举例 基于NIO的socket举例 基于NIO的socket举例 基于NIO的socket举例 基于NIO的socket举例基于NIO的socket举例 基于NIO的socket举例

    文件浏览 打开sdcard文件夹。只显示文件夹和txt文件。过滤非txt文件。选择txt文件返回其名字。

    在Android系统中,"文件浏览"是一个常见的功能,允许用户查看和操作存储设备上的文件。在给定的标题和描述中,重点在于打开SD卡(Secondary Storage Device,即外部存储)文件夹,并且只显示文件夹和TXT文本文件,...

    监听文件下文件发生变化时复制文件到另一个文件夹

    本案例的标题和描述提到了“监听文件下文件发生变化时复制文件到另一个文件夹”,这通常涉及到文件系统的观察者模式(Observer Pattern)和多线程技术。 首先,我们需要理解“监听文件”这一概念。在操作系统层面,...

    java nio 包读取超大数据文件

    ### Java NIO 处理超大数据文件的知识点详解 ...综上所述,使用Java NIO处理超大数据文件时,关键是利用好内存映射文件技术和合理的数据读取策略,通过适当的分块和数据解析方法,可以有效地提升读取速度和处理能力。

    NIO处理大文件

    这段代码展示了如何使用NIO读取一个大文件并写入另一个文件,通过循环读取和清空缓冲区,实现了高效的文件复制。 8. 性能对比: 相较于传统的IO,NIO在处理大文件时通常具有更高的吞吐量和更低的CPU占用。尤其是...

    自己手写nio和netty,不建议下载

    在传统的Java I/O模型中,I/O操作是基于流(Stream)的,数据从一个流到另一个流,且通常都是阻塞的,即一个线程在等待数据读取或写入完成时会被挂起,直到I/O操作完成。这种方式在处理少量连接时效率尚可,但当面对...

    spring boot文件夹文件监听程序

    总的来说,"spring boot文件夹文件监听程序"是一个结合了Java文件系统监听和Spring Boot自动化功能的实用工具,它可以实时监控指定目录,及时响应文件变化,对于文件管理、数据同步等场景具有很高的价值。...

    根据清单扫描指定文件夹下并提取文件

    本文将基于给定的标题“根据清单扫描指定文件夹下并提取文件”和描述,结合标签“文件匹配”、“文件提取”、“扫描”,来详细讨论相关知识点。 首先,我们要理解“根据清单扫描指定文件夹下并提取文件”的含义。这...

    基于nio的简易聊天室

    本项目"基于nio的简易聊天室"旨在通过NIO技术实现一个简单的聊天室服务端和客户端,其特点是有图形用户界面(GUI)供用户交互。 NIO的核心组件包括通道(Channels)、缓冲区(Buffers)和选择器(Selectors)。在这...

    读取文件夹中所有文件中的内容

    例如,在进行数据分析、日志处理或批量文件操作时,可能需要读取一个文件夹下所有的文件内容并对这些内容进行一定的处理。Java作为一种广泛使用的编程语言,提供了丰富的API来帮助开发者实现这样的需求。 #### 关键...

    java中实现复制文件和文件夹

    在Java编程语言中,复制文件和文件夹是一个常见的任务,特别是在处理文件系统操作时。这里我们将深入探讨如何使用Java实现这个功能。 首先,让我们来看一下标题中提到的`copyFile`方法,这是一个用于复制单个文件的...

    JAVA_IO/NIO(demo,压缩jar文件)

    `JarEntry`对象表示jar文件中的一个条目,它可以是文件或目录。例如,你可以使用以下步骤创建一个jar文件: 1. 创建`JarOutputStream`实例,指向你要写入的文件。 2. 创建`JarEntry`实例,表示每个要添加到jar文件...

    自动扫描文件夹下文件,加密PDF文件,然后发送邮件

    在IT领域,自动化任务是...综合以上知识点,我们可以编写一个Java程序,实现自动扫描文件夹、加密PDF文件并自动发送邮件的功能。这个程序可以帮助用户自动化处理文件安全和信息传递,提升工作效率,同时确保信息安全。

    java nio 读文件

    Java NIO(New IO)是Java 1.4版本引入的一个新模块,它提供了一种不同于标准Java IO API的处理I/O操作的方式。NIO的主要特点是面向缓冲区,非阻塞I/O,以及选择器,这些特性使得NIO在处理大量并发连接时表现出更高...

Global site tag (gtag.js) - Google Analytics