正在查看: FileWipe Pro v3.0.0 应用的 DiskLruCache.java JAVA 源代码文件
本页面展示 JAVA 反编译生成的源代码文件,支持语法高亮显示。 仅供安全研究与技术分析使用,严禁用于任何非法用途。请遵守相关法律法规。
正在查看: FileWipe Pro v3.0.0 应用的 DiskLruCache.java JAVA 源代码文件
本页面展示 JAVA 反编译生成的源代码文件,支持语法高亮显示。 仅供安全研究与技术分析使用,严禁用于任何非法用途。请遵守相关法律法规。
package com.tradplus.ads.common;
import com.startapp.simple.bloomfilter.codec.IOUtils;
import j0.a;
import java.io.BufferedWriter;
import java.io.Closeable;
import java.io.EOFException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FilterOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.concurrent.Callable;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.regex.Pattern;
public final class DiskLruCache implements Closeable {
static final long ANY_SEQUENCE_NUMBER = -1;
private static final String CLEAN = "CLEAN";
private static final String DIRTY = "DIRTY";
static final String JOURNAL_FILE = "journal";
static final String JOURNAL_FILE_BACKUP = "journal.bkp";
static final String JOURNAL_FILE_TEMP = "journal.tmp";
static final String MAGIC = "libcore.io.DiskLruCache";
private static final String READ = "READ";
private static final String REMOVE = "REMOVE";
static final String VERSION_1 = "1";
private final int appVersion;
private final File directory;
private final File journalFile;
private final File journalFileBackup;
private final File journalFileTmp;
private Writer journalWriter;
private long maxSize;
private int redundantOpCount;
private final int valueCount;
static final Pattern LEGAL_KEY_PATTERN = Pattern.compile("[a-z0-9_-]{1,64}");
private static final OutputStream NULL_OUTPUT_STREAM = new OutputStream() {
@Override
public void write(int i) {
}
};
private long size = 0;
private final LinkedHashMap<String, Entry> lruEntries = new LinkedHashMap<>(0, 0.75f, true);
private long nextSequenceNumber = 0;
final ThreadPoolExecutor executorService = new ThreadPoolExecutor(0, 1, 60, TimeUnit.SECONDS, new LinkedBlockingQueue());
private final Callable<Void> cleanupCallable = new Callable<Void>() {
@Override
public Void call() {
synchronized (DiskLruCache.this) {
try {
if (DiskLruCache.this.journalWriter == null) {
return null;
}
DiskLruCache.this.trimToSize();
if (DiskLruCache.this.journalRebuildRequired()) {
DiskLruCache.this.rebuildJournal();
DiskLruCache.this.redundantOpCount = 0;
}
return null;
} catch (Throwable th) {
throw th;
}
}
}
};
public final class Editor {
private boolean committed;
private final Entry entry;
private boolean hasErrors;
private final boolean[] written;
public class FaultHidingOutputStream extends FilterOutputStream {
private FaultHidingOutputStream(OutputStream outputStream) {
super(outputStream);
}
@Override
public void close() {
try {
((FilterOutputStream) this).out.close();
} catch (IOException unused) {
Editor.this.hasErrors = true;
}
}
@Override
public void flush() {
try {
((FilterOutputStream) this).out.flush();
} catch (IOException unused) {
Editor.this.hasErrors = true;
}
}
@Override
public void write(int i) {
try {
((FilterOutputStream) this).out.write(i);
} catch (IOException unused) {
Editor.this.hasErrors = true;
}
}
@Override
public void write(byte[] bArr, int i, int i2) {
try {
((FilterOutputStream) this).out.write(bArr, i, i2);
} catch (IOException unused) {
Editor.this.hasErrors = true;
}
}
}
private Editor(Entry entry) {
this.entry = entry;
this.written = entry.readable ? null : new boolean[DiskLruCache.this.valueCount];
}
public void abort() {
DiskLruCache.this.completeEdit(this, false);
}
public void abortUnlessCommitted() {
if (this.committed) {
return;
}
try {
abort();
} catch (IOException unused) {
}
}
public void commit() {
if (this.hasErrors) {
DiskLruCache.this.completeEdit(this, false);
DiskLruCache.this.remove(this.entry.key);
} else {
DiskLruCache.this.completeEdit(this, true);
}
this.committed = true;
}
public String getString(int i) {
InputStream newInputStream = newInputStream(i);
if (newInputStream != null) {
return DiskLruCache.inputStreamToString(newInputStream);
}
return null;
}
public InputStream newInputStream(int i) {
synchronized (DiskLruCache.this) {
if (this.entry.currentEditor != this) {
throw new IllegalStateException();
}
if (!this.entry.readable) {
return null;
}
try {
return new FileInputStream(this.entry.getCleanFile(i));
} catch (FileNotFoundException unused) {
return null;
}
}
}
public OutputStream newOutputStream(int i) {
FileOutputStream fileOutputStream;
FaultHidingOutputStream faultHidingOutputStream;
synchronized (DiskLruCache.this) {
try {
if (this.entry.currentEditor != this) {
throw new IllegalStateException();
}
if (!this.entry.readable) {
this.written[i] = true;
}
File dirtyFile = this.entry.getDirtyFile(i);
try {
fileOutputStream = new FileOutputStream(dirtyFile);
} catch (FileNotFoundException unused) {
DiskLruCache.this.directory.mkdirs();
try {
fileOutputStream = new FileOutputStream(dirtyFile);
} catch (FileNotFoundException unused2) {
return DiskLruCache.NULL_OUTPUT_STREAM;
}
}
faultHidingOutputStream = new FaultHidingOutputStream(fileOutputStream);
} catch (Throwable th) {
throw th;
}
}
return faultHidingOutputStream;
}
public void set(int i, String str) {
OutputStreamWriter outputStreamWriter = null;
try {
OutputStreamWriter outputStreamWriter2 = new OutputStreamWriter(newOutputStream(i), DiskLruCacheUtil.UTF_8);
try {
outputStreamWriter2.write(str);
DiskLruCacheUtil.closeQuietly(outputStreamWriter2);
} catch (Throwable th) {
th = th;
outputStreamWriter = outputStreamWriter2;
DiskLruCacheUtil.closeQuietly(outputStreamWriter);
throw th;
}
} catch (Throwable th2) {
th = th2;
}
}
}
public final class Entry {
private Editor currentEditor;
private final String key;
private final long[] lengths;
private boolean readable;
private long sequenceNumber;
private Entry(String str) {
this.key = str;
this.lengths = new long[DiskLruCache.this.valueCount];
}
private IOException invalidLengths(String[] strArr) {
throw new IOException("unexpected journal line: " + Arrays.toString(strArr));
}
public void setLengths(String[] strArr) {
if (strArr.length != DiskLruCache.this.valueCount) {
throw invalidLengths(strArr);
}
for (int i = 0; i < strArr.length; i++) {
try {
this.lengths[i] = Long.parseLong(strArr[i]);
} catch (NumberFormatException unused) {
throw invalidLengths(strArr);
}
}
}
public File getCleanFile(int i) {
return new File(DiskLruCache.this.directory, this.key + "." + i);
}
public File getDirtyFile(int i) {
return new File(DiskLruCache.this.directory, this.key + "." + i + ".tmp");
}
public String getLengths() {
StringBuilder sb = new StringBuilder();
for (long j : this.lengths) {
sb.append(' ');
sb.append(j);
}
return sb.toString();
}
}
public final class Snapshot implements Closeable {
private final InputStream[] ins;
private final String key;
private final long[] lengths;
private final long sequenceNumber;
private Snapshot(String str, long j, InputStream[] inputStreamArr, long[] jArr) {
this.key = str;
this.sequenceNumber = j;
this.ins = inputStreamArr;
this.lengths = jArr;
}
@Override
public void close() {
for (InputStream inputStream : this.ins) {
DiskLruCacheUtil.closeQuietly(inputStream);
}
}
public Editor edit() {
return DiskLruCache.this.edit(this.key, this.sequenceNumber);
}
public InputStream getInputStream(int i) {
return this.ins[i];
}
public long getLength(int i) {
return this.lengths[i];
}
public String getString(int i) {
return DiskLruCache.inputStreamToString(getInputStream(i));
}
}
private DiskLruCache(File file, int i, int i2, long j) {
this.directory = file;
this.appVersion = i;
this.journalFile = new File(file, JOURNAL_FILE);
this.journalFileTmp = new File(file, JOURNAL_FILE_TEMP);
this.journalFileBackup = new File(file, JOURNAL_FILE_BACKUP);
this.valueCount = i2;
this.maxSize = j;
}
private void checkNotClosed() {
if (this.journalWriter == null) {
throw new IllegalStateException("cache is closed");
}
}
public synchronized void completeEdit(Editor editor, boolean z) {
Entry entry = editor.entry;
if (entry.currentEditor != editor) {
throw new IllegalStateException();
}
if (z && !entry.readable) {
for (int i = 0; i < this.valueCount; i++) {
if (!editor.written[i]) {
editor.abort();
throw new IllegalStateException("Newly created entry didn't create value for index " + i);
}
if (!entry.getDirtyFile(i).exists()) {
editor.abort();
return;
}
}
}
for (int i2 = 0; i2 < this.valueCount; i2++) {
File dirtyFile = entry.getDirtyFile(i2);
if (!z) {
deleteIfExists(dirtyFile);
} else if (dirtyFile.exists()) {
File cleanFile = entry.getCleanFile(i2);
dirtyFile.renameTo(cleanFile);
long j = entry.lengths[i2];
long length = cleanFile.length();
entry.lengths[i2] = length;
this.size = (this.size - j) + length;
}
}
this.redundantOpCount++;
entry.currentEditor = null;
if (entry.readable || z) {
entry.readable = true;
this.journalWriter.write("CLEAN " + entry.key + entry.getLengths() + '\n');
if (z) {
long j2 = this.nextSequenceNumber;
this.nextSequenceNumber = 1 + j2;
entry.sequenceNumber = j2;
}
} else {
this.lruEntries.remove(entry.key);
this.journalWriter.write("REMOVE " + entry.key + '\n');
}
this.journalWriter.flush();
if (this.size > this.maxSize || journalRebuildRequired()) {
this.executorService.submit(this.cleanupCallable);
}
}
private static void deleteIfExists(File file) {
if (file.exists() && !file.delete()) {
throw new IOException();
}
}
public static String inputStreamToString(InputStream inputStream) {
return DiskLruCacheUtil.readFully(new InputStreamReader(inputStream, DiskLruCacheUtil.UTF_8));
}
public boolean journalRebuildRequired() {
int i = this.redundantOpCount;
return i >= 2000 && i >= this.lruEntries.size();
}
public static DiskLruCache open(File file, int i, int i2, long j) {
if (j <= 0) {
throw new IllegalArgumentException("maxSize <= 0");
}
if (i2 <= 0) {
throw new IllegalArgumentException("valueCount <= 0");
}
File file2 = new File(file, JOURNAL_FILE_BACKUP);
if (file2.exists()) {
File file3 = new File(file, JOURNAL_FILE);
if (file3.exists()) {
file2.delete();
} else {
renameTo(file2, file3, false);
}
}
DiskLruCache diskLruCache = new DiskLruCache(file, i, i2, j);
if (diskLruCache.journalFile.exists()) {
try {
diskLruCache.readJournal();
diskLruCache.processJournal();
diskLruCache.journalWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(diskLruCache.journalFile, true), DiskLruCacheUtil.US_ASCII));
return diskLruCache;
} catch (IOException unused) {
diskLruCache.delete();
}
}
file.mkdirs();
DiskLruCache diskLruCache2 = new DiskLruCache(file, i, i2, j);
diskLruCache2.rebuildJournal();
return diskLruCache2;
}
private void processJournal() {
deleteIfExists(this.journalFileTmp);
Iterator<Entry> it = this.lruEntries.values().iterator();
while (it.hasNext()) {
Entry next = it.next();
int i = 0;
if (next.currentEditor == null) {
while (i < this.valueCount) {
this.size += next.lengths[i];
i++;
}
} else {
next.currentEditor = null;
while (i < this.valueCount) {
deleteIfExists(next.getCleanFile(i));
deleteIfExists(next.getDirtyFile(i));
i++;
}
it.remove();
}
}
}
private void readJournal() {
DiskLruCacheStrictLineReader diskLruCacheStrictLineReader = new DiskLruCacheStrictLineReader(new FileInputStream(this.journalFile), DiskLruCacheUtil.US_ASCII);
try {
String readLine = diskLruCacheStrictLineReader.readLine();
String readLine2 = diskLruCacheStrictLineReader.readLine();
String readLine3 = diskLruCacheStrictLineReader.readLine();
String readLine4 = diskLruCacheStrictLineReader.readLine();
String readLine5 = diskLruCacheStrictLineReader.readLine();
if (!MAGIC.equals(readLine) || !"1".equals(readLine2) || !Integer.toString(this.appVersion).equals(readLine3) || !Integer.toString(this.valueCount).equals(readLine4) || !"".equals(readLine5)) {
throw new IOException("unexpected journal header: [" + readLine + ", " + readLine2 + ", " + readLine4 + ", " + readLine5 + "]");
}
int i = 0;
while (true) {
try {
readJournalLine(diskLruCacheStrictLineReader.readLine());
i++;
} catch (EOFException unused) {
this.redundantOpCount = i - this.lruEntries.size();
DiskLruCacheUtil.closeQuietly(diskLruCacheStrictLineReader);
return;
}
}
} catch (Throwable th) {
DiskLruCacheUtil.closeQuietly(diskLruCacheStrictLineReader);
throw th;
}
}
private void readJournalLine(String str) {
String substring;
int indexOf = str.indexOf(32);
if (indexOf == -1) {
throw new IOException("unexpected journal line: ".concat(str));
}
int i = indexOf + 1;
int indexOf2 = str.indexOf(32, i);
if (indexOf2 == -1) {
substring = str.substring(i);
if (indexOf == 6 && str.startsWith(REMOVE)) {
this.lruEntries.remove(substring);
return;
}
} else {
substring = str.substring(i, indexOf2);
}
Entry entry = this.lruEntries.get(substring);
if (entry == null) {
entry = new Entry(substring);
this.lruEntries.put(substring, entry);
}
if (indexOf2 != -1 && indexOf == 5 && str.startsWith(CLEAN)) {
String[] split = str.substring(indexOf2 + 1).split(" ");
entry.readable = true;
entry.currentEditor = null;
entry.setLengths(split);
return;
}
if (indexOf2 == -1 && indexOf == 5 && str.startsWith(DIRTY)) {
entry.currentEditor = new Editor(entry);
} else if (indexOf2 != -1 || indexOf != 4 || !str.startsWith(READ)) {
throw new IOException("unexpected journal line: ".concat(str));
}
}
public synchronized void rebuildJournal() {
StringBuilder sb;
try {
Writer writer = this.journalWriter;
if (writer != null) {
writer.close();
}
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(this.journalFileTmp), DiskLruCacheUtil.US_ASCII));
try {
bufferedWriter.write(MAGIC);
bufferedWriter.write(IOUtils.LINE_SEPARATOR_UNIX);
bufferedWriter.write("1");
bufferedWriter.write(IOUtils.LINE_SEPARATOR_UNIX);
bufferedWriter.write(Integer.toString(this.appVersion));
bufferedWriter.write(IOUtils.LINE_SEPARATOR_UNIX);
bufferedWriter.write(Integer.toString(this.valueCount));
bufferedWriter.write(IOUtils.LINE_SEPARATOR_UNIX);
bufferedWriter.write(IOUtils.LINE_SEPARATOR_UNIX);
for (Entry entry : this.lruEntries.values()) {
if (entry.currentEditor != null) {
sb = new StringBuilder();
sb.append("DIRTY ");
sb.append(entry.key);
sb.append('\n');
} else {
sb = new StringBuilder();
sb.append("CLEAN ");
sb.append(entry.key);
sb.append(entry.getLengths());
sb.append('\n');
}
bufferedWriter.write(sb.toString());
}
bufferedWriter.close();
if (this.journalFile.exists()) {
renameTo(this.journalFile, this.journalFileBackup, true);
}
renameTo(this.journalFileTmp, this.journalFile, false);
this.journalFileBackup.delete();
this.journalWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(this.journalFile, true), DiskLruCacheUtil.US_ASCII));
} catch (Throwable th) {
bufferedWriter.close();
throw th;
}
} catch (Throwable th2) {
throw th2;
}
}
private static void renameTo(File file, File file2, boolean z) {
if (z) {
deleteIfExists(file2);
}
if (!file.renameTo(file2)) {
throw new IOException();
}
}
public void trimToSize() {
while (this.size > this.maxSize) {
remove(this.lruEntries.entrySet().iterator().next().getKey());
}
}
private void validateKey(String str) {
if (!LEGAL_KEY_PATTERN.matcher(str).matches()) {
throw new IllegalArgumentException(a.g("keys must match regex [a-z0-9_-]{1,64}: \"", str, "\""));
}
}
@Override
public synchronized void close() {
try {
if (this.journalWriter == null) {
return;
}
Iterator it = new ArrayList(this.lruEntries.values()).iterator();
while (it.hasNext()) {
Entry entry = (Entry) it.next();
if (entry.currentEditor != null) {
entry.currentEditor.abort();
}
}
trimToSize();
this.journalWriter.close();
this.journalWriter = null;
} catch (Throwable th) {
throw th;
}
}
public void delete() {
close();
DiskLruCacheUtil.deleteContents(this.directory);
}
public Editor edit(String str) {
return edit(str, ANY_SEQUENCE_NUMBER);
}
public synchronized void flush() {
checkNotClosed();
trimToSize();
this.journalWriter.flush();
}
public synchronized Snapshot get(String str) {
Throwable th;
InputStream inputStream;
try {
checkNotClosed();
validateKey(str);
Entry entry = this.lruEntries.get(str);
if (entry == null) {
return null;
}
if (!entry.readable) {
return null;
}
InputStream[] inputStreamArr = new InputStream[this.valueCount];
for (int i = 0; i < this.valueCount; i++) {
try {
try {
try {
inputStreamArr[i] = new FileInputStream(entry.getCleanFile(i));
} catch (Throwable th2) {
th = th2;
throw th;
}
} catch (FileNotFoundException unused) {
for (int i2 = 0; i2 < this.valueCount && (inputStream = inputStreamArr[i2]) != null; i2++) {
DiskLruCacheUtil.closeQuietly(inputStream);
}
return null;
}
} catch (Throwable th3) {
th = th3;
th = th;
throw th;
}
}
this.redundantOpCount++;
this.journalWriter.append((CharSequence) ("READ " + str + '\n'));
if (journalRebuildRequired()) {
this.executorService.submit(this.cleanupCallable);
}
return new Snapshot(str, entry.sequenceNumber, inputStreamArr, entry.lengths);
} catch (Throwable th4) {
th = th4;
}
}
public File getDirectory() {
return this.directory;
}
public synchronized long getMaxSize() {
return this.maxSize;
}
public synchronized boolean isClosed() {
return this.journalWriter == null;
}
public synchronized boolean remove(String str) {
try {
checkNotClosed();
validateKey(str);
Entry entry = this.lruEntries.get(str);
if (entry != null && entry.currentEditor == null) {
for (int i = 0; i < this.valueCount; i++) {
File cleanFile = entry.getCleanFile(i);
if (cleanFile.exists() && !cleanFile.delete()) {
throw new IOException("failed to delete " + cleanFile);
}
this.size -= entry.lengths[i];
entry.lengths[i] = 0;
}
this.redundantOpCount++;
this.journalWriter.append((CharSequence) ("REMOVE " + str + '\n'));
this.lruEntries.remove(str);
if (journalRebuildRequired()) {
this.executorService.submit(this.cleanupCallable);
}
return true;
}
return false;
} finally {
}
}
public synchronized void setMaxSize(long j) {
this.maxSize = j;
this.executorService.submit(this.cleanupCallable);
}
public synchronized long size() {
return this.size;
}
public synchronized Editor edit(String str, long j) {
checkNotClosed();
validateKey(str);
Entry entry = this.lruEntries.get(str);
if (j != ANY_SEQUENCE_NUMBER && (entry == null || entry.sequenceNumber != j)) {
return null;
}
if (entry == null) {
entry = new Entry(str);
this.lruEntries.put(str, entry);
} else if (entry.currentEditor != null) {
return null;
}
Editor editor = new Editor(entry);
entry.currentEditor = editor;
this.journalWriter.write("DIRTY " + str + '\n');
this.journalWriter.flush();
return editor;
}
}