Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    957

    Redirezione output

    Ciao a tutti,
    Ho scoperto che facendo:
    java MyClass > text.log 2> errors.log
    mi escono tutti gli output....
    la mia domanda è se è possibile mettere in append la scrittua, ovvero che ad ogni avvio non sovrascrivesse quello ha scritto prima.

    possibile?

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,327
    Puoi utilizzare la il doppio maggiore per andare in append
    codice:
    java MyClass >> text.log 2>> errors.log
    oppure puoi fare in modo che l'output del tuo programma vada già di per se dentro ad un file, redirigendo l'output della classe System su un file:
    codice:
    PrintStream ps = new PrintStream( new FileOutputStream("errors.log", true) );
    System.setErr( ps );
    In questo modo tutto ciò che viene mandato in output tramite lo standard error (trace di eccezioni, ecc) viene buttato sul file in append (se il file esiste già va in append).

    Lo stesso puoi fare per l'output con System.out
    codice:
    PrintStream ps = new PrintStream( new FileOutputStream("text.log", true) );
    System.setOut( ps );
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    957
    Ciao, grazie mille di queste dritte! Era proprio quello che cercavo.
    Ma dimmi un po', con setErr e setOut valgono per tutte le classi?
    Cioè se in una classe imposto un out, e poi dentro a questa classe parte un'altra classe con un output, dove va? segue l'ultimo setOut impostato dalla classe padre oppure per ogni classe devo fare setOut?

    Grazie

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,327
    Dato che la classe System è statica (e pure i suoi metodi setErr() e setOut()) tutte le classi che fanno uso dei suoi metodi utilizzeranno, per forza di cose, le ultime impostazioni applicate.

    Quindi, se tu nella MainClass della tua applicazione setti degli output diversi, tutte le classi che la tua applicazione usa avranno lo stesso comportamento utilizzando i metodi di System.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da GoldEmish
    Ciao, grazie mille di queste dritte! Era proprio quello che cercavo.
    Ma dimmi un po', con setErr e setOut valgono per tutte le classi?
    Cioè se in una classe imposto un out, e poi dentro a questa classe parte un'altra classe con un output, dove va? segue l'ultimo setOut impostato dalla classe padre oppure per ogni classe devo fare setOut?
    System.setOut/setErr riassegnano lo standard output/error (cioè System.out o System.err che sono "globali" nella JVM).

    Pertanto una volta riassegnati, qualunque successive System.out.XXX o System.err.XXX vanno a finire dove sono state riassegnate!!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    957
    grazie mille!

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    957
    mi permetterei di chiedervi un'altra cosa...
    Ho scritto questa classe:
    codice:
    public class LogOutput extends PrintStream{
    	public void println(String str){
    		Calendar cal=new GregorianCalendar();
    		String out="";
    		out+="*";
    		out+=cal.get(Calendar.YEAR)+"/"+cal.get(Calendar.MONTH)+"/"+cal.get(Calendar.DAY_OF_MONTH)+" "+cal.get(Calendar.HOUR_OF_DAY)+"."+cal.get(Calendar.MINUTE)+":"+cal.get(Calendar.SECOND);
    		out+="*\t";
    		super.println(out+str);
    	}
    }
    e nella classe principale ho inserito:
    codice:
    LogOutput ps = new LogOutput( new FileOutputStream("errors.log", true) );
    			System.setErr( ps );
    Perchè non funziona? Mi torna un errore di compilazione:

    .\LogOutput.java:5: cannot find symbol
    symbol : constructor PrintStream()
    location: class java.io.PrintStream
    public class LogOutput extends PrintStream{

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,327
    La classe PrintStream non ha un costruttore vuoto.
    Non vediamo il costruttore della tua classe LogOutput, ma evidentemente non richiami con super() il costruttore di PrintStream passandogli il FileOutputStream.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    957
    si è vero, era per questo... però in certi casi ho visto costruttori non passati quando si estende una classe, forse funzioan solo con costruttori vuoti?

  10. #10
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,327
    Originariamente inviato da GoldEmish
    si è vero, era per questo... però in certi casi ho visto costruttori non passati quando si estende una classe, forse funzioan solo con costruttori vuoti?
    Se la classe base prevede un costruttore vuoto, l'utilizzo di super() è facoltativo. O meglio, è implicito. Ad esempio, se la classe Base ha un costruttore vuoto, questi due costruttori sono identici:
    codice:
    class Derivata extends Base {
       public Derivata() {
          ...
       }
    }
    
    e
    
    class Derivata extends Base {
       public Derivata() {
          super();
          ...
       }
    }
    Il problema nasce quando la classe base pretende dei parametri (cioè quando la classe base non prevede un costruttore vuoto). In questo caso devi passare i parameteri al costruttore della classe base, che altrimenti non potrebbe essere allocata. E' proprio il caso di PrintStream.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.