¿Por qué lo haces por bloques?
Abre el fichero una sola vez, lee línea a línea e inserta cada línea.
Si quieres más eficiencia, no uses hibernate, usa directamente JDBC con PreparedStatement y Batch para inserciones
http://chuwiki.chuidiang.org/index.p...Insert_en_Java
Otra forma eficiente (más posiblemente) es usar el comando sql copy de postgresql
http://www.postgresql.org/docs/curre.../sql-copy.html que es capaz de leer e insertar un fichero que tenga un formato concreto. Quizás puedas hacer que tu programa java lea el fichero y lo convierta al formato que necesita postgresql para luego usar este comando copy.
Si tienes que hacerlo por bloques como muestras en el código y las líneas son de longitud fija, puedes usar la clase RandomAccessFile, que te permite abrir el fichero en un byte concreto, sin necesidad de leer todo secuencialmente.
Si las líneas no son de la misma longitud y tienes que hacerlo por bloques, no tienes opciones, salvo que sepas seguro que te van a llamar a loadData() consecutivamente, de forma que entre llamada y llamada podrías guardarte en qué byte del fichero estás y usar entonces RandomAccessFile para la siguiente llamada yendo directamente a ese byte.
Se bueno.