Oto, co robię w ćwiczeniu polegającym na rozszerzaniu / modyfikowaniu buforowanego odczytu w celu dostosowania do twoich potrzeb
BufferedReader reader = null;
try {
reader = new BufferedReader(
new InputStreamReader(getAssets().open("filename.txt")));
// do reading, usually loop until end of file reading
String mLine;
while ((mLine = reader.readLine()) != null) {
//process line
...
}
} catch (IOException e) {
//log the exception
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
//log the exception
}
}
}
EDYCJA: Moja odpowiedź jest być może bezużyteczna, jeśli twoje pytanie dotyczy tego, jak to zrobić poza zajęciem. Jeśli twoje pytanie dotyczy po prostu sposobu odczytywania pliku z zasobu, odpowiedź jest powyżej.
AKTUALIZACJA :
Aby otworzyć plik określający typ, po prostu dodaj typ w wywołaniu InputStreamReader w następujący sposób.
BufferedReader reader = null;
try {
reader = new BufferedReader(
new InputStreamReader(getAssets().open("filename.txt"), "UTF-8"));
// do reading, usually loop until end of file reading
String mLine;
while ((mLine = reader.readLine()) != null) {
//process line
...
}
} catch (IOException e) {
//log the exception
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
//log the exception
}
}
}
EDYTOWAĆ
Jak @Stan mówi w komentarzu, kod, który podaję, nie sumuje wierszy. mLine
jest wymieniany przy każdym przejściu. Dlatego napisałem //process line
. Zakładam, że plik zawiera jakieś dane (np. Listę kontaktów) i każda linia powinna być przetwarzana osobno.
W przypadku, gdy chcesz po prostu załadować plik bez żadnego przetwarzania, będziesz musiał podsumować mLine
każdy przebieg, używając StringBuilder()
i dołączając każdy przebieg.
KOLEJNA EDYCJA
Zgodnie z komentarzem @Vincent dodałem finally
blokadę.
Należy również pamiętać, że w Javie 7 i górną można użyć try-with-resources
do używania AutoCloseable
i Closeable
wyposażony ostatniej Java.
KONTEKST
Za punkty komentarz @LunarWatcher się, że getAssets()
jest class
w context
. Tak więc, jeśli wywołujesz to poza obiektem activity
, musisz się do niego odwołać i przekazać wystąpienie kontekstu do działania.
ContextInstance.getAssets();
Jest to wyjaśnione w odpowiedzi @Maneesh. Więc jeśli jest ci to przydatne, zagłosuj za jego odpowiedzią, ponieważ to on wskazał na to.
finally {reader.close();}
.context.getAssets(.....)
działa tylko w Aktywności w innych klasach, których musisz użyć
Context
.Stwórz konstruktor dla klasy Utils, przekazując odniesienie do aktywności (brzydki sposób) lub kontekst aplikacji jako parametr do niej. Używając tego użyj getAsset () w swojej klasie Utils.
źródło
Context
.Lepiej późno niż wcale.
W niektórych okolicznościach miałem trudności z odczytaniem plików wiersz po wierszu. Poniższa metoda jest najlepsza, jaką do tej pory znalazłem i polecam ją.
Stosowanie:
String yourData = LoadData("YourDataFile.txt");
Gdzie zakłada się, że YourDataFile.txt znajduje się w aktywach /
źródło
stream.available()
.źródło
input = new BufferedReader(new InputStreamReader(fIn));
.źródło
rozwiązanie z jedną linią dla kotlin:
źródło
getAssets()
zadziała, gdy będziesz wywoływać wewnątrz klasy Activity.Jeśli wywołujesz tę metodę w klasie innej niż Activity, musisz wywołać tę metodę z Context, która jest przekazywana z klasy Activity. Poniżej znajduje się linia, przez którą można uzyskać dostęp do metody.
ContextInstance
można zaliczyć jako tę z klasy aktywności.źródło
Czytanie i pisanie plików zawsze było rozwlekłe i podatne na błędy. Unikaj tych odpowiedzi i zamiast tego użyj Okio :
źródło
IOException
blok try / catch 2) zamykanie strumieni w przypadku wyrzucenia wyjątku 3) ten kod czyta pojedynczą linię, a nie cały plik. Pod względem wydajności ta biblioteka jest zdecydowanie jedyna w swoim rodzaju, nie ma co do tego wątpliwości. Teraz powiedz mi, czy nadal powinienem unikać „tych odpowiedzi” i stosować Okio tylko do odczytu plików? Odpowiedź brzmi NIE, chyba że jest to już część Twojej aplikacji.Oto metoda odczytu pliku w zasobach:
źródło
Możesz załadować zawartość z pliku. Weź pod uwagę, że plik znajduje się w folderze zasobów.
Teraz możesz pobrać zawartość, wywołując funkcję w następujący sposób
Biorąc pod uwagę, że data.json jest przechowywana w Application \ app \ src \ main \ asset \ data.json
źródło
W MainActivity.java
Możesz także utworzyć oddzielną klasę, która wykonuje całą pracę
Moim zdaniem lepiej jest stworzyć interfejs, ale nie jest to konieczne
źródło
Jeśli używasz innej klasy niż Aktywność, możesz chcieć zrobić coś podobnego,
źródło
Korzystając z Kotlin, możesz wykonać następujące czynności, aby odczytać plik z zasobów w systemie Android:
źródło
Może za późno, ale ze względu na innych, którzy szukają brzoskwiniowych odpowiedzi:
źródło
cityfile.txt
źródło
File no longer available That file has now been permanently removed and cannot be recovered
Klasa Scanner może to uprościć.
źródło
@HpTerm odpowiedz Wersja Kotlin:
źródło
var mLine:String
powinno byćvar mLine:String?
var data: String?
powinno byćvar data = ""
zwracanym typemString
Oto sposób, aby uzyskać
InputStream
dla pliku wassets
folderze bezContext
,Activity
,Fragment
lubApplication
. To od CiebieInputStream
zależy, w jaki sposób uzyskasz dane . W innych odpowiedziach jest na to mnóstwo sugestii.Kotlin
Jawa
Wszystkie zakłady są wyłączone, jeśli
ClassLoader
w grze jest zwyczaj .źródło