Những người khác đã đề xuất đọc và xử lý các phần của tệp của bạn cùng một lúc. Nếu có thể, một trong những cách đó sẽ tốt hơn.
Tuy nhiên, nếu điều này là không thể và bạn có thể nạp String
ban đầu vào bộ nhớ như bạn chỉ ra nhưng sau đó phân tích cú pháp chuỗi này gây ra sự cố, bạn có thể sử dụng chất nền. Trong Java một chuỗi con bản đồ trên đầu trang của bản gốc char
mảng và chỉ mất bộ nhớ cho các cơ sở Object
và sau đó bắt đầu và chiều dài int con trỏ.
Vì vậy, khi bạn tìm thấy một phần của chuỗi mà bạn muốn giữ riêng biệt, sử dụng một cái gì đó như:
String piece = largeString.substring(foundStart, foundEnd);
Nếu bạn thay này hoặc mã mà trong nội bộ thực hiện điều này, thì việc sử dụng bộ nhớ sẽ tăng lên đáng kể :
new String(largeString.substring(foundStart, foundEnd));
Lưu ý rằng bạn phải sử dụng String.substring()
vì lý do chính vì lý do này. Bạn có thể có một chuỗi rất lớn, trong đó bạn lấy một chuỗi con và sau đó loại bỏ tham chiếu của bạn thành chuỗi gốc. Vấn đề là chuỗi con vẫn tham chiếu đến mảng char
lớn ban đầu. GC sẽ không phát hành cho đến khi chuỗi con cũng bị xóa. Trong trường hợp như thế này, sẽ hữu ích khi sử dụng new String(...)
để đảm bảo mảng lớn không sử dụng sẽ bị GC loại bỏ (đây là một trong số ít trường hợp bạn nên sử dụng new String(...)
).
Kỹ thuật khác, nếu bạn mong đợi có nhiều chuỗi nhỏ và có thể có cùng giá trị, nhưng đến từ nguồn bên ngoài (như tệp), hãy sử dụng .intern()
sau khi tạo chuỗi mới.
Lưu ý: Điều này phụ thuộc vào việc thực hiện String
mà bạn thực sự không cần phải biết, nhưng trong thực tế cho các ứng dụng lớn đôi khi bạn phải dựa vào kiến thức đó. Hãy lưu ý rằng các phiên bản Java trong tương lai có thể thay đổi điều này (mặc dù không có khả năng).
Nguồn
2010-01-28 08:23:36
Bạn không thể phân tích cú pháp tệp từng chút một với một trong các Trình đọc (ví dụ: BufferedReader)? –