Je dois écrire une matrice de pixels sur le disque et lire ce fichier dans la même application. Pour une raison quelconque, les fichiers n'écrivent pas sur le disque tant que l'application n'est pas terminée. (Seulement alors ils apparaissent dans le répertoire dans lequel ils sont sauvegardés). J'écris cette application dans IntelliJ IDEA si cela est utile de le savoir.Comment enregistrer l'image sur le disque avant la fin de l'application?
Comment puis-je m'assurer que le fichier est écrit sur le disque immédiatement? Voici mon code:
protected void savePixelstoPNG(int[] pixels, String fileName) {
BufferedImage image = new BufferedImage(getMapWidth(), getMapHeight(), BufferedImage.TYPE_INT_RGB);
Graphics graphics = image.getGraphics();
for(int y = 0; y < getMapHeight(); y++) {
for(int x = 0; x < getMapWidth(); x++) {
graphics.setColor(new Color(pixels[x + y * getMapWidth()]));
graphics.fillRect(x, y, 1, 1);
}
}
try {
File file = new File(fileName);
ImageIO.write(image, "PNG", file);
} catch(IOException e) {
e.printStackTrace();
}
}
EDIT: Je visitai les dossiers et ils sont en fait en cours d'écriture sur le disque immédiatement. Toutefois, ces modifications ne sont pas reflétées dans le répertoire du projet (les fichiers sont enregistrés dans un package Java) jusqu'à ce que l'application se termine. Donc, quand je vais lire ces fichiers après les avoir sauvegardés (dans la même durée de vie de l'application), l'application ne peut pas trouver les fichiers, même s'ils existent sur le disque.
EDIT 2: Voici le code que j'utilise pour lire le fichier à partir du classpath en utilisant un chemin de répertoire relatif. Les ressources initiales sont lues à partir du classpath. Quand ils sont mis à jour, ils sont écrits dans un répertoire différent dans le classpath pour que les ressources d'origine ne sont pas remplacées, car les ressources originales sont censées être lu d'abord chaque fois que l'application est exécutée à nouveau:
void myLoadMethod() {
loadMapTiles("resource/tilemap_1-1.png");
loadTriggerTiles("resource/triggermap_1-1.png");
}
protected void loadMapTiles(@NotNull String path) {
URL url = getClass().getClassLoader().getResource(path);
loadTiles(url, mapTiles);
}
protected void loadTriggerTiles(@NotNull String path) {
URL url = getClaass().getClassLoader().getResource(path);
loadTiles(url, triggerTiles);
}
protected void loadTiles(@NotNull URL url, @Nullable int[] dest) {
try {
System.out.println("Trying to load: " + url.toString() + "...");
BufferedImage map = ImageIO.read(url);
int[] pixels = new int[mapWidth * mapHeight];
map.getRGB(0, 0, mapWidth, mapHeight, pixels, 0, mapWidth);
System.arraycopy(pixels, 0, dest, 0, dest.length);
System.out.println("Success!");
} catch (IOException e) {
System.out.println("failed...");
e.printStackTrace();
}
}
}
Notez que mapTiles
et triggerTiles
sont des champs contenus dans la classe qui détient loadMapTiles
loadTriggerTiles
et loadTiles
, mais autant que je sache l'appel statique 'ImageIO # write' fait automatiquement – DayTripperID
Comment essayez-vous de les lire? Est-ce que vous supposez que le fichier est sur le chemin de la classe, ou de l'extérieur? Parce que "les fichiers sont sauvegardés dans un paquet java", il se peut que vous écrivez dans le répertoire (source), mais essayez de lire depuis le chemin de classe, et ils ne seront copiés dans le classpath qu'une fois que vous lancez une nouvelle exécution dans IntelliJ . – cello
Oui! Je lis de classpath en utilisant une URL instanciée avec un répertoire relatif. J'ai écrit dans le répertoire absolu parce que je ne pouvais pas comprendre comment écrire dans un répertoire relatif. Je ne pouvais pas le faire reconnaître un répertoire relatif (gardé le répertoire introuvable) Donc je suppose que je dois trouver comment l'écrire dans un répertoire relatif? – DayTripperID