IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

BufferedWriter et permissions


Sujet :

Entrée/Sortie Java

  1. #1
    Membre actif
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 149
    Par défaut BufferedWriter et permissions
    Bonjour,

    Je souhaite démarrer une application (SigarSmoke.jar) à partir d'un plugin. SigarSmoke.jar est censé lire puis réécrire un fichier YAML créé par mon plugin.
    Pour cela j'utilise BufferedReader et BufferedWriter. Executé manuellement (le plugin tourne encore en arrière-plan), tout se déroule comme prévu mais quand l'application est lancée par le plugin, les BufferedReader et BufferedWriter ne fonctionne pas. Une histoire de permission?
    J'ai ajouté ceci dans le code du plugin pour être sûr.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    smoke.setReadable(true);
    smoke.setWritable(true);
    Toujours le même problème...

    Voici le code de mon application:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    package io.github.jeremgamer.sigarsmoke;
     
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
     
    import javax.swing.JFrame;
     
    import org.hyperic.sigar.CpuPerc;
    import org.hyperic.sigar.Mem;
    import org.hyperic.sigar.Sigar;
    import org.hyperic.sigar.SigarException;
     
     
    @SuppressWarnings("serial")
    public class SigarSmoke extends JFrame { //J'ai étendu à JFrame pour ne pas avoir à passer par un .bat
     
    	public static int getCpuUsage() throws SigarException {
     
    		Sigar sigar = new Sigar();
    		CpuPerc cpu = sigar.getCpuPerc();
    		double cpuUsage = cpu.getUser() * 100 + cpu.getSys() * 100 ;
    		int display = (int)cpuUsage;
            return display;
    	}
     
    	public static int getMemUsagePercent() throws SigarException {
     
    		Sigar sigar = new Sigar();
    		Mem mem = null;
            try {
                mem = sigar.getMem();
            } catch (SigarException se) {
                se.printStackTrace();
                }
            double MEMUse = mem.getUsedPercent();
    		int displayPercent = (int) MEMUse;
            return displayPercent;
    	}
    	public static long getMemUsage() throws SigarException {
     
    		Sigar sigar = new Sigar();
    		Mem mem = null;
            try {
                mem = sigar.getMem();
            } catch (SigarException se) {
                se.printStackTrace();
                }
            long MEMUse = mem.getUsed() / 1024 / 1024;
    		return MEMUse;
    	}
     
    	public static void answer() throws IOException, SigarException {
    		File smoke = new File("smoke.yml");
    		smoke.setReadable(true);
    		smoke.setWritable(true);
        	FileReader fr;
    		FileWriter fw;
    		fr = new FileReader(smoke.getAbsoluteFile());
    		BufferedReader br = new BufferedReader(fr);	
    		String request = br.readLine();
    		br.close();
     
    		String returnedValue = null;
    		fw = new FileWriter(smoke.getAbsoluteFile());
    		BufferedWriter bw = new BufferedWriter(fw);
     
    		if ( request.contains("cpu") ) {
    			returnedValue = Integer.toString(getCpuUsage());
    			bw.write(returnedValue);
    			bw.flush();
    			bw.close();	
    		}
    		if ( request.contains("ram") ) {
    			returnedValue = getMemUsagePercent() + "% || " + getMemUsage() + "MB";
    			bw.write(returnedValue);
    			bw.flush();
    			bw.close();	
    		}
    		bw.close();
    	}
     
    	public SigarSmoke() throws IOException, SigarException {
    		this.setDefaultCloseOperation(EXIT_ON_CLOSE);		
    		this.setLocationRelativeTo(null);
    		this.setVisible(true); //Pour voir si le programme se lance bien. En effet une fenêtre s'ouvre mais les flux, quand à eux, ne semblent pas s'ouvrir...
    		answer();
    	}
     
    	public static void main ( String args[] ) throws IOException, SigarException {
    		new SigarSmoke();
    	}
    }
    Et voici un bout de code de mon plugin:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    	public void sendRequest(String request) throws IOException {
    		File smoke = new File(plugin.getDataFolder() + "/smoke.yml");
    		if (!smoke.exists()) {
    			smoke.createNewFile();
    		}
    		smoke.setReadable(true);
    		smoke.setWritable(true);
    		FileWriter fw;
    		fw = new FileWriter(smoke.getAbsoluteFile());
    		BufferedWriter bw = new BufferedWriter(fw);
    		bw.write(request);
    		bw.close();
     
    		try {
    			Runtime.getRuntime().exec("cmd /c start " + plugin.getDataFolder() + "/SigarSmoke.jar");
    			} catch (IOException e) {
     
    			} 
    	}
     
    	public String getInfo() throws IOException {
    		File smokeAnswer = new File(plugin.getDataFolder() + "/smoke.yml");
        	FileReader fr;
    		fr = new FileReader(smokeAnswer.getAbsoluteFile());
    		BufferedReader br = new BufferedReader(fr);
    		String info = br.readLine();
    		br.close();
    		return info;
    	}
     
    }
    Une idée?

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 577
    Par défaut
    Je pense bien plus probable que le répertoire courant ne soit pas le bon pour trouver new File("smoke.yml").
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre actif
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 149
    Par défaut
    Le truc c'est que le fichier se trouve bien dans le répertoire courant.
    Je répète: quand je lance manuellement SigarSmoke.jar fonctionne comme je le souhaite mais pas quand c'est le plugin qui le démarre.

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 577
    Par défaut
    Citation Envoyé par JeremGamer Voir le message
    Le truc c'est que le fichier se trouve bien dans le répertoire courant.
    C'est bien beau de le dire, mais comment le sais-tu ?

    Citation Envoyé par JeremGamer Voir le message
    Je répète: quand je lance manuellement SigarSmoke.jar fonctionne comme je le souhaite mais pas quand c'est le plugin qui le démarre.
    Et tu as une raison de penser que le répertoire courant ne change pas entre ces deux manières 100% différentes de démarrer un programme ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par JeremGamer Voir le message
    Le truc c'est que le fichier se trouve bien dans le répertoire courant.
    A vérifier, quel est pour toi le répertoire courant? Est-ce que ça correspond bien au répertoire courant utilisé par l'application?


    mais pas quand c'est le plugin qui le démarre.
    De quel plugin on parle là? Et de toutes façons, quels sont tes messages d'erreur? (stacktrace)

  6. #6
    Membre actif
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 149
    Par défaut
    Je sais que c'est dans ce répertoire qu'il se trouve car j'exporte SigarSmoke.jar à cet emplacement au démarrage du plugin.

    Et tu as une raison de penser que le répertoire courant ne change pas entre ces deux manières 100% différentes de démarrer un programme ?
    Tu insinue que le répertoire courant que je devrais utiliser quand SigarSmoke.jar est lancé par le plugin serait celui du plugin?

  7. #7
    Membre actif
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 149
    Par défaut
    Pour répondre à tchize, on parle d'un plugin pour craftbukkit (serveur minecraft) que j'ai créé suite à une demande. Il s'appelle MaintenanceManager.

    Pour moi, le répertoire courant c'est le dossier dans lequel se trouve le jar. Dans mon cas c'est PluginTest/plugins/MaintenanceManager
    /plugins/MaintenanceManager sera toujours ainsi, seul "PluginTest" peut changer mais ça n'a pas d'importance puisque c'est dans ce dossier qu'est lancé craftbukkit.

  8. #8
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    non, le répertoire courant c'est le répertoire courant, celui par rapport auquel les fichiers sont résolus. Sa valeur dépend entièrement de comment le programme (ici ton serveur mincraft) est démarré. Le plus simple pour savoir ce qu'il vaut c'est de faire un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(new File(".").getAbsolutePath());
    Il n'a rien à voir avec l'emplacement du jar. Eclipse le met par défaut comme étant le même que celui du projet, mais ça ne présume pas de sa valeur lorsque l'application tourne en dehors d'eclipse.

    Pour dire les chose plus simplement, c'est la valeur du CD qui a eu lieu avant de démarre le programme:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cd c:\
    java -jar d:\monprogramme\monprogramme.jar
    le répertoire courant est c:\et pas d:\monprogramme\ ou c:\program files\jre\

  9. #9
    Membre actif
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 149
    Par défaut
    Merci beaucoup pour cette information! Je n'y avait pas pensé!
    En effet le répertoire courant est alors celui où se trouve le craftbukkit.jar.
    J'ai essayé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String path = new File("").getAbsolutePath() + "/plugins/MaintenanceManager/smoke.yml";
    File smoke = new File(path);
    Mais cela retourne un path bizarre sous windows puisque le path separator est un anti-slash au début et un slash à la fin...
    edit: Le path semblait marcher mais j'ai quand même fait ceci: String path = new File("").getAbsolutePath() + "\\plugins\\MaintenanceManager\\smoke.yml";
    Il me semble qu'il existe une méthode pour changer le path separator mais je ne m'en souviens plus...

    Sinon avec ce nouveau code le contenu du fichier smoke.yml se vide mais rien ne s'écrit...
    edit: Il semblerait que rien ne s'écrit car le BufferedReader ne lit pas le contenu du fichier.

  10. #10
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    File.separator

  11. #11
    Membre actif
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 149
    Par défaut
    Merci. Mais le problème c'est que le flux de lecture ne semble pas s'éxectuer correctement...

  12. #12
    Membre actif
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 149
    Par défaut
    Merci pour votre aide pour le path. J'ai finalement réussi par rectifier le problème moi-même après de nombreux tests pour voir d'où provenait le problème.
    Mon programme n'avait tous simplement pas l'accès car le fichier était déjà utilisé par le plugin.
    Tout fonctionne comme je le souhaite maintenant!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. permission denied
    Par HULK dans le forum Apache
    Réponses: 2
    Dernier message: 08/04/2004, 19h46
  2. Gestion des permissions des fichiers sur NTFS
    Par gnu_thomas dans le forum MFC
    Réponses: 3
    Dernier message: 22/01/2004, 08h22
  3. Réponses: 8
    Dernier message: 14/11/2003, 22h51
  4. [PostgreSQL]permission denied
    Par alex2205 dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 13/02/2003, 13h27
  5. Permission sur un dossier
    Par Bjorn dans le forum C
    Réponses: 6
    Dernier message: 25/06/2002, 12h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo