From a61978a7bb06987ad66b7f088941b6f639bb33e1 Mon Sep 17 00:00:00 2001 From: Nikollai Date: Tue, 26 May 2026 18:13:00 +0200 Subject: [PATCH] Added a resource conversion to read internal files when deployed as a jar file --- .../millions/controller/GameController.java | 8 ++++---- .../fileIO/CSV/InternalResourceUtil.java | 19 +++++++++++++++++++ src/main/java/millions/view/StartView.java | 14 +++++++++----- 3 files changed, 32 insertions(+), 9 deletions(-) create mode 100644 src/main/java/millions/controller/fileIO/CSV/InternalResourceUtil.java diff --git a/src/main/java/millions/controller/GameController.java b/src/main/java/millions/controller/GameController.java index 17157dc..819aa88 100644 --- a/src/main/java/millions/controller/GameController.java +++ b/src/main/java/millions/controller/GameController.java @@ -29,8 +29,8 @@ public void startGame( throw new IllegalArgumentException("Pre run weeks cannot be negative"); } try { - CSVFileHandler fileHandler = new CSVFileHandler(); - List stocks = fileHandler.getStocksFromFile(stockFilePath); + CSVFileHandler csvFileHandler = new CSVFileHandler(); + List stocks = csvFileHandler.getStocksFromFile(stockFilePath); exchange = new Exchange("Exchange", stocks); for (int i = 0; i < preRunWeeks; i++) { @@ -39,10 +39,10 @@ public void startGame( player = new Player(name, startingMoney); - } catch (FileNotFoundException e) { - throw new UncheckedFileNotFoundException(e.getMessage()); } catch (InvalidFormatException e) { throw new InvalidFormatException(e.getMessage()); + } catch (FileNotFoundException e) { + throw new UncheckedFileNotFoundException(e.getMessage()); } } diff --git a/src/main/java/millions/controller/fileIO/CSV/InternalResourceUtil.java b/src/main/java/millions/controller/fileIO/CSV/InternalResourceUtil.java new file mode 100644 index 0000000..3756d20 --- /dev/null +++ b/src/main/java/millions/controller/fileIO/CSV/InternalResourceUtil.java @@ -0,0 +1,19 @@ +package millions.controller.fileIO.CSV; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.StandardCopyOption; + +public class InternalResourceUtil { + public File getFileFromJar(InputStream resource) throws IOException { + if (resource == null) { + throw new IOException("Resource not found is null"); + } + File tempFile = File.createTempFile("javafx_app_", ".tmp"); + tempFile.deleteOnExit(); + Files.copy(resource, tempFile.toPath(), StandardCopyOption.REPLACE_EXISTING); + return tempFile; + } +} diff --git a/src/main/java/millions/view/StartView.java b/src/main/java/millions/view/StartView.java index 481cff3..2bb7563 100644 --- a/src/main/java/millions/view/StartView.java +++ b/src/main/java/millions/view/StartView.java @@ -1,6 +1,8 @@ package millions.view; import java.io.File; +import java.io.IOException; +import java.io.InputStream; import java.math.BigDecimal; import java.net.URISyntaxException; import java.net.URL; @@ -17,6 +19,7 @@ import javafx.scene.layout.VBox; import javafx.stage.FileChooser; import javafx.stage.Stage; +import millions.controller.fileIO.CSV.InternalResourceUtil; /** The initial game setup screen where the player enters their info. */ public class StartView extends VBox { @@ -107,12 +110,13 @@ public StartView(Stage stage) { private File loadDefaultStocksFile() { try { - URL resource = Objects.requireNonNull(getClass().getResource("/data/default-stocks.csv")); - return Paths.get(resource.toURI()).toFile(); - } catch (URISyntaxException e) { - logger.log(Level.SEVERE, "Error accessing default stocks file", e); - throw new IllegalStateException("Could not load default stocks file", e); + InputStream resource = Objects.requireNonNull(getClass().getResourceAsStream("/data/default-stocks.csv")); + InternalResourceUtil converter = new InternalResourceUtil(); + return converter.getFileFromJar(resource); + } catch (IOException e) { + logger.log(Level.SEVERE, "error loading default file: ", e); } + return null; } /** Enables/Disables start button */