From e42308e27857c88cac3cd0d323226ba089861187 Mon Sep 17 00:00:00 2001 From: gedoor Date: Fri, 31 Dec 2021 21:04:23 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9C=AC=E5=9C=B0=E4=B9=A6=E7=B1=8D=E6=97=A0?= =?UTF-8?q?=E6=9D=83=E9=99=90=E5=88=99=E4=BF=9D=E5=AD=98=E5=88=B0=E8=87=AA?= =?UTF-8?q?=E5=B7=B1=E9=80=89=E5=AE=9A=E7=9A=84=E6=96=87=E4=BB=B6=E5=A4=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/model/localBook/TextFile.kt | 45 ++++++++++++------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/io/legado/app/model/localBook/TextFile.kt b/app/src/main/java/io/legado/app/model/localBook/TextFile.kt index e5476979d..781ab95ea 100644 --- a/app/src/main/java/io/legado/app/model/localBook/TextFile.kt +++ b/app/src/main/java/io/legado/app/model/localBook/TextFile.kt @@ -8,15 +8,11 @@ import io.legado.app.data.entities.Book import io.legado.app.data.entities.BookChapter import io.legado.app.data.entities.TxtTocRule import io.legado.app.help.DefaultData -import io.legado.app.utils.EncodingDetect -import io.legado.app.utils.MD5Utils -import io.legado.app.utils.StringUtils -import io.legado.app.utils.isContentScheme +import io.legado.app.model.localBook.LocalBook.cacheFolder +import io.legado.app.utils.* import splitties.init.appCtx -import java.io.File -import java.io.FileDescriptor -import java.io.FileInputStream -import java.io.FileNotFoundException +import java.io.* +import java.nio.ByteBuffer import java.nio.charset.Charset import java.util.regex.Matcher import java.util.regex.Pattern @@ -55,6 +51,7 @@ class TextFile(private val book: Book) { val buffer = ByteArray(BUFFER_SIZE) var blockContent = "" if (book.charset == null) { + Os.lseek(bookFd, 0, SEEK_SET) val length = Os.read(bookFd, buffer, 0, BUFFER_SIZE) book.charset = EncodingDetect.getEncode(buffer) blockContent = String(buffer, 0, length, charset) @@ -80,14 +77,14 @@ class TextFile(private val book: Book) { //读取的长度 var length: Int var allLength = 0 - + val xx = ByteBuffer.allocate(BUFFER_SIZE) //获取文件中的数据到buffer,直到没有数据为止 - while (Os.read(bookFd, buffer, 0, BUFFER_SIZE).also { length = it } > 0) { + while (Os.read(bookFd, xx).also { length = it } > 0) { blockPos++ //如果存在Chapter if (rulePattern != null) { //将数据转换成String, 不能超过length - blockContent = String(buffer, 0, length, charset) + blockContent = String(xx.array(), 0, length, charset) val lastN = blockContent.lastIndexOf("\n") if (lastN > 0) { blockContent = blockContent.substring(0, lastN) @@ -238,17 +235,24 @@ class TextFile(private val book: Book) { return toc } + /** + * 获取匹配次数最多的目录规则 + */ private fun getTocRule(content: String): TxtTocRule? { var txtTocRule: TxtTocRule? = null + var maxCs = 0 for (tocRule in tocRules) { val pattern = Pattern.compile(tocRule.rule, Pattern.MULTILINE) val matcher = pattern.matcher(content) - if (matcher.find()) { + var cs = 0 + while (matcher.find()) { + cs++ + } + if (cs > maxCs) { + maxCs = cs txtTocRule = tocRule - break } } - return txtTocRule } @@ -288,7 +292,18 @@ class TextFile(private val book: Book) { private fun getBookFD(book: Book): FileDescriptor { if (book.bookUrl.isContentScheme()) { val uri = Uri.parse(book.bookUrl) - return appCtx.contentResolver.openFileDescriptor(uri, "r")!!.fileDescriptor + val bookFile = cacheFolder.getFile(book.name) + if (!bookFile.exists()) { + bookFile.createNewFile() + appCtx.contentResolver.openInputStream(uri).use { iStream -> + FileOutputStream(bookFile).use { oStream -> + iStream?.copyTo(oStream) + oStream.flush() + } + } + } + return FileInputStream(bookFile).fd + //return appCtx.contentResolver.openFileDescriptor(uri, "r")!!.fileDescriptor } return FileInputStream(File(book.bookUrl)).fd }