Şimdiye kadar verilen tüm cevaplar, dosyayı satır satır okumak, satırı a olarak almak String
ve ardındanString
.
Bunun anlaşılması en kolay yaklaşım olduğu konusunda hiçbir şüphe yok ve dosya oldukça kısaysa (örneğin on binlerce satır), verimlilik açısından da kabul edilebilir olacaktır. Ancak dosya uzunsa , bunu yapmanın iki nedenden dolayı çok verimsiz bir yoludur:
- Her karakter iki kez işlenir, bir kez
String
ve biri işlerken olmak .
- Dosyada çok sayıda satır varsa çöp toplayıcı arkadaşınız olmayacaktır.
String
Her satır için yeni bir tane oluşturuyorsunuz ve bir sonraki satıra geçtiğinizde onu atıyorsunuz . Çöp toplayıcı eninde sonunda artık istemediğiniz tüm bu String
nesneleri elden çıkarmak zorunda kalacaktır . Birinin arkanızı temizlemesi gerek.
Hızı önemsiyorsanız, bir veri bloğunu okumaktan ve onu satır satır yerine bayt olarak işlemekten çok daha iyi olursunuz. Bir sayının sonuna her geldiğinizde, onu oluşturduğunuz yere eklersiniz List
.
Şöyle bir şey çıkacak:
private List<Integer> readIntegers(File file) throws IOException {
List<Integer> result = new ArrayList<>();
RandomAccessFile raf = new RandomAccessFile(file, "r");
byte buf[] = new byte[16 * 1024];
final FileChannel ch = raf.getChannel();
int fileLength = (int) ch.size();
final MappedByteBuffer mb = ch.map(FileChannel.MapMode.READ_ONLY, 0,
fileLength);
int acc = 0;
while (mb.hasRemaining()) {
int len = Math.min(mb.remaining(), buf.length);
mb.get(buf, 0, len);
for (int i = 0; i < len; i++)
if ((buf[i] >= 48) && (buf[i] <= 57))
acc = acc * 10 + buf[i] - 48;
else {
result.add(acc);
acc = 0;
}
}
ch.close();
raf.close();
return result;
}
Yukarıdaki kod, bunun ASCII olduğunu (diğer kodlamalar için kolayca ayarlanabilse de) ve rakam olmayan herhangi bir şeyin (özellikle boşluk veya satırsonu) rakamlar arasındaki sınırı temsil ettiğini varsayar. Ayrıca, dosyanın rakamsız bir şekilde sona erdiğini varsayar (pratikte, son satır bir satırsonu ile biter), ancak yine de, olmadığı durumla başa çıkmak için ince ayar yapılabilir.
Bu var çok çok daha hızlı hepsinden daha String
da bu soruya cevap olarak verilen tabanlı yaklaşımlar. Bu soruda çok benzer bir konunun detaylı bir araştırması var . Çok iş parçacıklı çizgiden aşağı inmek istiyorsanız, onu daha da geliştirme olasılığının olduğunu göreceksiniz.