2015-05-23 18 views
5

Mam klasy QuoteBank który trzeba czytać w pliku txt z skanerem ale to daje mi plik nie został znaleziony wyjątkiemCzytanie z pliku tekstowego w Android Studio Java

plik java jest app/src/main/java/nate.marxBros/QuoteBank.java

plik

txt jest w aPP/src/main/aktywa/Quotes.txt

kod jest

File file = new File("assets/QuotesMonkeyBusiness.txt"); 
    Scanner input = null; 
    try { 
     input = new Scanner(file); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 

Czy to powinno działać tak samo, jak każdy inny program java? ale daje pliku nie znaleziono wyjątek

Próbowałem wielu rzeczy na tej stronie jak Android Studio Reading from Raw Resource Text File ale ta metoda nie działa, ponieważ nie wiem jak przekazać w kontekście

dzięki za wszelką pomoc

zaktualizowany kod

public class QuoteBank { 
private ArrayList<ArrayList<QuoteBank>> bank; 
private Context mContext; 
private ArrayList<QuoteQuestion> monkeyBuisness; 


public QuoteBank(Context context){ 
    mContext = context; 
    InputStream is = null; 
    try { 
     is = mContext.getAssets().open("QuotesMonkeyBusiness.txt"); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    ArrayList<QuoteQuestion> monkeyBuisness = parseFileToBank(is); 
} 

główną działalność

public class MainActivity extends ActionBarActivity { 
QuoteBank b = new QuoteBank(MainActivity.this); 

Odpowiedz

4

Powinieneś mieć MainActivity.java lub jakiś Activity który tworzy instancję QuoteBank. co chcesz konstruktor podjąć w parametr kontekstu:

Konfiguracja prywatnej zmiennej w QuoteBank.java:

private Context mContext; 

Instalator się konstruktora:

public QuoteBank(Context context) { 
    this.mContext = context; 
} 

Następnie oznacz ją w swojej działalności,

QuoteBank quoteBank = new QuoteBank(context); 

Zmienna kontekstowa może być wywołana w ciągu działanie według polecenia this lub Activity.this, w którym zastępujesz "Aktywność" nazwą swojej działalności. Ewentualnie, jeśli jesteś w obrębie fragmentu, możesz uzyskać kontekst z obiektu View w swojej metodzie onCreateView(...). Zwykle dzwoniąc pod numer view.getContext().

Teraz w swojej metodzie, gdzie jesteś chwytając aktywów, można skorzystać z kontekstu:

InputStream is = mContext.getAssets().open("QuotesMonkeyBusiness.txt") 

Ponieważ używasz android studio można utworzyć metodę main(String[] args) { ... } i uruchomić go lub po prostu uruchomić emulator i użyj go Log.d(...), aby wyświetlić wyjście z pliku.

Alternatywnie można użyć następującej metody, a także:

AssetManager am = mContext.getAssets(); 
InputStream is = am.open("QuotesMonkeyBusiness.txt"); 

Może też sensu mieć QuoteBank jako singleton instancji, które mogłyby zwiększyć efektywność chociaż wszystko zależy od wymagań, może coś takiego:

List<String> allTextLines = QuoteBank.readFromFile(context, path_to_file); 

a potem w swojej klasie QuoteBank.java można mieć metodę tak:

/** 
* Created by AndyRoid on 5/23/15. 
*/ 
public class QuoteBank { 

private Context mContext; 

public QuoteBank(Context context) { 
    this.mContext = context; 
} 

public List<String> readLine(String path) { 
    List<String> mLines = new ArrayList<>(); 

    AssetManager am = mContext.getAssets(); 

    try { 
     InputStream is = am.open(path); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
     String line; 

     while ((line = reader.readLine()) != null) 
      mLines.add(line); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    return mLines; 
} 

}

a następnie w moim MainActivity.java klasie mam następujące:

/** 
* Created by AndyRoid on 5/23/15. 
*/ 
public class MainActivity extends AppCompatActivity { 

public static final String TAG = MainActivity.class.getSimpleName(); 

public static final String mPath = "adventur.txt"; 
private QuoteBank mQuoteBank; 
private List<String> mLines; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mQuoteBank = new QuoteBank(this); 
    mLines = mQuoteBank.readLine(mPath); 
    for (String string : mLines) 
     Log.d(TAG, string); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 
} 

To jest mój struktury projektu:

enter image description here

Jest to plik adventur.txt Pobrałem od A losowa baza danych:

file

To moje wyjście dziennika:

enter image description here


UPDATE: Dlaczego nie należy używać skanera w Androidzie

Z oficjalnej dokumentacji:

http://developer.android.com/reference/java/util/Scanner.html

Ta klasa nie jest tak przydatna, jak mogłoby się wydawać. Jest bardzo nieefektywny w komunikacji między maszynami; powinieneś używać JSON, protobufs, a nawet XML do tego. Bardzo proste zastosowania mogą uciec z splitem (String). Aby uzyskać dane wejściowe od ludzi, użycie wyrażeń regularnych specyficznych dla regionu powoduje, że jest on nie tylko drogi, ale również nieco nieprzewidywalny. Klasa skanera nie jest wątkowa.


UWAGA KOŃCOWA:

bardzo proponuję zapoznać się z dokumentacją na wszystkich obiektach wykorzystywanych tu więc można zrozumieć ten proces.

+0

Dzięki część o co konstruktor pomaga. Nadal dostaję wyjątek wskaźnika pustego w 'AssetManager am = mContext.getAssets();' mam kontekst zadeklarowany jak 'Activity context = new Activity();' w głównej działalności i tuż przed tą linią mam 'this.mContext = context ; ' –

+0

i czy nie ma sposobu, aby to zrobić po prostu wprowadzając względną lokalizację pliku do klasy pliku? Czuję, że to będzie łatwiejsze? Nie jestem pewien, czy inputStream będzie działał ze skanerem. Metody extine() –

+0

Zamiast ** Activity context = new Activity(); ** aby pobrać kontekst, użyj polecenia ** this ** lub ** YOURACTIVITYNAME.this ** . Powinno to wyglądać tak: ** QuoteBank qb = new QuoteBank (this); ** lub ** QuoteBank qb = new QuoteBank (YOURACTIVITYNAME.this); ** Zakładając, że nie poszliście na singletową trasę. – AndyRoid

1

Context.getResources().getAssets().open("QuotesMonkeyBusiness.txt"); zwraca InputStream resztę można go stamtąd

Edytuj

bo nie wiem jak przekazać w kontekście

Context jest wszędzie faktycznie jeśli ciebie mieć View można uzyskać Context, jeśli masz Activity możesz dostać Context więc znaleźć to

Nadzieja pomaga

Powiązane problemy