2012-03-01 45 views
5

Có cách nào để tôi có thể sao chép StringBuilder không? Tôi đọc các tập tin bằng bit sau đó chuyển đổi các bit thành ký tự ASCII sau đó tôi thu thập ký tự thành Trình xây dựng chuỗi và khi tôi có ví dụ 8 ký tự, tôi đặt đối tượng String Builder đó vào Danh sách mảng. Sau đó, tôi làm sạch nó và một lần nữa làm như vậy. Tuy nhiên tôi không thể tạo trình tạo chuỗi mới vì bộ nhớ và tôi không thể thực hiện các thay đổi đối với Trình tạo chuỗi đó bởi vì trong Danh sách mảng cũng thay đổi trình xây dựng đó.Cách sao chép() StringBuilder

Vì vậy, tôi nghĩ rằng tôi phải sao chép String Builder và đặt nó vào Danh sách mảng. Chỉ có một vấn đề String Builder không có bản sao(). Vậy lựa chọn thay thế của tôi là gì?

Có thể ai đó có thể đưa ra một số ý tưởng về cách thức gọn gàng để làm điều này xem xét về hiệu suất và bộ nhớ.

ArrayList characters = new ArrayList(); int counter = 0;

StringBuilder sb = new StringBuilder(blockSize-1); 

while (mbb.hasRemaining()) { 

char charAscii = (char)mbb.get(); 


    counter++; 
    charCounter++; 

    if (counter == blockSize){ 

     sb.append(charAscii); 
     characters.add(sb);//sb.toString() 
     sb.delete(0, sb.length()); 
     counter = 0; 

    }else{ 

     sb.append(charAscii); 

    } 

if(!mbb.hasRemaining()){ 
    characters.add(sb); 
} 



} 
fc.close(); 
return characters; 
+2

"tôi không thể tạo xây dựng chuỗi mới vì bộ nhớ" - một StringBuilder nhân bản sẽ sử dụng một lượng tương tự như bộ nhớ, vậy làm thế nào sẽ điều này giúp bạn? – DNA

+2

'StringBuilder mới (oldbuilder.toString())' là cách đơn giản nhất để sao chép một StringBuilder. Bạn đã không thực sự giải thích những gì bạn đang cố gắng để đạt được, vì vậy bạn có thể chỉ cần lưu trữ các String từ StringBuilder để thay thế. – DNA

+0

Yap hiểu rằng nó sẽ không giúp được gì. Vì vậy, tôi ra khỏi các tùy chọn bởi vì ký tự này.add (StringBuilder mới (sb)); đưa ra ngoại lệ java outOffMemory – Streetboy

Trả lời

14

Nếu bạn không có bộ nhớ để tạo ra một mới StringBuilder, sau đó bạn không có bộ nhớ để tạo ra một mới StringBuilder, và nhân bản sẽ không thay đổi điều đó. Cách thực sự duy nhất để sao chép StringBuildernew StringBuilder(myBuilder) hoặc tương đương.

Nếu bạn đang nhận được OutOfMemoryException, bạn sẽ cần phải có nhiều bộ nhớ hơn hoặc tìm một số cách khác để giảm mức tiêu thụ bộ nhớ.

1

Bạn có thể xóa StringBuilder đối tượng bằng cách:

1.

sb.delete(0, sb.length()) 

2.

sb = null; 
sb = new StringBuilder(); 

Đối với hiệu suất, 1. là lựa chọn tốt hơn. Nhưng bạn không thể sao chép nó. Để biết thêm về bản sao thấy

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