FileUtil class provides comprehensive utilities for file operations including reading, writing, extracting from JAR files, and various file manipulation tasks.
Getting files
Create or get files
// Get file from plugin folder (creates if doesn't exist)
File file = FileUtil.getOrMakeFile("config.yml");
// Just get file (may not exist)
File file = FileUtil.getFile("data/players.yml");
// Create file if it doesn't exist
File file = FileUtil.createIfNotExists("logs/server.log");
Get multiple files
// Get all .yml files in directory
File[] configs = FileUtil.getFiles("configs", "yml");
// Get all .txt files
File[] texts = FileUtil.getFiles("data", ".txt");
for (File file : configs) {
Common.log("Found: " + file.getName());
}
File name extraction
// Get file name without extension
String name = FileUtil.getFileName("classes/Warrior.yml");
// Result: "Warrior"
String name = FileUtil.getFileName(new File("config.yml"));
// Result: "config"
Reading files
Read lines
// Read all lines from file
List<String> lines = FileUtil.readLines("config.yml");
// Read from File object
File file = new File("data.txt");
List<String> lines = FileUtil.readLines(file);
// Process lines
for (String line : lines) {
Common.log(line);
}
Read from URL
// Read from URL
try {
URL url = new URL("https://example.com/data.txt");
List<String> lines = FileUtil.readLines(url);
for (String line : lines) {
Common.log(line);
}
} catch (IOException ex) {
Common.error(ex, "Failed to read from URL");
}
Writing files
Simple writing
// Write lines to file (appends)
FileUtil.write("logs/server.log",
"Server started",
"Players online: 5"
);
// Write collection
List<String> data = Arrays.asList("Line 1", "Line 2");
FileUtil.write("data.txt", data);
// Write to File object
File file = new File("output.txt");
FileUtil.write(file, "Content here");
Formatted writing
// Write with timestamp and optional prefix
FileUtil.writeFormatted("logs/errors.log", "Error occurred!");
// Result: [2024-01-15 14:30:45] Error occurred!
// Write with custom prefix
FileUtil.writeFormatted("logs/admin.log", "ADMIN", "Player banned");
// Result: [2024-01-15 14:30:45] ADMIN: Player banned
Advanced writing
import java.nio.file.StandardOpenOption;
// Truncate file before writing
FileUtil.write(file, data, StandardOpenOption.TRUNCATE_EXISTING);
// Append to file
FileUtil.write(file, data, StandardOpenOption.APPEND);
Extracting from JAR
Extract files
// Extract file from plugin JAR
File extracted = FileUtil.extract("config.yml");
// Extract to different location
File extracted = FileUtil.extract(
"defaults/config.yml",
"config.yml"
);
Extracted files support variable replacement:
{plugin_name}- Plugin name{plugin_name_lower}- Lowercase plugin name{file}- File name
Extract raw files
// Extract binary files (images, etc.)
File image = FileUtil.extractRaw("icon.png");
Extract folders
// Extract entire folder from JAR
FileUtil.extractFolderFromJar(
"languages/",
"languages"
);
Get internal file content
// Read file content from JAR without extracting
List<String> lines = FileUtil.getInternalFileContent("config.yml");
if (lines != null) {
for (String line : lines) {
Common.log(line);
}
}
File operations
Delete recursively
// Delete file/folder and all contents
File folder = new File("old_data");
FileUtil.deleteRecursivelly(folder);
Create ZIP archive
// Create ZIP from directory
try {
FileUtil.zip(
"world", // Source directory
"backups/world" // Destination (no .zip extension)
);
Common.log("Backup created!");
} catch (IOException ex) {
Common.error(ex, "Failed to create backup");
}
Examples
Configuration backup system
public class ConfigBackup {
public void backupConfigs() {
try {
// Create backup folder
String timestamp = TimeUtil.getFormattedDate()
.replace(" ", "_")
.replace(":", "-");
String backupPath = "backups/config_" + timestamp;
// Copy all config files
File[] configs = FileUtil.getFiles("", "yml");
for (File config : configs) {
List<String> lines = FileUtil.readLines(config);
FileUtil.write(
backupPath + "/" + config.getName(),
lines
);
}
// Create ZIP
FileUtil.zip(backupPath, backupPath);
// Delete folder (keep only ZIP)
FileUtil.deleteRecursivelly(new File(backupPath));
Common.log("Backup created: " + backupPath + ".zip");
} catch (Exception ex) {
Common.error(ex, "Failed to backup configs");
}
}
}
Player data manager
public class PlayerDataManager {
private final String DATA_FOLDER = "playerdata";
public void savePlayerData(UUID uuid, List<String> data) {
String path = DATA_FOLDER + "/" + uuid + ".txt";
FileUtil.write(path, data);
}
public List<String> loadPlayerData(UUID uuid) {
String path = DATA_FOLDER + "/" + uuid + ".txt";
File file = FileUtil.getFile(path);
if (file.exists()) {
return FileUtil.readLines(file);
}
return new ArrayList<>();
}
public void deletePlayerData(UUID uuid) {
String path = DATA_FOLDER + "/" + uuid + ".txt";
File file = FileUtil.getFile(path);
if (file.exists()) {
file.delete();
}
}
}
Log rotation system
public class LogManager {
private static final int MAX_LOG_SIZE = 1024 * 1024; // 1MB
public void log(String message) {
File logFile = FileUtil.getOrMakeFile("logs/latest.log");
// Check if rotation needed
if (logFile.length() > MAX_LOG_SIZE) {
rotateLog(logFile);
}
// Write to log
FileUtil.writeFormatted("logs/latest.log", "LOG", message);
}
private void rotateLog(File currentLog) {
try {
// Read current log
List<String> lines = FileUtil.readLines(currentLog);
// Save to dated file
String timestamp = TimeUtil.getFormattedDate()
.replace(" ", "_")
.replace(":", "-");
FileUtil.write(
"logs/" + timestamp + ".log",
lines
);
// Clear current log
currentLog.delete();
FileUtil.createIfNotExists("logs/latest.log");
} catch (Exception ex) {
Common.error(ex, "Failed to rotate log");
}
}
}
Language file loader
public class LanguageLoader {
public void loadLanguages() {
// Extract default languages if not exist
if (!FileUtil.getFile("languages").exists()) {
FileUtil.extractFolderFromJar("languages/", "languages");
}
// Load all language files
File[] langFiles = FileUtil.getFiles("languages", "yml");
for (File langFile : langFiles) {
String locale = FileUtil.getFileName(langFile);
List<String> lines = FileUtil.readLines(langFile);
Common.log("Loaded language: " + locale +
" (" + lines.size() + " lines)");
}
}
}
Update checker
public class UpdateChecker {
public void checkForUpdates(String versionUrl) {
try {
URL url = new URL(versionUrl);
List<String> lines = FileUtil.readLines(url);
if (!lines.isEmpty()) {
String latestVersion = lines.get(0);
String currentVersion = SimplePlugin.getVersion();
if (!latestVersion.equals(currentVersion)) {
Common.log(
"&eNew version available: " + latestVersion,
"&eCurrent version: " + currentVersion
);
}
}
} catch (Exception ex) {
Common.log("Could not check for updates");
}
}
}
Use
FileUtil.writeFormatted() for log files to automatically include timestamps.