2010-12-16 31 views
20

W wielu przykładach opisano, że można użyć scala.io.Source odczytać cały plik tak:jaki jest właściwy sposób korzystania z scala.io.Source?

val str = scala.io.Source.fromFile("test.txt").mkString() 

Ale zamknięcie strumienia bazowego nie jest wymieniona. Dlaczego Scala nie zapewnia wygodnego sposobu na zrobienie tego, na przykład z klauzulą ​​w Pythonie? Wygląda na użyteczne, ale nie trudne.

Czy istnieje inny lepszy sposób, aby to zrobić bezpiecznie w Scala, to znaczy przeczytać cały plik?

+0

Czy to prawo do korzystania Source sposób nie zamykający podstawowy strumień? – woods

+4

Jeśli czytasz kod scala.io.Source, okaże się, że w rzeczywistości pozostawia on pracę związaną z zamykaniem strumienia bazowego. Niesamowity! – woods

Odpowiedz

18

Biblioteka Scala z io została wykonana po to, aby zapewnić wsparcie dla ograniczonych potrzeb. Starano się dostarczyć dobrze przemyślaną bibliotekę io do Scali, która jest obecnie hostowana pod adresem assembla, z repozytorium github.

Jeśli zamierzasz używać I/O do czegoś więcej niż czytania okazyjnego pliku na temat procesów krótkotrwałych, lepiej albo użyć bibliotek Java, albo spójrz na obsługę We/Wy dostępną obecnie w kompilatorze (które będą wymagały dystrybucji scala-compiler.jar z aplikacją).

Co do automatycznego zarządzania zasobami, spójrz na this question lub na this library (która jest opisana w zaakceptowanej odpowiedzi na to pytanie).

+1

Czy nadal zaleca się, aby nie używać scala.io od 2016 roku? – knub

+3

@knub Nie patrzę na Scalę 2.12, żeby zobaczyć, czy coś tam się poprawiło, ale poza tym, tak, stoję według tego samego zalecenia. –

20

Dla kompletności

val testTxtSource = scala.io.Source.fromFile("test.txt") 
val str = testTxtSource.mkString() 
testTxtSource.close() 

powinien dostać rzeczy zrobić.

+5

Czy nie powinno to być w bloku 'try' i' close() 'w bloku' finally'? – robinst

+1

@robinst To byłaby dobra rzecz i zgadzam się z odpowiedzią Daniela (tzn. W ogóle nie używam scala.io.Source). Przydała się jednak w naszym Dojos, gdzie nie piszemy kodu produkcyjnego. Ponadto, użyłbym biblioteki ARM (zamiast 'try'' catch'), ponieważ 'close()' może również rzucić wyjątek i uważam, że jest niezręczne mieć 'try'' catch' 'finally' wewnątrz' finally '. – matyjas

2

Polecam using the using, co sprawia, że ​​neater kod i bardziej niezawodne

using(Source.fromFile("test.txt")){ _.mkString()} 
Powiązane problemy