ATUM обратиться по имени
Понедельник, 17 Февраля 2014 г. 15:05 (ссылка)
package com.raidan.sandbox.readint;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.io.Reader;
import java.io.StreamTokenizer;
import java.nio.BufferUnderflowException;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel.MapMode;
/**
*
* @author raidan
*
*/
public class IntParser {
private static final int LEN = 100000000;
/**
* Чтение с помощью StringTokenizer
*
* @param filename
* @throws IOException
*/
static void readByTokenizer(String filename) throws IOException {
int count = 0;
int[] buffer = new int[LEN];
Reader reader = new FileReader(filename);
try {
StreamTokenizer streamTokenizer = new StreamTokenizer(reader);
streamTokenizer.parseNumbers();
int tokenType;
while ((tokenType = streamTokenizer.nextToken()) != StreamTokenizer.TT_EOF) {
if (tokenType == StreamTokenizer.TT_NUMBER) {
buffer[count++] = (int) streamTokenizer.nval;
}
}
} finally {
reader.close();
}
}
/**
* Чтение через InputStream
*
* @param filename
* @throws IOException
*/
static void readByInputStream(String filename) throws IOException {
int count = 0;
int[] buffer = new int[LEN];
Reader reader = new BufferedReader(new FileReader(filename), 8192 * 8);
try {
int read = -1;
StringBuilder b = new StringBuilder();
while ((read = reader.read()) != -1) {
if (read == ' ' && b.length() > 0) {
buffer[count++] = Integer.parseInt(b.toString());
b.delete(0, b.length());
} else {
b.append((char) read);
}
}
if (b.length() > 0) {
buffer[count++] = Integer.parseInt(b.toString());
}
} finally {
reader.close();
}
}
/**
* Ничего быстрее MemoryMapped файлов пока не придумали. Лишь бы памяти было
* много
*
* @param filename
* @throws IOException
*/
static void readByMemoryMappedFile(String filename) throws IOException {
int count = 0;
int[] buffer = new int[LEN];
RandomAccessFile raf = new RandomAccessFile(filename, "r");
try {
MappedByteBuffer mapFile = raf.getChannel().map(MapMode.READ_ONLY, 0, raf.length());
StringBuilder b = new StringBuilder();
try {
while (mapFile.hasRemaining()) {
byte read = mapFile.get();
if (read == ' ' && b.length() > 0) {
buffer[count++] = Integer.parseInt(b.toString());
b.delete(0, b.length());
} else {
b.append((char) read);
}
}
} catch (BufferUnderflowException e) {
// Всё, файл закончился
}
if (b.length() > 0) {
buffer[count++] = Integer.parseInt(b.toString());
}
} finally {
raf.close();
}
}
/**
* Точка входа
*
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
String filename = "file.data";
long startTime = System.currentTimeMillis();
// readByTokenizer(filename);
// readByInputStream(filename);
readByMemoryMappedFile(filename);
System.out.println("Time: " + (System.currentTimeMillis() - startTime) + " ms...");
}
}
Ответить С цитатой В цитатник