Java - получающий System.err.println или получающий PrintStream

Хорошо, благодаря Найлу Кехо, я заметил, что у него есть две безопасные области в раскадровке. Поэтому я пошел дальше и перестроил весь вид с нуля. Это было не весело, но после правильной установки ограничений все стало работать как надо.

Похоже, что была проблема, когда я изначально собирал все это вместе, и ограничения, скорее всего, были запутаны, увидев две безопасные зоны. Очень раздражает, но я рад, что смог исправить это. Спасибо всем за помощь!

12
задан Marty Pitt 19 March 2012 в 22:27
поделиться

5 ответов

PipedOutputStream pipeOut = new PipedOutputStream();
PipedInputStream pipeIn = new PipedInputStream(pipeOut);
System.setOut(new PrintStream(pipeOut));
// now read from pipeIn
8
ответ дан 2 December 2019 в 05:55
поделиться
import java.io.*;

public class Test {
    public static void main(String[] args) {
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream("errors.txt");
        } catch(IOException ioe) {
            System.err.println("redirection not possible: "+ioe);
            System.exit(-1);
        }
        PrintStream ps = new PrintStream(fos);
        System.setErr(ps);
        System.err.println("goes into file");
    }
}
8
ответ дан 2 December 2019 в 05:55
поделиться

Вы ищете что-то вроде этого?

    OutputStream redirect = System.err;
    PrintStream myPrintStream = new PrintStream(redirect);
    myPrintStream.println("hello redirect");

Если можно передать myPrintStream к приложению сторонних производителей можно перенаправить его где угодно, Вы хотите.

3
ответ дан 2 December 2019 в 05:55
поделиться

Можно создать PrintStream вокруг любого другого OutputStream.

Самый простой способ создать тот, который переходит к буферу в памяти, был бы:

PrintStream p = new PrintStream( new ByteArrayOutputStream() )

Затем Вы могли считать и сбросить содержание массива байтов в любых точках, которые Вы любите.

Другая возможность состояла бы в том, чтобы использовать каналы.

InputStream third_party_output = new PipedInputStream();
PrintStream p = new PrintStream( new PipedOutputStream( third_party_output ) );

Затем Вы могли читать из third_party_output потока для записания текста библиотекой.

5
ответ дан 2 December 2019 в 05:55
поделиться

Я использую следующий класс для входа System.out и System.err к ряду вращающихся файлов (где xxx-001.log нов). Это содержит, некоторые звонят в служебные методы, которые необходимо будет реализовать, прежде чем это скомпилирует - они должны быть очевидными.

import java.io.*;
import java.lang.reflect.*;

public class LoggerOutputStream
extends OutputStream
{

// *****************************************************************************
// INSTANCE PROPERTIES
// *****************************************************************************

private FileOutputStream                log=null;                               // the base output stream
private String                          fnmBase,fnmExt;                         // filename base, file extension
private int                             fnmCount,fnmLast;                       // count for filename index, last filename used
private int                             logSize,totWritten;                     // max log size, current number of bytes written

// *****************************************************************************
// INSTANCE CONSTRUCTORS/INIT/CLOSE/FINALIZE
// *****************************************************************************

public LoggerOutputStream(String baseFilename) throws IOException {
    this(baseFilename,".log",2,1024000);
    }

public LoggerOutputStream(String baseFilename, String extension) throws IOException {
    this(baseFilename,extension,2,1024000);
    }

public LoggerOutputStream(String baseFilename, String extension, int numberOfFiles, int maxFileSize) throws IOException {
    fnmBase=baseFilename;
    if(Character.isLetterOrDigit(fnmBase.charAt(fnmBase.length()-1))) { fnmBase=(fnmBase+"-"); }
    fnmExt=extension;
    if(!fnmExt.startsWith(".")) { fnmExt=('.'+fnmExt); }
    fnmCount=numberOfFiles;
    logSize=maxFileSize;
    if(fnmCount>MAXLOGS) { fnmCount=MAXLOGS; }

    fnmLast=0;
    for(int xa=1; xa<=MAXLOGS; xa++) {
        if(!new File(constructFilename(xa)).exists()) {
            while((--xa)>fnmCount) { IoUtil.deleteFile(constructFilename(xa)); }
            fnmLast=xa;
            break;
            }
        }
    log=null;

    openFile(false);

    if(numberOfFiles>MAXLOGS) { System.out.println("** Log File Count Limited To "+MAXLOGS); }
    }

public void close() throws IOException {
    close(false);
    }

private void openFile(boolean ovrflw) throws IOException {
    close(true);

    if     (fnmLast< fnmCount) { fnmLast++;                                      }
    else if(fnmLast==fnmCount) { IoUtil.deleteFile(constructFilename(fnmCount)); }
    for(int xa=fnmLast; xa>0; xa--) { IoUtil.renameFile(constructFilename(xa-1),constructFilename(xa)); }
    log=new FileOutputStream(constructFilename(1));
    totWritten=0;
    }

private String constructFilename(int index) {
    return constructFilename(fnmBase,index,fnmExt);
    }

private synchronized void close(boolean ovrflw) throws IOException {
    if(log!=null) {
        log.flush();
        log.close();
        log=null;
        }
    }

// *****************************************************************************
// INSTANCE METHODS - ACCESSORS
// *****************************************************************************

public String getFilename() {
    return constructFilename(1);
    }

public String getFilename(int idx) {
    return constructFilename(idx);
    }

public synchronized void cycleLogFile() throws IOException {
    openFile(true);
    }

// *****************************************************************************
// INSTANCE METHODS
// *****************************************************************************

public synchronized void flush() throws IOException {
    if(log!=null) {
        log.flush();
        }
    }

public synchronized void write(int val) throws IOException {
    if(log!=null) {
        log.write(val);
        totWritten++;
        if(val=='\n') {
            if(totWritten>logSize) { openFile(true); }
            else                   { log.flush();    }
            }
        }
    }

public synchronized void write(byte[] bytes) throws IOException {
    if(log!=null) {
        log.write(bytes);
        totWritten+=bytes.length;
        if(bytes.length>0 && bytes[bytes.length-1]=='\n') {
            if(totWritten>logSize) { openFile(true); }
            else                   { log.flush();    }
            }
        }
    }

public synchronized void write(byte[] bytes, int str, int len) throws IOException {
    if(log!=null) {
        log.write(bytes,str,len);
        totWritten+=len;
        if(bytes.length>(str+len-1) && bytes[str+len-1]=='\n') {
            if(totWritten>logSize) { openFile(true); }
            else                   { log.flush();    }
            }
        }
    }

// *****************************************************************************
// STATIC PROPERTIES
// *****************************************************************************

static public final int                 MAXLOGS=999;                            // maximum log files allowed

// *****************************************************************************
// STATIC METHODS
// *****************************************************************************

static public String constructFilename(String bas, int idx, String ext) {
    if(!bas.endsWith("-") && !bas.endsWith("_") && !bas.endsWith(".")) { bas=(bas+"-"); }
    if(!ext.startsWith(".")                                          ) { ext=('.'+ext); }
    return (bas+TextUtil.raZeros(idx,3)+ext);
    }

} /* END PUBLIC CLASS */
2
ответ дан 2 December 2019 в 05:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: