BufferedReader br = new BufferedReader(new FileReader("shark-data.txt"));
String fileRead = br.readLine();
PrintStream out = new PrintStream(new FileOutputStream("results.txt"));
System.setOut(out);

Le code fonctionne, il crée un nouveau fichier texte et met ma sortie de la console dans le fichier texte. Le problème est que rien n'apparaît sur ma console. Comment puis-je réparer ça?

3
User786 26 nov. 2017 à 22:01

3 réponses

Meilleure réponse

Vous devez d'abord créer une classe dans laquelle vous héritez de l'interface OutputStream pour implémenter le modèle d'adaptateur (je ne sais pas encore si c'est l'adaptateur)

Alors vous pouvez utiliser cette classe comme ci-dessous

PRINCIPAL

        PrintStream finalStream;
        TreeOutputStream tos;
        PrintStream out;

        out = new PrintStream("logs.txt");

        tos = new TreeOutputStream();
        tos.add(out);
        tos.add(System.out);
        finalStream = new PrintStream(tos);
        System.setOut(finalStream);

TreeOutputStream

public class TreeOutputStream extends OutputStream{

private final List<OutputStream> streams;

public void add(OutputStream os){
    streams.add(os);
}

public void remove(OutputStream os){
    streams.remove(os);
}

public TreeOutputStream() {
    streams = new ArrayList<>();
}

@Override
public void write(int i) throws IOException {
    streams.stream().forEach(strm->{
        try {
            strm.write(i);
        } catch (IOException ex) {
            Logger.getLogger(TreeOutputStream.class.getName()).log(Level.SEVERE, null, ex);
        }
    });
}

}

Que se passe-t-il que votre flux sortant boucle sur tous les flux appelant leur méthode d'écriture

1
Mohammed Housseyn Taleb 26 nov. 2017 à 19:09

Avant d'exécuter System.setOut enregistrer la console standart,

Standard PrintStream = System.out;

Pour imprimer à nouveau sur la console, vous devez passer à la console standard en utilisant ci-dessous, que Vous pouvez imprimer sur la console.

System.setOut (standard); System.out.println ("Bonjour!");

1
engKocer 26 nov. 2017 à 19:22

Vous pouvez utiliser TeeOutputStream d'Apache commons-io pour diviser le flux en deux: https://commons.apache.org/proper/commons-io/javadocs/api-2.5/org/apache/commons/io/output/ TeeOutputStream.html

OutputStream fos = new FileOutputStream("results.txt");
OutputStream consoleOut = System.out;
PrintStream newOut = new PrintStream(new TeeOutputStream(consoleOut, fos));
System.setOut(newOut);

Cela créera une écriture PrintStream à la fois dans l'original System.out (c'est-à-dire dans la console) et dans votre fichier.

Dans Maven, voici l'extrait de dépendance que vous pouvez utiliser pour ajouter commons-io à votre projet:

    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.6</version>
    </dependency>
2
Roman Puchkovskiy 26 nov. 2017 à 19:08
47499875