代码之家  ›  专栏  ›  技术社区  ›  PacificNW_Lover

如何改变/重构方法,使用Java1.8将FileInputStream用于本地文件以及InputStream用于URL?

  •  0
  • PacificNW_Lover  · 技术社区  · 4 年前

    使用Java 1.8,我创建了一个从外部HTTP URL获取zip文件的类:

    https://raw.githubusercontent.com/mlampros/DataSets/master/fastText_data.zip
    

    6aa2fe666f83953a089a2caa8b13b80e
    

    我的实用程序类:

    public class HashUtils {
     
        public static String makeHashFromUrl(String fileUrl) {
            try {
                MessageDigest md = MessageDigest.getInstance("MD5");
                InputStream is = new URL(fileUrl).openStream();
    
                try {
                    is = new DigestInputStream(is, md);
    
                    // Up to 8K per read
                    byte[] ignoredBuffer = new byte[8 * 1024];
    
                    while (is.read(ignoredBuffer) > 0) { }
                } finally {
                    is.close();
                }
                byte[] digest = md.digest();
                StringBuilder sb = new StringBuilder();
    
                for (int i = 0; i < digest.length; i++) {
                    sb.append(Integer.toString((digest[i] & 0xff) + 0x100, 16).substring(1));
                }
                return sb.toString();
    
            } catch (Exception ex) {
                throw new RuntimeException(ex);
            }
        }
    }
    

    例如

    $CATALINA_HOME/temp/fastText_data.zip

    需要使用此选项:

    InputStream fis =  new FileInputStream(filename);
    

    我怎么能用同样的方法做到这一点(不想违反干-不要重复你自己)?

    当然,创建一个包含相同代码但使用 InputStream fis = new FileInputStream(filename); 而不是 InputStream is = new URL(fileUrl).openStream(); 会违反干燥原则吗?

    有什么好的方法来重构它呢?两个公共方法和一个重构的私有方法包含相同的代码行?

    0 回复  |  直到 4 年前
        1
  •  3
  •   VGR    4 年前

    制作三个方法:一个私有方法,它需要一个InputStream参数,这个参数是给定给当前逻辑的;两个非常短的公共方法,每个方法用它们创建的InputStream调用私有方法。

    public static String makeHashFromUrl(String url) {
        try (InputStream stream = new URL(url).openStream()) {
            return makeHashFromStream(stream);
        }
    }
    
    public static String makeHashFromFile(File file) {
        try (InputStream stream = new BufferedInputStream(new FileInputStream(file))) {
            return makeHashFromStream(stream);
        }
    }
    
    private static String makeHashFromStream(InputStream is) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
    
            try {
                is = new DigestInputStream(is, md);
    
                // etc.
    }