文件公用工具类

文件公用工具类,方便快速处理文件
获取默认图片、解压文件、获取文件扩展名、获取文件名、生成zip文件、根据输入流和文件类型获取带文件头的base64、根据输入流获取base64、获取ZIP的字符集、判断是否乱码

public final class GyFileUtil {

    private GyFileUtil() {
        super();
    }

    /**
     * 日志
     */
    private static final Logger logger = LoggerFactory.getLogger(GyFileUtil.class);

    /**
     * 获取默认图片
     * @return
     */
    public static byte[] getDefaultImage() {
        try {
            return FileUtils.readFileToByteArray(new File(ArteryWebUtil.getWebPath()
                    + GyConsts.C_PATH_PERSON_DEFAULT_IMAGE));
        } catch (IOException e) {
            logger.error("获取默认图片报错", e);
        }
        return null;
    }
    
    
    /**
	 * 解压文件
	 * 
	 * @param srcFile
	 *            原始文件
	 * @param desFile
	 *            目标文件
	 * @throws ZipException
	 */
	public static void unzipFile(File srcFile, File desFile) throws ZipException {
		// 压缩文件
		ZipFile zipFile = new ZipFile(srcFile);
		zipFile.setFileNameCharset(getZipEncoding(srcFile));
		// 解压文件
		zipFile.extractAll(desFile.getPath());
	}
	
	/**
	 * 获取文件扩展名
	 * 
	 * @param file
	 *            文件
	 * @return
	 */
	public static String getFileExtension(File file) {
		String name = file.getName();
		int index = name.lastIndexOf('.');
		if (index == -1) {
			return null;
		}
		return name.substring(index);
	}
	
	/**
	 * 获取文件名
	 * 
	 * @param name
	 *            file
	 * @return
	 */
	public static String getFileName(File file) {
		String name = file.getName();
		int index = name.lastIndexOf('.');
		if (index == -1) {
			return name;
		}
		return name.substring(0, index);
	}
	
	
	/**
	 * 生成zip文件方法
	 * @param list 文件集合
	 * @param outputStream
	 * @return
	 */
	public static boolean zipUtil(List<Map<String, Object>> list, OutputStream outputStream) {
        try (ZipOutputStream zos = new ZipOutputStream(outputStream)) {
        	zos.setEncoding("GBK");
            for (int i = 0; i < list.size(); i++) {
            	Map<String, Object> map = list.get(i);
                ZipEntry zipEntry = new ZipEntry((String) map.get("filename"));
                zos.putNextEntry(zipEntry);
                zos.write(FileUtils.readFileToByteArray((File) map.get("file")));
                zos.flush();
            }
            return true;
        } catch (IOException e) {
            logger.error("获取输出流异常", e);
            return false;
        }
       
    }
	
	/**
	 * 根据输入流和文件类型获取带文件头的base64
	 * @param stream 输入流
	 * @param type 文件类型
	 * @return
	 * @throws IOException
	 */
	public static String inputStreamToBase64(InputStream stream, String type) throws IOException {
		if (stream != null) {
			return GyConsts.PICTURE_QZ.replace("type", type) + Base64.encodeBase64String(IOUtils.toByteArray(stream));
		} else {
			return null;
		}
    }
	
	/**
	 * 根据输入流获取base64
	 * @param stream 输入流
	 * @return
	 * @throws IOException
	 */
	public static String inputStreamToBase64(InputStream stream) throws IOException {
		if (stream != null) {
			return  Base64.encodeBase64String(IOUtils.toByteArray(stream)); 
		} else {
			return null;
		}
    }
	
	/**
	 * 根据byte和文件类型base64
	 * @param bytes
	 * @param type
	 * @return
	 * @throws IOException
	 */
	public static String byteToBase64(byte[] bytes, String type) {
		if (bytes != null) {
			return GyConsts.PICTURE_QZ.replace("type", type) + Base64.encodeBase64String(bytes);
		} else {
			return null;
		}
    }
	
	/**
	 * @Description: 获取ZIP的字符集
	 * @param file
	 * @return
	 * @throws ZipException 
	 */
	private static String getZipEncoding(File file) throws ZipException
	{
	    String encoding = "UTF-8" ;
	    ZipFile zipFile = new ZipFile(file) ;
	    zipFile.setFileNameCharset( encoding ) ;
	    List<FileHeader> list = zipFile.getFileHeaders() ;
	    for( int i = 0; i < list.size(); i++ )
	    {
	        FileHeader fileHeader = list.get( i ) ;
	        String fileName = fileHeader.getFileName();
	        if(checkZipEncodeIsMessyCode( fileName ))
	        {
	            encoding = "GBK" ;
	            break ;
	        }
	    }
	    return encoding ;
	}

	/**
	 * @Description: 判断是否乱码
	 * @param str
	 * @return 
	 */
    private static boolean checkZipEncodeIsMessyCode(String str) {
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            // 当从Unicode编码向某个字符集转换时,如果在该字符集中没有对应的编码,则得到0x3f(即问号字符?)
            // 从其他字符集向Unicode编码转换时,如果这个二进制数在该字符集中没有标识任何的字符,则得到的结果是0xfffd
            if ((int) c == 0xfffd) {
                // 存在乱码
                return true;
            }
        }
        
        boolean canEncode = java.nio.charset.Charset.forName("UTF-8").newEncoder().canEncode(str);
        
        return !canEncode;
    }
}

你可能感兴趣的:(杂记)