2012-05-02 26 views
6

Tôi đang cố gắng nhận một tệp văn bản lớn làm đầu vào và muốn chuyển đổi một đoạn chuỗi bằng một chuỗi khác. Tôi hoàn toàn nhầm lẫn làm thế nào để làm điều đó, nó hoạt động tốt nếu tôi chuyển đổi toàn bộ inputstream như là một chuỗi mà tôi không muốn như một số nội dung bị mất. bất cứ ai có thể xin vui lòng giúp đỡ làm thế nào để làm điều đó ?? ví dụ: nếu tôi có tệp có nội dung "Đây là chuỗi thử nghiệm cần được sửa đổi". Tôi muốn chấp nhận chuỗi này làm luồng đầu vào và muốn sửa đổi nội dung thành "Đây là chuỗi kiểm tra được sửa đổi", (bằng cách thay thế 'cần phải' bằng).thay thế một đoạn chuỗi từ luồng đầu vào

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 


    } 

Trong này tôi muốn đầu ra như sau: Đây là chuỗi thử nghiệm được sửa đổi

Cám ơn bạn trước.

+0

Tôi muốn đọc những dòng đầu vào trong dòng (throuh một BufferedReader) và thực hiện thay thế trên toàn bộ dòng trước khi gửi đến đầu ra. Cách thanh lịch hơn, phân lớp WholeLineChangerInputStream của tôi từ BufferedReader, ghi đè lên phương thức readLine() (áp dụng thay thế) và sử dụng^^ – BigMike

+0

Về cơ bản bạn cần điều này: http://tutorials.jenkov.com/java-howto/replace-strings- in-stream-arrays-files.html và sau đó áp dụng nó vào một input2 – bvdb

Trả lời

2

Tôi có thể hiểu bạn sai, nhưng tôi nghĩ bạn nên xây dựng một máy xếp chồng. Tôi có nghĩa là bạn có thể sử dụng một ngăn xếp chuỗi nhỏ để thu thập văn bản và kiểm tra tình trạng thay thế.

Nếu chỉ thu thập được chồng đã không phù hợp với điều kiện của bạn, chỉ cần tuôn ra ngăn xếp để đầu ra và thu thập nó một lần nữa.

Nếu ngăn xếp của bạn tương tự với điều kiện, hãy tiếp tục thu thập nó.

Nếu ngăn xếp của bạn khớp với điều kiện của bạn, hãy sửa đổi và tuôn ra ngăn xếp đã sửa đổi thành đầu ra.

+0

+1. Tôi thích các khái niệm ngăn xếp – BigMike

+0

cảm ơn cho đề nghị của bạn .. Tôi sẽ cố gắng và cập nhật mã của tôi tôi đặt .. – ranjan

+1

Tôi tìm thấy một cái gì đó tương tự và sẵn sàng để sử dụng (làm việc cho tôi, yay!) Http://tech.joshuacummings.com/ 2012/02/search-and-replace-input-stream.html –

4

Nếu văn bản phải được thay đổi sẽ luôn luôn phù hợp trong một dòng logic, như tôi đã nói trong bình luận, tôi muốn đi với dòng đơn giản Reading (nếu applyable) sử dụng một cái gì đó như:

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

Tuy nhiên tôi đã luôn luôn muốn sử dụng thừa kế vì vậy tôi muốn xác định điều này một nơi nào đó:

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

Và sử dụng MyReader thay thế BufferedReader giữ thay thế ẩn bên trong readLine phương pháp.

Ưu điểm: logic thay thế nằm trong một Trình đọc được chỉ định, mã khá chuẩn. Nhược điểm: nó ẩn logic thay cho người gọi (đôi khi đây cũng là một chuyên gia, vẫn nó phụ thuộc vào trường hợp sử dụng)

HTH

+0

cảm ơn nó đã giúp .. nhưng vấn đề là khi tôi có một chuỗi với một số phần trong dòng trước và một số phần trong dòng tiếp theo .. Tôi phải đối mặt với một vấn đề với mô hình phù hợp .. Tôi đang cố gắng giải quyết nó ra .. – ranjan

+0

trong trường hợp đó, tốt hơn sử dụng máy stack theo đề nghị của Nikolay. Tôi muốn giữ nó nhúng trong một InputStream tùy chỉnh (hoặc BufferedReader). Có thể là một chút triky để viết, nhưng sẽ bao gồm 99% các trường hợp. – BigMike

+0

@BigMike giải pháp đó chỉ bao gồm phương thức 'readLine()', vẫn còn 'read()' và 'read (char [])' vẫn tồn tại với nguồn dữ liệu chưa được thay thế.Tôi đang tìm giải pháp đúng nhưng ngay cả Apache Commons IO không có thực hiện chính xác (https://issues.apache.org/jira/browse/IO-218 abadonned vào năm 2013). –

Các vấn đề liên quan