Je ne connais pas très bien Java, et j'essaie d'utiliser Java dans un projet Processing.org 3. J'ai réussi à reconstruire le problème dans un petit exemple de traitement appelé testprocjavapath
- et je poste un script bash
(appelé testProcJavaLoadpath.sh
) qui reconstruit les exemples de fichiers de projet à la fin de ce post, et exécute le projet une fois. Les fichiers de projet testprocjavapath
ressemblent à ceci:Processing.org 3 et le chargement des fichiers de propriétés Java?
~/sketchbook/testprocjavapath
├── testprocjavapath.pde
├── myprops.properties
└── MyJavaClass.java
Lors de l'exécution du script, je reçois ceci:
$ bash testProcJavaLoadpath.sh
...
There was an exception myprops.properties: java.lang.NullPointerException : null
The properties file content is 'null';
Finished.
Debugging dans le traitement 3 GUI IDE, cette erreur se produit exactement sur la ligne properties.load(in);
:
... parce que la ligne InputStream in = MyJavaClass.class.getResourceAsStream(inFileName);
a échoué, et par conséquent, in
est un pointeur null.
Ce que je comprends - ce que je ne comprends pas: comment puis-je charger un, par exemple, un fichier texte .properties
, dans le même répertoire que le fichier croquis traitement .pde
et le fichier .java
(qui est, ce particulier dossier de croquis)?
Pour autant que je déduis Java getResourceAsStream()
est effectivement utilisé pour charger à partir d'une application Java emballé sous forme de fichier .jar
- donc peut-il travailler pour la lecture des fichiers à partir du disque dur, qui ne sont pas encore emballés comme .jar
fichiers?
Si non - j'ai aussi essayé de le faire:
InputStream in = new FileInputStream(new File(PROPERTIES_FILENAME));
... mais cela ne fonctionne pas non plus (in
est à nouveau null
).
Alors, quelle commande puis-je utiliser dans le fichier .java
pour charger le fichier myprops.properties
? Et si je devais finir par emballer toute l'application de traitement sous la forme d'un fichier .jar
(je ne suis pas sûr que Processing puisse le faire, je ne l'ai pas encore cherché), devrais-je changer cette commande?
Voici le testProcJavaLoadpath.sh
fichier (assurez-vous de changer PROCBINPATH
à votre chemin d'installation de traitement):
PROCSKETCHDIR="~/sketchbook"
PROCSKETCHDIR="${PROCSKETCHDIR/#\~/$HOME}" # expand home dir ~
echo "$PROCSKETCHDIR"
PROCBINPATH="/PATH/TO/processing-3.3.6" # path/location of Processing executable `processing-java`
MYSKETCH="testprocjavapath"
MYSKETCHDIR="$PROCSKETCHDIR/$MYSKETCH"
# reconstruct folder:
rm -rfv "$MYSKETCHDIR"
mkdir -v "$MYSKETCHDIR"
echo "generating $MYSKETCHDIR/$MYSKETCH.pde"
cat > "$MYSKETCHDIR/$MYSKETCH.pde" <<'EOF'
void setup() {
size(640, 360); // Size should be the first statement
MyJavaClass myjc = new MyJavaClass();
String thefilecontents = myjc.GetPropsFileContent();
System.out.format("The properties file content is '%s';%n", thefilecontents);
}
EOF
echo "generating $MYSKETCHDIR/myprops.properties"
cat > "$MYSKETCHDIR/myprops.properties" <<'EOF'
teststr=HelloWorld
EOF
echo "generating $MYSKETCHDIR/MyJavaClass.java"
cat > "$MYSKETCHDIR/MyJavaClass.java" <<'EOF'
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import java.io.FileInputStream;
import java.io.File;
import java.io.ByteArrayOutputStream;
public class MyJavaClass {
private static final String PROPERTIES_FILENAME = "myprops.properties";
/**
* add a constructor
*/
public static void MyJavaClass() {
}
public static String GetPropsFileContent() {
String myret = null;
myret = readgetFileContent(PROPERTIES_FILENAME);
return myret;
}
public static String readgetFileContent(String inFileName) {
String result = null;
Properties properties = new Properties();
try {
InputStream in = MyJavaClass.class.getResourceAsStream(inFileName);
properties.load(in);
ByteArrayOutputStream resultbaos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int length;
while ((length = in.read(buffer)) != -1) {
resultbaos.write(buffer, 0, length);
}
result = resultbaos.toString();
} catch (IOException e) {
System.err.println("There was an error reading " + inFileName + ": " + e.getCause()
+ " : " + e.getMessage());
} catch (Exception e) {
System.err.println("There was an exception " + inFileName + ": " + e
+ " : " + e.getMessage());
}
return result;
}
}
EOF
# run once:
"$PROCBINPATH"/processing-java --sketch="$MYSKETCHDIR" --run
Je suis assez confus au sujet de ce que vous essayez de faire. Pourriez-vous peut-être essayer d'afficher un plus petit [mcve]? Quelque chose d'aussi simple que 'println (nouveau fichier (" test.txt "). GetAbsolutePath())' irait assez loin pour aider à comprendre ce que vous attendez de ce qui se passe réellement. Aussi, comment compilez-vous et exécutez-vous cela? –