Est-il possible d'écrire une console sortie correcte et portable « Bonjour tout le monde » en JAVA?

Guenther Brunthaler:

Je suis nouveau à Java et ne pouvait pas trouver encore un moyen d'écrire un « Bonjour tout le monde » -Demande qui fonctionne correctement sans aucun changement sur toutes les plateformes et détecte et gère les erreurs de sortie.

Je en particulier, comme le port du programme C portable suivant à JAVA:

"Makefile":

.POSIX:

TARGETS = hello

.PHONY: all clean

all: $(TARGETS)

clean:
    -rm $(TARGETS)

"Bonjour c":

#include <stdio.h>
#include <stdlib.h>

int main(void) {
   if (puts("Hello, world!") >= 0 && fflush(0) == 0) return EXIT_SUCCESS;
   (void)fputs("An output error occurred.\n", stderr);
   return EXIT_FAILURE;
}

Ce programme est destiné à fonctionner comme ceci:

$ make
c99 -O    hello.c   -o hello

$ ./hello
Hello, world!

$ ./hello > /dev/full
An output error occurred.

Malheureusement, je ne suis pas encore en mesure de mettre en œuvre le même en JAVA.

Ni System.out.println () ni System.out.flush () semblent vérifier les erreurs d'E / S, ou peut-être j'étais tout simplement pas en mesure de les attraper.

Je l'ai déjà essayé d'attraper des exceptions de type IOException, mais le compilateur me dit que

error: exception IOException is never thrown in body of corresponding try statement

c'est donc évidemment pas la bonne façon de le faire.

Mais même si je pouvais trouver un moyen de détecter les erreurs de sortie, je ne savais toujours pas la moindre idée ce que le code à utiliser la sortie portably, parce que Java ne semble pas définir quelque chose qui correspond à la EXIT_FAILURE de C.

Je trouve cela difficile à croire, étant donné que JAVA est toujours salué comme un système très portable pour le développement d'applications.

Il serait tout à fait choquant que la mise en œuvre correcte et portable « Bonjour tout le monde », même un simple, déjà dépassé les capacités de cette « écriture une fois, exécuter partout » plate-forme.

Alors, aide-moi s'il vous plaît la création d'une implémentation JAVA qui se comporte exactement comme la version C et est encore portable.

Merci à khelwood et d'autres, je réussi à créer la suite de l'application JAVA qui fonctionne le mieux à ce jour:

public class HelloWorld {
   private static class OutputError extends java.io.IOException { }

   private static void println(String s) throws OutputError {
      System.out.println(s);
      if (System.out.checkError()) throw new OutputError();
   }

   private static void flush() throws OutputError {
      System.out.flush();
      if (System.out.checkError()) throw new OutputError();
   }

   private static int getExitFailureCode() {
      try {
         return (new java.lang.ProcessBuilder("/bin/false")).start().waitFor();
      } catch (Exception dummy) {
         return 99;
      }
   }

   public static void main(String[] args) {
      try {
         println("Hello, world!");
         flush();
      } catch (OutputError dummy) {
         System.err.println("An output error occurred.");
         System.exit(getExitFailureCode());
      }
   }
}

Cependant, ce n'est pas vraiment portable, car il ne fonctionnera de manière fiable sur les systèmes POSIX qui fournissent un utilitaire « false ».

Dans le cas contraire, il reviendra au code de retour arbitraire de 99, ce qui est évidemment dangereux, car une plate-forme pourrait, par exemple, définir toutes les valeurs négatives que les codes de défaillance et toutes les autres valeurs que les codes de réussite.

de Kelv de d:

System.outest un PrintStream.

Les documents pour PrintStreamdire:

Contrairement à d' autres flux de sortie, un PrintStreamthrows jamais une IOException; au contraire, des situations exceptionnelles simplement définir un indicateur interne qui peut être testé par la checkErrorméthode.

Vous pouvez vérifier System.out.checkError()pour voir si une erreur est survenue.

Si vous voulez que votre programme pour sortir avec un statut différent de zéro, vous pouvez utiliser System.exit.

Par exemple,

if (System.out.checkError()) {
    System.err.println("An output error occurred.");
    System.exit(-1);
}

Voir aussi est - il pour remplacer EXIT_SUCCESS et EXIT_FAILURE en Java?

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=201589&siteId=1
conseillé
Classement