В вашем примере с Java не создается массив с верхней границей его размера, он создает массив с точно указанным размером, который фиксируется на протяжении всего срока службы. В этом отношении массивы Scala идентичны. Дополнительно это:
val st: Array[Byte] = Array()
выделяет массив байтов ("байт" в Java) длиной 0.
Что касается чтения файла в массив, если вам необходимо обработать весь файл, затем попытаться выделить необходимое пространство, а в случае сбоя вы не сможете продолжить.