View Javadoc
1   /**
2    * Copyright By Grandsoft Company Limited.  
3    * 2012-12-13 下午02:31:49
4    */
5   package gboat2.base.bridge.util;
6   
7   import gboat2.base.bridge.GboatAppConstants;
8   import gboat2.base.bridge.exception.DefaultGboatNestedException;
9   
10  import java.io.BufferedInputStream;
11  import java.io.File;
12  import java.io.FileInputStream;
13  import java.io.IOException;
14  import java.io.InputStream;
15  import java.io.RandomAccessFile;
16  import java.net.URL;
17  import java.nio.channels.FileChannel;
18  import java.nio.channels.FileLock;
19  
20  import org.apache.commons.io.FileUtils;
21  import org.apache.commons.io.IOUtils;
22  import org.slf4j.Logger;
23  import org.slf4j.LoggerFactory;
24  
25  /**
26   * 文件操作工具类,在后续版本中可能会移除该类,建议优先使用 {@link org.apache.commons.io.FileUtils} 和
27   * {@link org.apache.commons.io.IOUtils} 对文件和输入输出流进行操作
28   * 
29   * @author tanxw
30   * @date 2012-12-13
31   * @since 1.0
32   */
33  public class FileUtil {
34      public static final Logger logger = LoggerFactory.getLogger(FileUtil.class);
35  
36      /**
37       * 判断指定路径的文件或文件夹是否存在
38       * @param path 文件或文件夹路径
39       * @return 如果存在对应的文件或文件夹则返回 true;反之则返回 false
40       */
41      public static boolean exists(String path) {
42          return new File(path).exists();
43      }
44      
45      /**
46       * 使用 utf-8 编码将指定 url 的内容读取为文本内容, 示例:
47       * 
48       * <pre><code>
49       * URL url = bundle.getResource(&quot;/test.txt&quot;);
50       * String str = FileUtils.readContentAsString(url);
51       * </code></pre>
52       * 
53       * @param url 需要读取的 URL 路径
54       * @return 返回 URL 对应的文本内容,如果读取失败则返回 <code>null</code>
55       * @see #loadAsString(URL, String)
56       */
57      public static String loadAsString(URL url) {
58          return loadAsString(url, GboatAppConstants.ENCODING_UTF8);
59      }
60  
61      /**
62       * 将指定 url 的内容读取为文本内容, 示例:
63       * 
64       * <pre><code>
65       * URL url = bundle.getResource(&quot;/test.txt&quot;);
66       * String str = FileUtils.readContentAsString(url, Gboat2Constants.ENCODING_UTF8);
67       * </pre></pre>
68       * 
69       * @param url 需要读取的 URL 路径
70       * @param charset 读取  URL 内容的编码,请参见 <code>gboat2.base.bridge.Gboat2Constants.ENCODING_*</code>
71       * @return 返回 URL 对应的文本内容,如果读取失败则返回 <code>null</code>
72       */
73      public static String loadAsString(URL url, String charset) {
74          try {
75              return IOUtils.toString(url, charset);
76          } catch (IOException e) {
77              throw new DefaultGboatNestedException("读取 URL [" + url + "] 的内容失败", e);
78          }
79      }
80  
81      /**
82       * 使用 utf-8 编码读取指定路径的文本文件的内容
83       * 
84       * @param fullpath 文件路径
85       * @return 返回文件对应的文本内容,如果读取失败则返回 <code>null</code>
86       */
87      public static String loadAsString(String fullpath) {
88          return loadAsString(fullpath, GboatAppConstants.ENCODING_UTF8);
89      }
90  
91      /**
92       * 读取指定路径的文本文件的内容
93       * 
94       * @param filePath 文件路径
95       * @param charset 读取  URL 内容的编码,请参见 <code>gboat2.base.bridge.Gboat2Constants.ENCODING_*</code>
96       * @return 返回文件对应的文本内容,如果读取失败则返回 <code>null</code>
97       */
98      public static String loadAsString(String filePath, String charset) {
99          try {
100             return FileUtils.readFileToString(new File(filePath), charset);
101         } catch (IOException e) {
102             throw new DefaultGboatNestedException("读取文件 [" + filePath + "] 的内容失败", e);
103         }
104     }
105 
106     /**
107      * 使用 utf-8 编码将指定输入流的内容读取为字符串
108      * 
109      * @param in 需要读取的输入流
110      * @return 返回输入流对应的文本内容,如果读取失败则返回 <code>null</code>
111      */
112     public static String loadAsString(InputStream in) {
113         return loadAsString(in, GboatAppConstants.ENCODING_UTF8);
114     }
115 
116     /**
117      * 将指定输入流的内容读取为字符串
118      * 
119      * @param in 需要读取的输入流
120      * @param charset 读取  URL 内容的编码,请参见 <code>gboat2.base.bridge.Gboat2Constants.ENCODING_*</code>
121      * @return 返回输入流对应的文本内容,如果读取失败则返回 <code>null</code>
122      */
123     public static String loadAsString(InputStream in, String charset) {
124         try {
125             return IOUtils.toString(in, charset);
126         } catch (IOException e) {
127             throw new DefaultGboatNestedException("读取输入流的字符内容失败", e);
128         }
129     }
130     
131     /**
132      * 文件复制(文件落盘),建议直接使用 {@link FileUtils#copyFile(File, File)}
133      * 
134      * @param inFile 输入文件
135      * @param outFile 输出文件
136      * @throws IOException
137      */
138     public static void writeFileToDisk(File inFile, File outFile) throws IOException{
139         /*InputStream inStream = null;
140         OutputStream outStream = null;
141         try {
142             inStream = new FileInputStream(inFile);
143             outStream = new FileOutputStream(outFile);
144             byte[] b = new byte[1024];
145             int len = 0;
146             while ((len = inStream.read(b)) != -1) {
147                 outStream.write(b, 0, len);
148             }
149         } finally {
150             IOUtils.closeQuietly(outStream);
151             IOUtils.closeQuietly(inStream);
152         }*/
153         FileUtils.copyFile(inFile, outFile);
154     }
155 
156     /**
157      * 追加文件(文件续传)
158      * 
159      * @param destFile 上次未上传完的目标文件
160      * @param srcFile 要上传的源文件
161      * @throws IOException
162      */
163     public static void appendFile(File destFile, File srcFile) throws IOException {
164         BufferedInputStream input = null;
165         RandomAccessFile randomAccessFile = null;
166         FileChannel fileChannel = null;
167         try {
168             input = new BufferedInputStream(new FileInputStream(srcFile));
169 
170             randomAccessFile = new RandomAccessFile(destFile, "rw");
171             fileChannel = randomAccessFile.getChannel();
172             FileLock fileLock = fileChannel.tryLock();
173             // 拿到了文件锁,写入数据
174             if (fileLock != null) {
175                 randomAccessFile.seek(destFile.length());
176             }
177 
178             byte[] bytes = new byte[1024000];
179             int realLength = 0;
180             while ((realLength = input.read(bytes, 0, bytes.length)) != -1) {
181                 randomAccessFile.write(bytes, 0, realLength);
182             }
183 
184             if (fileLock != null) {
185                 fileLock.release();
186                 fileLock = null;
187             }
188         } finally {
189             IOUtils.closeQuietly(fileChannel);
190             IOUtils.closeQuietly(randomAccessFile);
191             IOUtils.closeQuietly(input);
192         }
193     }
194 }