J'ai essayé d'écrire la sortie de la console dans un fichier txt en utilisant cette suggestion de code ( http://www.daniweb.com/forums/thread23883.html# ) mais je n'ai pas réussi. Qu'est-ce qui ne va pas?
try {
//create a buffered reader that connects to the console, we use it so we can read lines
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
//read a line from the console
String lineFromInput = in.readLine();
//create an print writer for writing to a file
PrintWriter out = new PrintWriter(new FileWriter("output.txt"));
//output to the file a line
out.println(lineFromInput);
//close the file (VERY IMPORTANT!)
out.close();
}
catch(IOException e1) {
System.out.println("Error during reading/writing");
}
Vous devez faire quelque chose comme ça:
PrintStream out = new PrintStream(new FileOutputStream("output.txt"));
System.setOut(out);
La deuxième déclaration est la clé. La valeur de l'attribut System.out
supposé "final" devient la valeur PrintStream fournie.
Il existe des méthodes analogues (setIn
et setErr
) pour modifier les flux d'entrée standard et d'erreur; reportez-vous aux javadocs Java.lang.System
pour plus de détails.
Une version plus générale de ce qui précède est la suivante:
PrintStream out = new PrintStream(
new FileOutputStream("output.txt", append), autoFlush);
System.setOut(out);
Si append
est true
, le flux sera ajouté à un fichier existant au lieu de le tronquer. Si autoflush
est true
, le tampon de sortie sera vidé chaque fois qu'un tableau d'octets est écrit, l'une des méthodes println
est appelée ou un \n
est écrit.
J'aimerais juste ajouter qu'il est généralement préférable d'utiliser un sous-système de journalisation tel que Log4j , Logback ou le sous-système standard Java Java.util.logging . Celles-ci permettent un contrôle de la journalisation à l'aide de fichiers de configuration d'exécution, une prise en charge de la rotation des fichiers journaux, des flux vers la journalisation du système, etc.
Sinon, si vous ne vous connectez pas, considérez soit:
out
passé en tant que paramètre plutôt que d'écrire dans System.out
.Changer System.out
peut causer de mauvaises surprises à d’autres codes de votre machine virtuelle qui ne s’attendent pas à ce que cela se produise.
Il n'est pas nécessaire d'écrire du code, juste dans cmd Sur la console, vous pouvez écrire:
javac myFile.Java
java ClassName > a.txt
Les données de sortie sont stockées dans le fichier a.txt.
pour préserver la sortie de la console, c'est-à-dire écrire dans un fichier et l'afficher également sur la console, vous pouvez utiliser une classe comme
public class TeePrintStream extends PrintStream {
private final PrintStream second;
public TeePrintStream(OutputStream main, PrintStream second) {
super(main);
this.second = second;
}
/**
* Closes the main stream.
* The second stream is just flushed but <b>not</b> closed.
* @see Java.io.PrintStream#close()
*/
@Override
public void close() {
// just for documentation
super.close();
}
@Override
public void flush() {
super.flush();
second.flush();
}
@Override
public void write(byte[] buf, int off, int len) {
super.write(buf, off, len);
second.write(buf, off, len);
}
@Override
public void write(int b) {
super.write(b);
second.write(b);
}
@Override
public void write(byte[] b) throws IOException {
super.write(b);
second.write(b);
}
}
et utilisé comme dans:
FileOutputStream file = new FileOutputStream("test.txt");
TeePrintStream tee = new TeePrintStream(file, System.out);
System.setOut(tee);
( juste une idée, pas complète )
Créez la méthode suivante:
public class Logger {
public static void log(String message) {
PrintWriter out = new PrintWriter(new FileWriter("output.txt", true), true);
out.write(message);
out.close();
}
}
(Je n'ai pas inclus le traitement approprié IO dans la classe ci-dessus et il ne compilera pas - faites-le vous-même. Pensez également à configurer le nom du fichier. Notez l'argument "true". Cela signifie que le fichier ne être recréé chaque fois que vous appelez la méthode)
Puis, au lieu de System.out.println(str)
, appelez Logger.log(str)
.
Cette approche manuelle n'est pas préférable. Utiliser un framework de journalisation - slf4j, log4j , commons-logging , et bien d’autres
Vous pouvez utiliser System.setOut () au début de votre programme pour rediriger toutes les sorties via System.out
vers votre propre PrintStream
.
Ceci est mon idée de ce que vous essayez de faire et cela fonctionne très bien:
public static void main(String[] args) throws IOException{
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter out = new BufferedWriter(new FileWriter("c://output.txt"));
try {
String inputLine = null;
do {
inputLine=in.readLine();
out.write(inputLine);
out.newLine();
} while (!inputLine.equalsIgnoreCase("eof"));
System.out.print("Write Successful");
} catch(IOException e1) {
System.out.println("Error during reading/writing");
} finally {
out.close();
in.close();
}
}
Le moyen le plus simple d'écrire la sortie de la console dans un fichier texte est
//create a file first
PrintWriter outputfile = new PrintWriter(filename);
//replace your System.out.print("your output");
outputfile.print("your output");
outputfile.close();
PrintWriter out = null;
try {
out = new PrintWriter(new FileWriter("C:\\testing.txt"));
} catch (IOException e) {
e.printStackTrace();
}
out.println("output");
out.close();
J'utilise un chemin absolu pour le FileWriter. Cela fonctionne pour moi comme un charme. Assurez-vous également que le fichier est présent à l'emplacement. Sinon, une exception FileNotFoundException sera lancée. Cette méthode ne crée pas de nouveau fichier à l'emplacement cible si le fichier n'est pas trouvé.
Pour écrire la sortie de la console dans un fichier txt
public static void main(String[] args) {
int i;
List<String> ls = new ArrayList<String>();
for (i = 1; i <= 100; i++) {
String str = null;
str = +i + ":- HOW TO WRITE A CONSOLE OUTPUT IN A TEXT FILE";
ls.add(str);
}
String listString = "";
for (String s : ls) {
listString += s + "\n";
}
FileWriter writer = null;
try {
writer = new FileWriter("final.txt");
writer.write(listString);
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
Si vous souhaitez générer le PDF plutôt que le fichier texte, vous utilisez la dépendance indiquée ci-dessous:
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.0.6</version>
</dependency>
Pour générer un PDF, utilisez ce code:
public static void main(String[] args) {
int i;
List<String> ls = new ArrayList<String>();
for (i = 1; i <= 100; i++) {
String str = null;
str = +i + ":- HOW TO WRITE A CONSOLE OUTPUT IN A PDF";
ls.add(str);
}
String listString = "";
for (String s : ls) {
listString += s + "\n";
}
Document document = new Document();
try {
PdfWriter writer1 = PdfWriter
.getInstance(
document,
new FileOutputStream(
"final_pdf.pdf"));
document.open();
document.add(new Paragraph(listString));
document.close();
writer1.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
}
}