2012-05-02 4 views
6

Sto provando a ricevere un enorme file di testo come inputstream e voglio convertire un segmento di stringa con un'altra stringa. Sono strettamente confuso su come farlo, funziona bene se converto l'intero inputstream come una stringa che non voglio in quanto alcuni dei contenuti sono persi. qualcuno può per favore aiutare come farlo ?? ad es. se ho un file che ha il contenuto "Questa è la stringa di test che deve essere modificata". Voglio accettare questa stringa come flusso di input e voglio modificare il contenuto in "Questa è la stringa di test che viene modificata", (sostituendo "deve essere" con is).sostituisce un segmento di stringa dal flusso di input

public static void main(String[] args) { 
     String string = "This is the test string which needs to be modified"; 
     InputStream inpstr = new ByteArrayInputStream(string.getBytes()); 
      //Code to do 


    } 

In questo voglio l'uscita come: Questa è la stringa di testo che viene modificato

Grazie in anticipo.

+0

avevo letto il flusso di input in linee (throuh un BufferedReader) ed eseguire sostituzione su un'intera riga prima di inviare all'output. Più elegante, sottoclasse il mio WholeLineChangerInputStream da BufferedReader, sovrascrivi il metodo readLine() (applicando la sostituzione) e usalo ^^ – BigMike

+0

Fondamentalmente hai bisogno di questo: http://tutorials.jenkov.com/java-howto/replace-strings- in-streams-array-files.html e quindi applicarlo a un inputstream – bvdb

risposta

2

Forse ho capito male, ma penso che dovresti costruire una macchina stack. Voglio dire che puoi usare una piccola serie di corde per raccogliere il testo e verificare le condizioni di sostituzione.

Se lo stack appena raccolto non corrisponde alle condizioni, è sufficiente svuotare lo stack in uscita e raccoglierlo di nuovo.

Se il tuo stack è simile alle condizioni, continua a raccoglierlo.

Se allo stack corrisponde la condizione, apportare una modifica e svuotare lo stack modificato in uscita.

+0

+1. Mi piace il concetto di stack – BigMike

+0

grazie per il tuo suggerimento .. Proverò ad aggiornare il mio codice che ho inserito .. – ranjan

+1

Ho trovato qualcosa di simile e pronto per l'uso (funziona per me, yay!) Http://tech.joshuacummings.com/ 2012/02/search-and-replace-input-stream.html –

4

Se il testo da modificare sia sempre in forma in una linea logica, come ho detto in commento, mi piacerebbe andare con una semplice linea di lettura (se applyable) utilizzando qualcosa di simile:

public class InputReader { 
    public static void main(String[] args) throws IOException 
    { 
     String string = "This is the test string which needs to be modified"; 
     InputStream inpstr = new ByteArrayInputStream(string.getBytes()); 

     BufferedReader rdr = new BufferedReader(new InputStreamReader(inpstr)); 
     String buf = null; 
     while ((buf = rdr.readLine()) != null) { 
      // Apply regex on buf 

      // build output 
     } 
    } 
} 

Tuttavia I' ho sempre piace usare l'ereditarietà quindi mi piacerebbe definisco questo da qualche parte:

class MyReader extends BufferedReader { 
    public MyReader(Reader in) 
    { 
     super(in); 
    } 

    @Override 
    public String readLine() throws IOException { 
     String lBuf = super.readLine(); 
     // Perform matching & subst on read string 
     return lBuf; 
    } 
} 

e utilizzare MyReader al posto di BufferedReader standard di mantenere la sostituzione nascosta all'interno del metodo readLine.

Pro: la logica di sostituzione è in un Reader specificato, il codice è piuttosto standard. Contro: nasconde la logica di sostituzione al chiamante (a volte questo è anche un professionista, ancora dipende da caso di utilizzo)

HTH

+0

grazie aiutato .. ma il problema è quando ho una stringa con qualche parte nella riga precedente e qualche parte nella riga successiva .. Affronto un problema con il pattern matching .. Sto cercando di risolverlo .. – ranjan

+0

in questo caso, meglio usare lo stack machine come suggerito da Nikolay. Lo terrei incorporato in un InputStream (o BufferedReader) personalizzato. Può essere un po 'complicato da scrivere, ma coprirà il 99% dei casi. – BigMike

+0

@BigMike quella soluzione copre solo il metodo 'readLine()', ancora 'read()' e 'read (char [])' rimangono con origine dati non sostituita.Sto cercando la giusta soluzione, ma anche Apache Commons IO non ha un'implementazione corretta (https://issues.apache.org/jira/browse/IO-218 abbandona nel 2013). –