-------------------File的使用--------------

1.File类对文件的处理

1.1目录结构:

【commons-io】File对文件与目录的处理&FileUtis,IOUtils,FilenameUtils工具的使用_IT

 1.2测试对文件Test.txt处理:

    // 测试文件
    @Test
    public void test1() throws IOException {
        String contextPath = System.getProperty("user.dir");// 获取项目名字
        System.out.println("文件路径:  " + contextPath + "/Test.txt");
        // 创建File的第一种方式
        // File file = new File(contextPath + "/Test.txt");
        // 第二种方式
        File file = new File(contextPath, "/Test.txt");
        // 判断文件是否存在,如果不存在就新创文件
        if (!file.exists()) {
            // file.delete();删除文件
            file.createNewFile();// 创建一个Text.txt文件
            System.out.println("新增文件");
        }
        System.out.println("是否是文件" + file.isFile());
        System.out.println("是否是目录" + file.isDirectory());
        // 获取文件大小(以字节为单位)
        if (file.isFile()) {
            System.out.println("文件大小:" + file.length() + "字节");
        }
        System.out.println("此文件的上级目录是" + file.getParent());
    }

 结果:

文件路径:  E:\EclipseWorkspace\AllTest/Test.txt
是否是文件true
是否是目录false
文件大小:40字节
此文件的上级目录是E:\EclipseWorkspace\AllTest

 

 2.对目录的处理

 2.1目录结构:

【commons-io】File对文件与目录的处理&FileUtis,IOUtils,FilenameUtils工具的使用_IT_02

 

 2.2测试代码:

    // 测试目录
    @Test
    public void test2() throws IOException {
        String contextPath = System.getProperty("user.dir");// 获取项目名字
        System.out.println("文件路径:  " + contextPath + "\\text");
        // 第一种方式
        // File file = new File(contextPath,"text");
        // 第二种
        File file = new File(contextPath, "text");
        System.out.println("文件是否存在" + file.exists());
        if (!file.exists()) {// 如果目录不存在
            file.mkdir();// 创建目录
        }
        // 判断文件是否存在,如果存在删除文件
        System.out.println("是否是文件" + file.isFile());
        System.out.println("是否是目录" + file.isDirectory());
        // 列举目录下的文件的名字
        if (file.isDirectory()) {
            File[] listFiles = file.listFiles();
            System.out.println("目录下的文件有:");
            for (File fi : listFiles) {
                // 列举文件名字与大小
                System.out.println(fi.getName() + "   大小    " + fi.length() * 1.0 / 1024 + "KB");
                // 删除文件
                System.out.println("文件将被删除");
                fi.delete();
            }
        }
        System.out.println("此文件的上级目录是" + file.getParent());
    }

结果:

文件路径:  E:\EclipseWorkspace\AllTest\text
文件是否存在true
是否是文件false
是否是目录true
目录下的文件有:
1.txt   大小    0.015625KB
文件将被删除
9.20PDM截图.pdf   大小    193.109375KB
文件将被删除
web.xml   大小    0.951171875KB
文件将被删除
此文件的上级目录是E:\EclipseWorkspace\AllTest

 

【commons-io】File对文件与目录的处理&FileUtis,IOUtils,FilenameUtils工具的使用_IT_03

 

总结:如果删除一个目录下的文件可以用上述的办法遍历一个目录下的文件然后删除文件。

 -------------------FileUtils\Filenameutils\IOUtils的使用(commons-io.jar)--------------

需要注意的是tomcat的包下也有一个这个类,注意用的是commons-io的包,不要用错:

 参考:http://langgufu.iteye.com/blog/2215918

 

分类说明演示:

    1.写 文件/文件夹

/* 写文件 
 * 1.这里只列出3种方式全参数形式,api提供部分参数的方法重载 
 * 2.最后一个布尔参数都是是否是追加模式 
 * 3.如果目标文件不存在,FileUtils会自动创建 
 * */  
//static void:write(File file, CharSequence data, String encoding, boolean append)   
FileUtils.write(new File("D:/a/b/cxyapi.txt"), "程序换api","UTF-8",true);  
  
//static void:writeLines(File file, Collection<?> lines, boolean append)   
List<String> lines=new ArrayList<String>();  
lines.add("欢迎访问:");lines.add("www.cxyapi.com");  
FileUtils.writeLines(new File("D:/a/b/cxyapi.txt"),lines,true);  
  
//static void:writeStringToFile(File file, String data, String encoding, boolean append)   
FileUtils.writeStringToFile(new File("D:/a/b/cxyapi.txt"), "作者:cxy", "UTF-8",true);  

    2.读 文件/文件夹

//读文件  
//static String:readFileToString(File file, String encoding)   
System.out.println(FileUtils.readFileToString(new File("D:/a/b/cxyapi.txt"), "UTF-8"));  
  
//static List<String>:readLines(File file, String encoding)   
System.out.println(FileUtils.readLines(new File("D:/a/b/cxyapi.txt"), "UTF-8")); //返回一个list  

    3.删除 文件/文件夹

//删除目录  
//static void:deleteDirectory(File directory)   
FileUtils.deleteDirectory(new File("D:/not/cxyapi"));  
  
//static boolean:deleteQuietly(File file)   
FileUtils.deleteQuietly(new File("D:/not/cxyapi")); //文件夹不是空任然可以被删除,永远不会抛出异常  

    4.移动 文件/文件夹

//移动文件 或 文件夹  
//static void:moveDirectory(File srcDir, File destDir)   
FileUtils.moveDirectory(new File("D:/cxyapi1"), new File("D:/cxyapi2")); //注意这里 第二个参数文件不存在会引发异常  
//static void:moveDirectoryToDirectory(File src, File destDir, boolean createDestDir)   
FileUtils.moveDirectoryToDirectory(new File("D:/cxyapi2"), new File("D:/cxyapi3"), true);  
/* 上面两个方法的不同是: 
 * moveDirectory:D:/cxyapi2里的内容是D:/cxyapi1的内容。 
 * moveDirectoryToDirectory:D:/cxyapi2文件夹移动到到D:/cxyapi3里 
 *  
 * 下面的3个都比较简单没提供示例,只提供了api 
 * 其中moveToDirectory和其他的区别是 它能自动识别操作文件还是文件夹 
 */  
//static void:moveFileToDirectory(srcFile, destDir, createDestDir)  
//static void:moveFile(File srcFile, File destFile)   
//static void:moveToDirectory(File src, File destDir, boolean createDestDir)  

    5.copy

//结果是cxyapi和cxyapi1在同一目录  
FileUtils.copyDirectory(new File("D:/cxyapi"), new File("D:/cxyapi1"));   
//结果是将cxyapi拷贝到cxyapi2下  
FileUtils.copyDirectoryToDirectory(new File("D:/cxyapi"), new File("D:/cxyapi2"));  
  
//拷贝文件  
FileUtils.copyFile(new File("d:/cxyapi.xml"), new File("d:/cxyapi.xml.bak"));  
//拷贝文件到目录中  
FileUtils.copyFileToDirectory(new File("d:/cxyapi.xml"), new File("d:/cxyapi"));  
//拷贝url到文件  
FileUtils.copyURLToFile(new URL("http://www.cxyapi.com/rss/cxyapi.xml"), new File("d:/cxyapi.xml"));  

    6.其他

//判断是否包含文件或者文件夹  
boolean b=FileUtils.directoryContains(new File("D:/cxyapi"), new File("D:/cxyapi/cxyapi.txt"));  
System.out.println(b);  
  
//获得临时目录 和 用户目录  
System.out.println(FileUtils.getTempDirectoryPath());  
System.out.println(FileUtils.getUserDirectoryPath());  
  
//打开流,如果不存在创建文件及其目录结构  
//第二个参数表示 文件流是否是追加方式  
FileOutputStream fos=FileUtils.openOutputStream(new File("D:/cxyapi/cxyapi.txt"),true);  
fos.write(new String("欢迎访问:www.cxyapi.com\r\n").getBytes());  
fos.close();  
  
//文件 或 文件夹大小  
System.out.println(FileUtils.sizeOf(new File("D:/cxyapi")));  
System.out.println(FileUtils.sizeOfDirectory(new File("D:/cxyapi"))); 

7.FilenameUtils可以对文件的名字进行处理,可以快速的获取文件的扩展名与基本名字:(commons-io.jar)

【commons-io】File对文件与目录的处理&FileUtis,IOUtils,FilenameUtils工具的使用_IT_04

 

 补充:

 8.IOUtils实现文件拷贝

    org.apache.commons.io.IOUtils可以简单的将一个inputStream的文件读取到另一个outputStream,实现文件的拷贝,例如:

      只用传两个参数,第一个传递InputStream,第二个传递OutputStream

package cn.qlq.craw.Jsoup;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;

import org.apache.commons.io.IOUtils;

public class IOutilsDownloadFile {
    public static void main(String[] args) throws IOException {
        String url = "http://qiaoliqiang.cn/fileDown/zfb.bmp";
        URL url1 = new URL(url);
        URLConnection conn = url1.openConnection();
        InputStream inputStream = conn.getInputStream();
        String path = "C:\\Users\\liqiang\\Desktop\\test.bmp";
        OutputStream outputStream = new FileOutputStream(path);
        // 利用IOutiks拷贝文件,简单快捷
        IOUtils.copy(inputStream, outputStream);
    }
}

其内部也是通过in.read读出内容之后,写入到output:

private static final int EOF = -1;
private static final int DEFAULT_BUFFER_SIZE = 1024 * 4;
    public static int copy(InputStream input, OutputStream output) throws IOException {
        long count = copyLarge(input, output);
        if (count > Integer.MAX_VALUE) {
            return -1;
        }
        return (int) count;
    }
    public static long copyLarge(InputStream input, OutputStream output)
            throws IOException {
        return copyLarge(input, output, new byte[DEFAULT_BUFFER_SIZE]);
    }
    public static long copyLarge(InputStream input, OutputStream output, byte[] buffer)
            throws IOException {
        long count = 0;
        int n = 0;
        while (EOF != (n = input.read(buffer))) {
            output.write(buffer, 0, n);
            count += n;
        }
        return count;
    }

 

 IOUtils可以用来在finally中关闭流:(无条件的关闭而不抛出异常)

    public void exportExcel(OutputStream outputStream) {
        // 导出之前先自动设置列宽
        this.autoAllSizeColumn();
        try {
            workBook.write(outputStream);
        } catch (IOException e) {
            LOGGER.error(" exportExcel error", e);
        } finally {
            IOUtils.closeQuietly(outputStream);
        }
    }

 查看源码:

    /**
     * Unconditionally close an <code>OutputStream</code>.
     * <p>
     * Equivalent to {@link OutputStream#close()}, except any exceptions will be ignored.
     * This is typically used in finally blocks.
     * <p>
     * Example code:
     * <pre>
     * byte[] data = "Hello, World".getBytes();
     *
     * OutputStream out = null;
     * try {
     *     out = new FileOutputStream("foo.txt");
     *     out.write(data);
     *     out.close(); //close errors are handled
     * } catch (IOException e) {
     *     // error handling
     * } finally {
     *     IOUtils.closeQuietly(out);
     * }
     * </pre>
     *
     * @param output  the OutputStream to close, may be null or already closed
     */
    public static void closeQuietly(OutputStream output) {
        closeQuietly((Closeable)output);
    }
    /**
     * Unconditionally close a <code>Closeable</code>.
     * <p>
     * Equivalent to {@link Closeable#close()}, except any exceptions will be ignored.
     * This is typically used in finally blocks.
     * <p>
     * Example code:
     * <pre>
     *   Closeable closeable = null;
     *   try {
     *       closeable = new FileReader("foo.txt");
     *       // process closeable
     *       closeable.close();
     *   } catch (Exception e) {
     *       // error handling
     *   } finally {
     *       IOUtils.closeQuietly(closeable);
     *   }
     * </pre>
     *
     * @param closeable the object to close, may be null or already closed
     * @since 2.0
     */
    public static void closeQuietly(Closeable closeable) {
        try {
            if (closeable != null) {
                closeable.close();
            }
        } catch (IOException ioe) {
            // ignore
        }
    }

 

【当你用心写完每一篇博客之后,你会发现它比你用代码实现功能更有成就感!】