Skip to content

Commit 55ab001

Browse files
concurrent-recursionBrad Hall
and
Brad Hall
authored
Refactor File I/O handling (#874)
* Changed all references to java.io.File to use equivalent java.nio.Path or java.nio.Files methods and types --------- Co-authored-by: Brad Hall <bradley.hall@fullsight.org>
1 parent acef59d commit 55ab001

File tree

24 files changed

+191
-156
lines changed

24 files changed

+191
-156
lines changed

litiengine/src/main/java/de/gurkenlabs/litiengine/GameLog.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package de.gurkenlabs.litiengine;
22

3-
import java.io.File;
3+
import java.nio.file.Files;
4+
import java.nio.file.Paths;
45
import java.util.logging.ConsoleHandler;
56
import java.util.logging.FileHandler;
67
import java.util.logging.Level;
@@ -26,7 +27,7 @@ Logger log() {
2627

2728
void init() {
2829
LogManager.getLogManager().reset();
29-
if (new File(LOGGING_CONFIG_FILE).exists()) {
30+
if (Files.exists(Paths.get(LOGGING_CONFIG_FILE))) {
3031
System.setProperty("java.util.logging.config.file", LOGGING_CONFIG_FILE);
3132

3233
try {

litiengine/src/main/java/de/gurkenlabs/litiengine/configuration/Configuration.java

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@
22

33
import de.gurkenlabs.litiengine.Game;
44
import de.gurkenlabs.litiengine.resources.Resources;
5+
56
import java.io.BufferedInputStream;
6-
import java.io.File;
7-
import java.io.FileInputStream;
8-
import java.io.FileOutputStream;
97
import java.io.IOException;
108
import java.io.InputStream;
119
import java.io.OutputStream;
10+
import java.nio.file.Files;
11+
import java.nio.file.Path;
12+
import java.nio.file.Paths;
13+
import java.nio.file.StandardOpenOption;
1214
import java.util.ArrayList;
1315
import java.util.List;
1416
import java.util.Properties;
@@ -122,10 +124,10 @@ public String getFileName() {
122124
* exists, it creates a new configuration file in the application folder.
123125
*/
124126
public void load() {
125-
final File settingsFile = new File(this.getFileName());
127+
final Path settingsFile = Paths.get(this.getFileName());
126128
try (InputStream settingsStream = Resources.get(this.getFileName())) {
127-
if (!settingsFile.exists() && settingsStream == null || !settingsFile.isFile()) {
128-
try (OutputStream out = new FileOutputStream(settingsFile)) {
129+
if (!Files.exists(settingsFile) && settingsStream == null || !Files.isRegularFile(settingsFile)) {
130+
try (OutputStream out = Files.newOutputStream(settingsFile)) {
129131
this.createDefaultSettingsFile(out);
130132
}
131133

@@ -136,8 +138,8 @@ public void load() {
136138
log.log(Level.SEVERE, e.getMessage(), e);
137139
}
138140

139-
if (settingsFile.exists()) {
140-
try (InputStream settingsStream = new FileInputStream(settingsFile)) {
141+
if (Files.exists(settingsFile)) {
142+
try (InputStream settingsStream = Files.newInputStream(settingsFile)) {
141143

142144
final Properties properties = new Properties();
143145
BufferedInputStream stream;
@@ -161,8 +163,8 @@ public void load() {
161163
* @see Configuration#DEFAULT_CONFIGURATION_FILE_NAME
162164
*/
163165
public void save() {
164-
final File settingsFile = new File(this.getFileName());
165-
try (OutputStream out = new FileOutputStream(settingsFile, false)) {
166+
final Path settingsFile = Paths.get(this.getFileName());
167+
try (OutputStream out = Files.newOutputStream(settingsFile, StandardOpenOption.CREATE_NEW)) {
166168
for (final ConfigurationGroup group : this.getConfigurationGroups()) {
167169
if (!Game.isDebug() && group.isDebug()) {
168170
continue;

litiengine/src/main/java/de/gurkenlabs/litiengine/graphics/RenderComponent.java

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import de.gurkenlabs.litiengine.resources.ImageFormat;
66
import de.gurkenlabs.litiengine.util.TimeUtilities;
77
import de.gurkenlabs.litiengine.util.io.ImageSerializer;
8+
89
import java.awt.Canvas;
910
import java.awt.Color;
1011
import java.awt.Dimension;
@@ -15,19 +16,25 @@
1516
import java.awt.Toolkit;
1617
import java.awt.image.BufferStrategy;
1718
import java.awt.image.BufferedImage;
18-
import java.io.File;
19+
import java.io.IOException;
20+
import java.nio.file.Files;
21+
import java.nio.file.Path;
22+
import java.nio.file.Paths;
1923
import java.text.SimpleDateFormat;
2024
import java.util.Date;
2125
import java.util.List;
2226
import java.util.concurrent.CopyOnWriteArrayList;
2327
import java.util.function.Consumer;
2428
import java.util.function.IntConsumer;
29+
import java.util.logging.Level;
30+
import java.util.logging.Logger;
2531

2632
/**
2733
* The {@code RenderComponent} class extends {@link Canvas} and handles the rendering of the game screen, including managing fade effects, capturing
2834
* screenshots, and rendering the game cursor.
2935
*/
3036
public class RenderComponent extends Canvas {
37+
private static final Logger log = Logger.getLogger(RenderComponent.class.getName());
3138
/**
3239
* The default background color for the rendering component.
3340
*/
@@ -287,13 +294,15 @@ private void updateAlpha(long startTime, int duration, boolean fadeIn) {
287294
private void saveScreenshot(BufferedImage img) {
288295
try {
289296
String timeStamp = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date());
290-
File folder = new File("./screenshots/");
291-
if (!folder.exists()) {
292-
folder.mkdirs();
297+
Path folder = Paths.get("./screenshots/");
298+
if (!Files.exists(folder)) {
299+
Files.createDirectories(folder);
293300
}
294301
String path = "./screenshots/" + timeStamp + ImageFormat.PNG.toFileExtension();
295302
ImageSerializer.saveImage(path, img);
296-
} finally {
303+
} catch (final IOException e) {
304+
log.log(Level.SEVERE, e.getMessage(), e);
305+
} finally{
297306
takeScreenShot = false;
298307
}
299308
}

litiengine/src/main/java/de/gurkenlabs/litiengine/resources/ImageFormat.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package de.gurkenlabs.litiengine.resources;
22

3-
import java.io.File;
3+
import java.nio.file.Path;
44

55
/**
66
* Contains all known image file-formats supported by the engine.
7-
*
7+
*
88
* @see SoundFormat
99
*/
1010
public enum ImageFormat {
@@ -16,7 +16,7 @@ public enum ImageFormat {
1616

1717
/**
1818
* Gets the {@code ImageFormat} of the specified format string.
19-
*
19+
*
2020
* @param imageFormat
2121
* The format string from which to extract the format.
2222
* @return The format of the specified string or {@code UNDEFINED} if not supported.
@@ -27,22 +27,22 @@ public static ImageFormat get(String imageFormat) {
2727

2828
/**
2929
* Determines whether the extension of the specified file is supported by the engine.
30-
*
30+
*
3131
* @param file
3232
* The file to check for.
33-
*
33+
*
3434
* @return True if the extension is part of this enum; otherwise false.
3535
*/
36-
public static boolean isSupported(File file) {
36+
public static boolean isSupported(Path file) {
3737
return isSupported(file.toString());
3838
}
3939

4040
/**
4141
* Determines whether the extension of the specified file is supported by the engine.
42-
*
42+
*
4343
* @param fileName
4444
* The name of the file to check for.
45-
*
45+
*
4646
* @return True if the extension is part of this enum; otherwise false.
4747
*/
4848
public static boolean isSupported(String fileName) {
@@ -56,7 +56,7 @@ public static String[] getAllExtensions() {
5656
/**
5757
* Converts this format instance to a file format string that can be used as an extension (e.g. .png).<br>
5858
* It adds a leading '.' to the lower-case string representation of this instance.
59-
*
59+
*
6060
* @return The file extension string for this instance.
6161
*/
6262
public String toFileExtension() {

litiengine/src/main/java/de/gurkenlabs/litiengine/resources/ResourceBundle.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,16 @@
1717
import jakarta.xml.bind.annotation.XmlTransient;
1818
import java.io.ByteArrayInputStream;
1919
import java.io.ByteArrayOutputStream;
20-
import java.io.File;
21-
import java.io.FileOutputStream;
2220
import java.io.IOException;
2321
import java.io.InputStream;
22+
import java.io.OutputStream;
2423
import java.io.Serial;
2524
import java.io.Serializable;
2625
import java.net.URL;
2726
import java.nio.file.Files;
27+
import java.nio.file.Path;
28+
import java.nio.file.Paths;
29+
import java.nio.file.StandardOpenOption;
2830
import java.util.ArrayList;
2931
import java.util.Collections;
3032
import java.util.List;
@@ -202,10 +204,10 @@ public String save(final String fileName, final boolean compress) {
202204
fileNameWithExtension += "." + FILE_EXTENSION;
203205
}
204206

205-
final File newFile = new File(fileNameWithExtension);
206-
if (newFile.exists()) {
207+
final Path newFile = Paths.get(fileNameWithExtension);
208+
if (!Files.exists(newFile)) {
207209
try {
208-
Files.delete(newFile.toPath().toAbsolutePath());
210+
Files.delete(newFile);
209211
} catch (IOException e) {
210212
log.log(Level.WARNING, e.getMessage(), e);
211213
}
@@ -218,7 +220,7 @@ public String save(final String fileName, final boolean compress) {
218220
Collections.sort(this.getBluePrints());
219221
Collections.sort(this.getSounds());
220222

221-
try (FileOutputStream fileOut = new FileOutputStream(newFile, false)) {
223+
try (OutputStream fileOut = Files.newOutputStream(newFile, StandardOpenOption.CREATE_NEW)) {
222224
final JAXBContext jaxbContext = XmlUtilities.getContext(ResourceBundle.class);
223225
final Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
224226
// output pretty printed

litiengine/src/main/java/de/gurkenlabs/litiengine/resources/Resources.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,13 @@
1111
import java.awt.Font;
1212
import java.awt.image.BufferedImage;
1313
import java.io.BufferedInputStream;
14-
import java.io.File;
1514
import java.io.IOException;
1615
import java.io.InputStream;
1716
import java.net.MalformedURLException;
1817
import java.net.URL;
1918
import java.nio.charset.Charset;
2019
import java.nio.charset.StandardCharsets;
20+
import java.nio.file.Paths;
2121
import java.util.ArrayList;
2222
import java.util.Collections;
2323
import java.util.List;
@@ -330,7 +330,7 @@ public static URL getLocation(String name) {
330330
return new URL(name);
331331
} catch (MalformedURLException e) {
332332
try {
333-
return (new File(name)).toURI().toURL();
333+
return (Paths.get(name).toUri().toURL());
334334
} catch (MalformedURLException e1) {
335335
return null;
336336
}

litiengine/src/main/java/de/gurkenlabs/litiengine/resources/SoundFormat.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package de.gurkenlabs.litiengine.resources;
22

3-
import java.io.File;
3+
import java.nio.file.Path;
44

55
/**
66
* Contains all known audio file-formats supported by the engine.
@@ -29,8 +29,8 @@ public static SoundFormat get(String format) {
2929
* @param file The file to check for.
3030
* @return True if the extension is part of this enum; otherwise false.
3131
*/
32-
public static boolean isSupported(File file) {
33-
return isSupported(file.getName());
32+
public static boolean isSupported(Path file) {
33+
return isSupported(file.getFileName().toString());
3434
}
3535

3636
/**

litiengine/src/main/java/de/gurkenlabs/litiengine/resources/Spritesheets.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@
99
import java.awt.image.BufferedImage;
1010
import java.io.BufferedReader;
1111
import java.io.BufferedWriter;
12-
import java.io.File;
1312
import java.io.FileWriter;
1413
import java.io.IOException;
1514
import java.io.InputStream;
1615
import java.io.InputStreamReader;
16+
import java.nio.file.Path;
1717
import java.nio.file.Paths;
1818
import java.util.ArrayList;
1919
import java.util.Arrays;
@@ -281,8 +281,10 @@ public boolean saveTo(final String spriteInfoFile, boolean metadataOnly) {
281281
writer.write("\n");
282282

283283
if (!metadataOnly) {
284-
ImageSerializer.saveImage(Paths.get(new File(spriteInfoFile).getParentFile().getAbsolutePath(),
285-
spritesheet.getName() + spritesheet.getImageFormat().toFileExtension()).toString(), spritesheet.getImage(),
284+
Path spriteInfoPath = Paths.get(spriteInfoFile);
285+
ImageSerializer.saveImage(
286+
spriteInfoPath.resolveSibling(spritesheet.getName() + spritesheet.getImageFormat().toFileExtension()).toString(),
287+
spritesheet.getImage(),
286288
spritesheet.getImageFormat());
287289
}
288290
}

0 commit comments

Comments
 (0)