Ver Fonte

fix https://github.com/gedoor/legado/issues/4464 (#4553)

fix https://github.com/gedoor/legado/issues/4464
ag2s20150909 há 1 ano atrás
pai
commit
be26e4b8e3

+ 4 - 1
modules/book/src/main/java/me/ag2s/umdlib/tool/StreamReader.java

@@ -55,10 +55,13 @@ public class StreamReader {
     }
 
     public byte[] readBytes(int len) throws IOException {
-        if (len < 1) {
+        if (len < 0) {
             System.out.println(len);
             throw new IllegalArgumentException("Length must > 0: " + len);
         }
+        if (len==0){
+            return null;
+        }
         byte[] b = new byte[len];
         is.read(b);
         incCount(len);

+ 19 - 45
modules/book/src/main/java/me/ag2s/umdlib/tool/UmdUtils.java

@@ -3,14 +3,14 @@ package me.ag2s.umdlib.tool;
 
 import java.io.BufferedInputStream;
 import java.io.BufferedOutputStream;
-import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.util.Random;
-import java.util.zip.InflaterInputStream;
+import java.util.zip.Inflater;
+import java.nio.charset.StandardCharsets;
 
 
 public class UmdUtils {
@@ -30,23 +30,7 @@ public class UmdUtils {
             throw new NullPointerException();
         }
 
-        int len = s.length();
-        byte[] ret = new byte[len * 2];
-        int a, b, c;
-        for (int i = 0; i < len; i++) {
-            c = s.charAt(i);
-            a = c >> 8;
-            b = c & 0xFF;
-            if (a < 0) {
-                a += 0xFF;
-            }
-            if (b < 0) {
-                b += 0xFF;
-            }
-            ret[i * 2] = (byte) b;
-            ret[i * 2 + 1] = (byte) a;
-        }
-        return ret;
+        return s.getBytes(StandardCharsets.UTF_16LE);
     }
 
     /**
@@ -56,21 +40,11 @@ public class UmdUtils {
      * @return 原始字符串
      */
     public static String unicodeBytesToString(byte[] bytes) {
-        char[] s = new char[bytes.length / 2];
-        StringBuilder sb = new StringBuilder();
-        int a, b, c;
-        for (int i = 0; i < s.length; i++) {
-            a = bytes[i * 2 + 1];
-            b = bytes[i * 2];
-            c = (a & 0xff) << 8 | (b & 0xff);
-            if (c < 0) {
-                c += 0xffff;
-            }
-            char[] c1 = Character.toChars(c);
-            sb.append(c1);
-
+        //修复一些文件属性空值的问题
+        if (bytes==null){
+            return "";
         }
-        return sb.toString();
+        return new String(bytes, StandardCharsets.UTF_16LE);
     }
 
     /**
@@ -101,19 +75,19 @@ public class UmdUtils {
      * @throws Exception 解码时失败时
      */
     public static byte[] decompress(byte[] compress) throws Exception {
-        ByteArrayInputStream bais = new ByteArrayInputStream(compress);
-        InflaterInputStream iis = new InflaterInputStream(bais);
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        int c = 0;
-        byte[] buf = new byte[BUFFER_SIZE];
-        while (true) {
-            c = iis.read(buf);
-
-            if (c == EOF)
-                break;
-            baos.write(buf, 0, c);
+        Inflater inflater = new Inflater();
+        inflater.reset();
+        inflater.setInput(compress);
+
+        ByteArrayOutputStream baos = new ByteArrayOutputStream(compress.length);
+        try (baos) {
+            byte[] buff = new byte[BUFFER_SIZE];
+            while (!inflater.finished()) {
+                int count = inflater.inflate(buff);
+                baos.write(buff, 0, count);
+            }
         }
-        baos.flush();
+        inflater.end();
         return baos.toByteArray();
     }