Try writing a temporary file to disk when a paulscode thread requests
a resource, because even zipfilesystems return interruptible file channels. Signed-off-by: cpw <cpw+github@weeksfamily.ca>
This commit is contained in:
parent
b4ccafe718
commit
6db8b3c26d
1 changed files with 28 additions and 5 deletions
|
@ -19,7 +19,6 @@
|
||||||
|
|
||||||
package net.minecraftforge.fml.packs;
|
package net.minecraftforge.fml.packs;
|
||||||
|
|
||||||
import it.unimi.dsi.fastutil.io.FastByteArrayInputStream;
|
|
||||||
import net.minecraft.resources.AbstractResourcePack;
|
import net.minecraft.resources.AbstractResourcePack;
|
||||||
import net.minecraft.resources.ResourcePackInfo;
|
import net.minecraft.resources.ResourcePackInfo;
|
||||||
import net.minecraft.resources.ResourcePackType;
|
import net.minecraft.resources.ResourcePackType;
|
||||||
|
@ -28,23 +27,26 @@ import net.minecraftforge.fml.loading.moddiscovery.ModFile;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.nio.channels.ByteChannel;
|
|
||||||
import java.nio.channels.Channels;
|
|
||||||
import java.nio.channels.SeekableByteChannel;
|
|
||||||
import java.nio.file.*;
|
import java.nio.file.*;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
import java.util.Objects;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import java.util.stream.StreamSupport;
|
|
||||||
|
|
||||||
import com.google.common.base.Joiner;
|
import com.google.common.base.Joiner;
|
||||||
|
import org.apache.logging.log4j.LogManager;
|
||||||
|
import org.apache.logging.log4j.Logger;
|
||||||
|
|
||||||
|
import static net.minecraftforge.fml.Logging.CORE;
|
||||||
|
|
||||||
public class ModFileResourcePack extends AbstractResourcePack
|
public class ModFileResourcePack extends AbstractResourcePack
|
||||||
{
|
{
|
||||||
|
private static final Logger LOGGER = LogManager.getLogger();
|
||||||
private final ModFile modFile;
|
private final ModFile modFile;
|
||||||
private ResourcePackInfo packInfo;
|
private ResourcePackInfo packInfo;
|
||||||
|
|
||||||
|
@ -73,12 +75,33 @@ public class ModFileResourcePack extends AbstractResourcePack
|
||||||
// If the Path comes from the default filesystem provider, we will rather use the path to generate an old FileInputStream
|
// If the Path comes from the default filesystem provider, we will rather use the path to generate an old FileInputStream
|
||||||
final Path path = modFile.getLocator().findPath(modFile, name);
|
final Path path = modFile.getLocator().findPath(modFile, name);
|
||||||
if (path.getFileSystem() == FileSystems.getDefault()) {
|
if (path.getFileSystem() == FileSystems.getDefault()) {
|
||||||
|
LOGGER.trace(CORE, "Request for resource {} returning FileInputStream for regular file {}", name, path);
|
||||||
return new FileInputStream(path.toFile());
|
return new FileInputStream(path.toFile());
|
||||||
|
} else if (Objects.equals(Thread.currentThread().getStackTrace()[0].getClassName(), "paulscode.sound.CommandThread")) {
|
||||||
|
final Path tempFile = Files.createTempFile("modpack", "soundresource");
|
||||||
|
Files.copy(Files.newInputStream(path, StandardOpenOption.READ), tempFile);
|
||||||
|
LOGGER.trace(CORE, "Request for resource {} returning DeletingTemporaryFileInputStream for packed file {} on paulscode thread", name, path);
|
||||||
|
return new DeletingTemporaryFileInputStream(tempFile);
|
||||||
} else {
|
} else {
|
||||||
return Files.newInputStream(path, StandardOpenOption.READ);
|
return Files.newInputStream(path, StandardOpenOption.READ);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private final class DeletingTemporaryFileInputStream extends FileInputStream {
|
||||||
|
private final Path tempfile;
|
||||||
|
|
||||||
|
DeletingTemporaryFileInputStream(final Path tempfile) throws FileNotFoundException {
|
||||||
|
super(tempfile.toFile());
|
||||||
|
this.tempfile = tempfile;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() throws IOException {
|
||||||
|
super.close();
|
||||||
|
Files.deleteIfExists(tempfile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean resourceExists(String name)
|
protected boolean resourceExists(String name)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue