Use nio for File.listFiles() #449
parent
6cc13784e4
commit
a5d99db105
@ -0,0 +1,20 @@
|
|||||||
|
package org.koitharu.kotatsu.core.fs
|
||||||
|
|
||||||
|
import android.os.Build
|
||||||
|
import org.koitharu.kotatsu.core.util.iterator.CloseableIterator
|
||||||
|
import org.koitharu.kotatsu.core.util.iterator.MappingIterator
|
||||||
|
import java.io.File
|
||||||
|
import java.nio.file.Files
|
||||||
|
import java.nio.file.Path
|
||||||
|
|
||||||
|
class FileSequence(private val dir: File) : Sequence<File> {
|
||||||
|
|
||||||
|
override fun iterator(): Iterator<File> {
|
||||||
|
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
val stream = Files.newDirectoryStream(dir.toPath())
|
||||||
|
CloseableIterator(MappingIterator(stream.iterator(), Path::toFile), stream)
|
||||||
|
} else {
|
||||||
|
dir.listFiles().orEmpty().iterator()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,36 @@
|
|||||||
|
package org.koitharu.kotatsu.core.util.iterator
|
||||||
|
|
||||||
|
import okhttp3.internal.closeQuietly
|
||||||
|
import okio.Closeable
|
||||||
|
|
||||||
|
class CloseableIterator<T>(
|
||||||
|
private val upstream: Iterator<T>,
|
||||||
|
private val closeable: Closeable,
|
||||||
|
) : Iterator<T>, Closeable {
|
||||||
|
|
||||||
|
private var isClosed = false
|
||||||
|
|
||||||
|
override fun hasNext(): Boolean {
|
||||||
|
val result = upstream.hasNext()
|
||||||
|
if (!result) {
|
||||||
|
close()
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun next(): T {
|
||||||
|
try {
|
||||||
|
return upstream.next()
|
||||||
|
} catch (e: NoSuchElementException) {
|
||||||
|
close()
|
||||||
|
throw e
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun close() {
|
||||||
|
if (!isClosed) {
|
||||||
|
closeable.closeQuietly()
|
||||||
|
isClosed = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,13 @@
|
|||||||
|
package org.koitharu.kotatsu.core.util.iterator
|
||||||
|
|
||||||
|
import org.koitharu.kotatsu.R
|
||||||
|
|
||||||
|
class MappingIterator<T, R>(
|
||||||
|
private val upstream: Iterator<T>,
|
||||||
|
private val mapper: (T) -> R,
|
||||||
|
) : Iterator<R> {
|
||||||
|
|
||||||
|
override fun hasNext(): Boolean = upstream.hasNext()
|
||||||
|
|
||||||
|
override fun next(): R = mapper(upstream.next())
|
||||||
|
}
|
||||||
@ -1,11 +1,16 @@
|
|||||||
package org.koitharu.kotatsu.local.data
|
package org.koitharu.kotatsu.local.data
|
||||||
|
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
import java.io.FileFilter
|
||||||
import java.io.FilenameFilter
|
import java.io.FilenameFilter
|
||||||
|
|
||||||
class TempFileFilter : FilenameFilter {
|
class TempFileFilter : FilenameFilter, FileFilter {
|
||||||
|
|
||||||
override fun accept(dir: File, name: String): Boolean {
|
override fun accept(dir: File, name: String): Boolean {
|
||||||
return name.endsWith(".tmp", ignoreCase = true)
|
return name.endsWith(".tmp", ignoreCase = true)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun accept(file: File): Boolean {
|
||||||
|
return file.name.endsWith(".tmp", ignoreCase = true)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue