2012-05-02 10 views
6

Próbuję odebrać ogromny plik tekstowy jako strumień wejściowy i chcę przekonwertować segment łańcuchowy na inny ciąg. Jestem ściśle zdezorientowany, jak to zrobić, działa dobrze, jeśli konwertuję cały inputstream jako ciąg, którego nie chcę, ponieważ część zawartości jest tracona. Czy ktoś może pomóc, jak to zrobić? np. jeśli mam plik, który ma zawartość "To jest ciąg testowy, który należy zmodyfikować". Chcę zaakceptować ten ciąg jako strumień wejściowy i chcę zmodyfikować zawartość na "To jest ciąg testowy, który został zmodyfikowany" (zastępując "ma być" znakiem "is").Zamień fragment łańcucha ze strumienia wejściowego

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 


    } 

W tym chcę wyjście jako: Jest to ciąg testów, który jest modyfikowany

Dziękując z góry.

+0

czytałem strumień wejściowy w liniach (throuh BufferedReader) i wykonać podstawienie na całej linii przed wysłaniem do wyjścia. Bardziej elegancki sposób, podklasy mój WholeLineChangerInputStream z BufferedReader, zastąpić metodę readLine() (stosując podstawienie) i użyć, że ^^ – BigMike

+0

Zasadniczo potrzebujesz: http://tutorials.jenkov.com/java-howto/replace-strings- in-stream-arrays-files.html, a następnie zastosować go do strumienia wejściowego – bvdb

Odpowiedz

2

Być może zrozumiałem, że się mylisz, ale myślę, że powinieneś zbudować maszynę stosu. Chodzi o to, że możesz użyć małego stosu napisów, aby zebrać tekst i sprawdzić stan wymiany.

Jeśli już zebrany stos nie jest już dopasowany do twojego stanu, po prostu przepłucz stos, aby go wydrukować i odbierz ponownie.

Jeśli Twój stos jest podobny pod warunkiem, kontynuuj odbiór.

Jeśli twój stos jest zgodny z twoim stanem, dokonaj modyfikacji i zmodyfikuj zmodyfikowany stos do wyjścia.

+0

+1. Podoba mi się koncepcja stosu – BigMike

+0

dzięki za sugestię .. Postaram się zaktualizować mój kod, który umieściłem .. – ranjan

+1

Znalazłem coś podobnego i gotowego do użycia (działa dla mnie, yay!) Http://tech.joshuacummings.com/ 2012/02/search-and-replace-input-stream.html –

4

Jeżeli tekst ma być zmieniony zawsze mieszczą się w jednej linii logicznej, jak podano w komentarzu, bym iść z prostych linii czytania (jeśli applyable) używając coś takiego:

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 
     } 
    } 
} 

Jednak ja” Wcześniej zawsze lubią używać dziedziczenia tak bym zdefiniować to gdzieś:

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; 
    } 
} 

I używać myReader zamiast standardowego BufferedReader utrzymując podstawienie ukryty wewnątrz metody readline.

Zalety: logika podstawiania jest w określonym czytniku, kod jest dość standardowy. Wady: ukrywa logiki substytucyjnego do rozmówcy (czasami jest to również pro, nadal zależy od przypadku użytkowania)

HTH

+0

dzięki to pomógł .. ale problem jest, gdy mam ciąg z jakąś częścią w poprzednim wierszu i jakąś część w następnej linii .. Mam problem z wzorcem dopasowywanie .. Próbuję go rozwiązać .. – ranjan

+0

w takim przypadku lepiej korzystaj z maszyny stosowej zgodnie z sugestią Nikolaya. Pozostawiłbym go osadzony w niestandardowym InputStream (lub BufferedReader). Może być trochę triky do pisania, ale obejmie 99% przypadków. – BigMike

+0

@BigMike to rozwiązanie obejmuje tylko metodę 'readLine()', nadal 'read()' i 'read (char [])' pozostają z niezamkniętym źródłem danych.Szukam właściwego rozwiązania, ale nawet Apache Commons IO nie ma poprawnej implementacji (https://issues.apache.org/jira/browse/IO-218 abadonned w 2013). –

Powiązane problemy