zoukankan      html  css  js  c++  java
  • 对文件的一些操作封装

    import java.io.*;
    import java.sql.Timestamp;
    
    
    /**
     * 封装了文件操作(增加、删除、移动、复制)相关的一些方法。
     */
    public final class FileUtil
    {
        /**
         * 十六进制数字符数组,能根据0-15的十进制数都到相应的十六进制数字符,如<code>HEX_DIGITS[10]=A</code>,根据文件ID生成相对
         * 路径时用到该数组。
         */
        private final static char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
        
        /**
         * 根据文件ID计算文件的相对存储目录名,目前的实现支持到32位的 ID,即支持到4294967296个文件。
         *
         * @param   fileId 文件ID
         * @return  文件的相对存储目录名
         */
        public static String id2path(int fileId)
        {
            char[] buff = new char[9];
    
            buff[0] = '/';
            buff[1] = HEX_DIGITS[(fileId >>> 28) & 0xF];
            buff[2] = HEX_DIGITS[(fileId >>> 24) & 0xF];
            buff[3] = '/';
            buff[4] = HEX_DIGITS[(fileId >>> 20) & 0xF];
            buff[5] = HEX_DIGITS[(fileId >>> 16) & 0xF];
            buff[6] = '/';
            buff[7] = HEX_DIGITS[(fileId >>> 12) & 0xF];
            buff[8] = HEX_DIGITS[(fileId >>> 8 ) & 0xF];
    
            return new String(buff, 0, 9);
        }
        
        /**
         * 根据文件ID计算文件名,不包含文件扩展名(带"."号)。
         *
         * @param   fileId 文件ID
         * @return  文件名(不包含扩展名)
         */
        public static String id2file(int fileId)
        {
            char[] buff = new char[2];
    
            buff[0] = HEX_DIGITS[(fileId >>> 4) & 0xF];
            buff[1] = HEX_DIGITS[fileId & 0xF];
    
            return new String(buff, 0, 2);
        }
        
        /**
         * 根据文件ID,根目录和文件扩展名构造包含绝对路径的文件名。
         * 
         * @param fileId fileId 对应文件的ID
         * @param fileExt 文件的扩展名需带"."号
         * @param basePath 文件存放的根目录
         * @return 包含绝对路径的文件名。
         */
        public static String getFileName(int fileId,String fileExt,String basePath)
        {
            StringBuffer buff = new StringBuffer(128);
            buff.append(basePath);
            buff.append(id2path(fileId));
            buff.append('/');
            buff.append(id2file(fileId));
            buff.append(fileExt);
            return buff.toString();
        }
        
        /**
         * 根据文件ID,根目录和文件扩展名构造文件对象。
         * 
         * @param fileId 对应文件的ID
         * @param fileExt 文件的扩展名需带"."号
         * @param basePath 文件存放的根目录
         * @return 文件对象
         */
        public static File getFile(int fileId,String fileExt,String basePath)
        {
            return new File(getFileName(fileId,fileExt,basePath));
        }
        
        /**
         * 根据文件ID,目录和文件扩展名构造文件对象。
         * @param fileId 对应文件的ID
         * @param fileExt 文件的扩展名需带"."号
         * @param path 目录对象
         * @return 文件对象
         */
        public static File getFile(int fileId,String fileExt,File path)
        {
            return new File(path,id2file(fileId)+fileExt);
        }
        
        /**
         * @param fileId 文件ID
         * @param basePath 根目录
         * @return 返回路径文件对象
         */
        public static File getPath(int fileId,String basePath)
        {
            return new File(basePath + id2path(fileId));
        }
        
        /**
         * 将源文件复制到目标文件。
         * 
         * @param sourceName 源文件名
         * @param targetName 目标文件名
         */
        public static void copy(String sourceName, String targetName)
            throws IOException
        {
            copy(new File(sourceName), new File(targetName));
        }
        
        /**
         * 将源文件复制到目标文件。
         * 
         * @param sourceFile 源文件对象
         * @param targetFile 目标文件对象
         */
        public static boolean copy(File sourceFile, File targetFile)
                throws IOException
        {
            BufferedInputStream bis = new BufferedInputStream(new FileInputStream(sourceFile));
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(targetFile));
            byte buff[] = new byte[4096];
            int length;
            
            while ((length = bis.read(buff)) != -1)
            {
                bos.write(buff, 0, length);
            }
            
            bos.close();
            bis.close();
            return true;
        }
        
        /**
         * 将源文件复制到目标文件。文件的相关路径由ID计算产生,文件名(扩展名部分除外)也由ID计算产生。
         * 
         * @param fileId 文件对应的ID
         * @param fileExt 文件扩展名,带"."号
         * @param sourceBase 源文件所在的根目录
         * @param targetBase 目标文件所在文件所在的根目录
         * @return 如果复制成功返回<code>true</code>,否则返回<code>false</code>。
         */
        public static void copy(int fileId,String fileExt,String sourceBase,String targetBase)
            throws IOException
        {
            File sourceFile = getFile(fileId,fileExt,sourceBase);
            File targetFile = getFile(fileId,fileExt,targetBase);
            copy(sourceFile,targetFile);
        }
        
        /**
         * 将源文件移动到目标文件。文件的相关路径由ID计算产生,文件名(扩展名部分除外)也由ID计算产生。
         * 
         * @param fileId 文件对应的ID
         * @param fileExt 文件扩展名,带"."号
         * @param sourceBase 源文件所在的根目录
         * @param targetBase 目标文件所在文件所在的根目录
         */
        public static void move(int fileId,String fileExt,String sourceBase,String targetBase)
        {
            File sourceFile = getFile(fileId,fileExt,sourceBase);
            File targetFile = getFile(fileId,fileExt,targetBase);
            
            if (sourceFile.exists())
            {
                sourceFile.renameTo(targetFile);
            }
        }
        
        /**
         * 覆盖写文件
         * @param content 写入的内容
         * @param encoding 文件的编码名称,如:UTF-8
         * @exception IOException
         */
        public static void writeFile(File file, String content, String encoding) throws IOException{
    
            FileOutputStream fos = null ;
            OutputStreamWriter osw = null ;
            BufferedWriter bw = null ;
    
            try{
                file.createNewFile() ;
    
                fos = new FileOutputStream(file) ;
                osw = new OutputStreamWriter(fos, encoding);
                bw = new BufferedWriter(osw);
    
                bw.write(content) ;
    
            }finally{
                try{
                    bw.close() ;
                    osw.close() ;
                }catch(Exception e){
                    
                }
                CloseUtil.closeOutputStream(fos) ;
            }
        }
        
        /**
         * 把指定的输入流写入目标文件。
         * 
         * @param inputStream 文件输入流
         * @param targetFile 目标文件
         * @throws IOException
         */
        public static void writeFile(InputStream inputStream, File targetFile) throws IOException
        {
            FileOutputStream fos = null;
            
            try
            {
                fos = new FileOutputStream(targetFile);
                if (fos != null)
                {
                    byte buff[] = new byte[4096];
                    int length;
                    while ((length = inputStream.read(buff, 0, 4096)) > 0)
                    {
                        fos.write(buff, 0, length);
                    }
                }
            }
            finally
            {
                if (fos != null)
                {
                    try
                    {
                        fos.close();
                    }
                    catch (Exception ex)
                    {
                    }
                }
            }
        }
        
        /**
         * 保存文件,文件的相关路径由ID计算产生,文件名(扩展名部分除外)也由ID计算产生。
         * 
         * @param fileId 文件ID
         * @param fileExt 文件扩展名
         * @param basePath 文件存放的根目录(相对目录由计算产生)
         * @param inputStream 文件输入流
         * @throws IOException
         * @return 返回实际保存到的文件
         */
        public static File save(int fileId,String fileExt,String basePath,InputStream inputStream)
            throws IOException
        {
            File path = getPath(fileId,basePath);
            if (!path.exists())
            {
                path.mkdirs();
            }
            
            File targetFile = getFile(fileId,fileExt,path);
            writeFile(inputStream,targetFile);
            
            return targetFile ;
        }
        
        /**
         * 删除文件
         * @param file
         */
        public static void delete(File file)
        {
            if (file.exists())
            {
                file.delete();
            }
        }
        
        /**
         * 删除文件,文件的相关路径由ID计算产生,文件名(扩展名部分除外)也由ID计算产生。
         * 
         * @param fileId 文件ID
         * @param fileExt 文件扩展名
         * @param basePath 文件存放的根目录(相对目录由计算产生)
         */
        public static void delete(int fileId,String fileExt,String basePath)
        {
            File file = getFile(fileId,fileExt,basePath);
            if (file.exists())
            {
                file.delete();
            }
        }
        
        /**
         * 提取文件扩展名。
         * 
         * @param fileName 文件名
         * @return 文件扩展名(带"."),如果没有扩展名则返回<code>null</code>
         */
        public static String getExtend(String fileName)
        {
            if (fileName != null)
            {
                int index = fileName.lastIndexOf('.');
                if (index != -1)
                {
                    return fileName.substring(index);
                }
            }
            
            return null;
        }
        
        public static String getPartName(String fileName)
        {
            if (fileName != null)
            {
                int index = fileName.lastIndexOf('.');
                if (index != -1)
                {
                    return fileName.substring(0,index);
                }
            }
            
            return null;
        }
        /**
         * 强制删除一个目录,包含所有子目录。<br>
         * 如果目录不存在,直接返回。
         */
        public static void forceDeleteDirectory(File directory) throws IOException{
            if(!directory.exists()) return ;
            
            File[] files = directory.listFiles() ;
            if(files != null){
                for(int i = 0 ; i < files.length ; i++){
                    if(files[i].isFile()){
                        files[i].delete() ;
                    }else{
                        forceDeleteDirectory(files[i]) ;
                    }
                }
            }
            //最后删除当前的目录。
            directory.delete() ;
        }
        
        // ls@06-0407
        private static final String ENTER = System.getProperty("line.separator");
    
        /**
         * 获取文件大小信息和内容(不超过1 MB的). 主要用于查看配置文件等.
         * @return 文件大小信息和内容
         */
        public static String getFileContent(String fileName) {
            if (fileName == null || fileName.trim().length() == 0) {
                return "fileName cannot be empty!";
            }
            File f = new File(fileName);
            if (false == f.isFile()) {
                return fileName + " is not exist or is not a file!";
            }
            final int maxLength = 1024000;
            long len = f.length();
            if (len > maxLength) {
                return "Deny: size larger than " + maxLength + " Byte! file="  + fileName + ", size=" + len;
            }
            StringBuffer sb = new StringBuffer(maxLength);
            BufferedReader br = null;
            try {
                InputStreamReader isr = new InputStreamReader(new FileInputStream(f));
                br = new BufferedReader(isr);
                sb.append("LAST_MODIFIED:").append(new Timestamp(f.lastModified())).append(ENTER);
                sb.append("CONTENT:").append(ENTER);
                for (String line = br.readLine(); line != null; line = br.readLine()) {
                        sb.append(line);
                        sb.append(ENTER);
                }
                br.close();
                return sb.toString();
            } catch (Exception e) {
                return sb.insert(0, e + ENTER + "Already read content:" + ENTER).toString();
            } finally
            {
                if(br!=null)
                {
                    try
                    {
                        br.close();
                    } catch (IOException e)
                    {
                        e.printStackTrace();
                    }
                }
            }
        }
        
        /**
         * 返回指定目录下文件名称
         * @param directory
         * @return
         */
        public static String[] getFileDirectoryName(String directory)
        {
            if(!StringUtil.isEmpty(directory))
            {
                 File path=new File(directory);
                 return path.list();
            }
            return null;
        }
        
        /**
         * 返回指定目录下文件
         * @param directory
         * @return
         */
        public static File[] getFileDirectory(String directory)
        {
            if(!StringUtil.isEmpty(directory))
            {
                 File path=new File(directory);
                 return path.listFiles();
            }
            return null;
        }
        
        /**
         * 判断文件是否存在
         * @param filePath
         * @return
         */
        public static boolean fileisExist(String filePath)
        {
            if(!StringUtil.isEmpty(filePath))
            {
                File file = new File(filePath);
                return file.exists();
            }
            return false;
        }
        
     // 复制文件
        public static void copyFile(File sourceFile, File targetFile)throws IOException
        {
            if(sourceFile.exists())
            {
                // 新建文件输入流并对它进行缓冲
                FileInputStream input = new FileInputStream(sourceFile);
                BufferedInputStream inBuff = new BufferedInputStream(input);
        
                // 新建文件输出流并对它进行缓冲
                FileOutputStream output = new FileOutputStream(targetFile);
                BufferedOutputStream outBuff = new BufferedOutputStream(output);
        
                // 缓冲数组
                byte[] b = new byte[1024 * 5];
                int len;
                while ((len = inBuff.read(b)) != -1)
                {
                    outBuff.write(b, 0, len);
                }
                // 刷新此缓冲的输出流
                outBuff.flush();
        
                // 关闭流
                inBuff.close();
                outBuff.close();
                output.close();
                input.close();
            }
        }
    
        // 复制文件夹
        public static void copyDirectiory(String sourceDir, String targetDir)throws IOException
        {
            // 新建目标目录
            (new File(targetDir)).mkdirs();
            // 获取源文件夹当前下的文件或目录
            File[] file = (new File(sourceDir)).listFiles();
            for (int i = 0; i < file.length; i++)
            {
                if (file[i].isFile())
                {
                    // 源文件
                    File sourceFile = file[i];
                    // 目标文件
                    File targetFile = new File(new File(targetDir)
                            .getAbsolutePath()
                            + File.separator + file[i].getName());
                    copyFile(sourceFile, targetFile);
                }
                if (file[i].isDirectory())
                {
                    // 准备复制的源文件夹
                    String dir1 = sourceDir + "/" + file[i].getName();
                    // 准备复制的目标文件夹
                    String dir2 = targetDir + "/" + file[i].getName();
                    copyDirectiory(dir1, dir2);
                }
            }
        }
        
        /**
         * 重命名文件夹
         * @param fdirname
         * @param oldname
         * @param newname
         */
        public static void renameDir(String fdirname,String oldname,String newname)
        {
            File fl = new File(fdirname);
            if(fl.isDirectory())
            {
                File f = new File(fl,oldname);
                if(f.isDirectory())
                {
                    f.renameTo(new File(fl.getAbsolutePath()+"/"+newname));
                }
            }
        }
    
        public static boolean copy(File file, String floderPath, String fileName) {
            try {
                InputStream is = new FileInputStream(file);
                File filePath = new File(floderPath);
                if (!filePath.exists()) {
                    filePath.mkdirs();
                }
                File toFile = new File(floderPath, fileName);
    
                OutputStream os = new FileOutputStream(toFile);
                byte[] buffer = new byte[1024];
                int length = 0;
                while ((length = is.read(buffer)) > 0) {
                    os.write(buffer, 0, length);
                }
                is.close();
                os.close();
                return true;
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
        }
    
        public static String getPathWithSystem(String path) {
            if(isWindowsOS()) {
                return path.replaceAll("/", "\\");
            }else {
                return path.replaceAll("\\", "/");
            }
        }
    
    
        public static boolean isWindowsOS(){
            boolean isWindowsOS = false;
            String osName = System.getProperty("os.name");
            if(osName.toLowerCase().indexOf("windows") > -1){
                isWindowsOS = true;
            }
            return isWindowsOS;
        }
    
    }
  • 相关阅读:
    测试签名和验证签名
    自定义mssql的CLR函数
    关于C#的Process的内存相关属性解读
    测试C#发送邮件
    关于wmv视频格式
    练习命名管道的使用
    web中局部滚动条
    C#修改文件的安全属性时报“没有可以设置的标志”
    c#的FileSystemWatcher对象监视文件的变化的事件,无休止的触发事件的解决办法
    为什么要给自己设限?
  • 原文地址:https://www.cnblogs.com/wdnnccey/p/6131556.html
Copyright © 2011-2022 走看看