2014-02-23 54 views
-1

我試圖獲取它,所以我的應用程序可以讀取我的文本文件中由單詞分隔輸入的單詞,並將它們從字符串數組中退出。我的應用程序啓動,然後給我一個空白頁面,這是非常令人沮喪。這裏是我的代碼:如何從文本文件中將文本轉換爲字符串?

import java.io.BufferedReader; 

import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.util.ArrayList; 
import java.util.LinkedList; 
import java.util.List; 
import java.util.Timer; 
import java.util.Vector; 

import android.os.Bundle; 
import android.app.Activity; 

import android.widget.TextView; 

public class MainActivity extends Activity { 


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

     TextView helloTxt= (TextView)findViewById(R.id.hellotxt); 


     ArrayList<String> list = new ArrayList<String>(); 
     try { 

      InputStream is = getResources().openRawResource(R.raw.test); 


      if (is != null) { 

       InputStreamReader isr = new InputStreamReader(is); 
       BufferedReader buffythevampireslayer = new BufferedReader(isr); 

       String line; 


       do { 
       line = buffythevampireslayer.readLine(); 
       list.add(line); 

       } while (line != null); 

      } 
      is.close(); 
      } catch (Exception ex) { 

      } 
     String[] wordsArray=new String[list.size()]; 
     list.toArray(wordsArray); 
     Thread timer=new Thread(); { 
     for (int c=0;c<list.size();c++){ 
      helloTxt.setText(wordsArray[c]); 
      System.out.println("TEXTSET"); 
      try { 
       Thread.sleep(5000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
     }; 
     timer.start(); 
     } 
    } 

我真的很感激,如果有人能幫助,非常感謝!

編輯:::: 在這篇文章中獲得一些幫助後,我現在有工作的應用程序!非常感謝!下面是新的代碼:

import java.io.BufferedReader; 

import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.UnsupportedEncodingException; 
import java.util.ArrayList; 
import java.util.LinkedList; 
import java.util.List; 
import java.util.Timer; 
import java.util.Vector; 

import android.os.AsyncTask; 
import android.os.Bundle; 
import android.os.SystemClock; 
import android.app.Activity; 
import android.content.res.AssetManager; 

import android.widget.TextView; 
public class MainActivity extends Activity { 


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

      ReadAndUpdateTextTask readAndUpdateTextTask = new ReadAndUpdateTextTask(); 
      readAndUpdateTextTask.execute(); 
     } 

     class ReadAndUpdateTextTask extends AsyncTask<Void, String, String> { 

public  String currentString = ""; 
String line=""; 
InputStream isr; 

     @Override 
     protected void onPreExecute() { 
      isr = getResources().openRawResource(R.raw.test); 
     } 
     @Override 

     protected String doInBackground(Void... params) { 
      try { 

       BufferedReader reader = new BufferedReader(new InputStreamReader(isr)); 
       while ((line = reader.readLine())!= null) { 
        currentString += line + "\n"; 
        publishProgress(currentString); 

        // I don't think you really need this but you want a sleep for 5000 ms 
        SystemClock.sleep(5000); 
       } 
       isr.close(); 
      } catch (Exception ex) { 
      } 

      return currentString; 
     } 

     @Override 
     protected void onProgressUpdate(String... currentString) { 
      TextView helloTxt= (TextView)findViewById(R.id.hellotxt); 
      helloTxt.setText(currentString[0]); 
     } 
     @Override 
     protected void onPostExecute(String result) { 
      TextView helloTxt= (TextView)findViewById(R.id.hellotxt); 
      helloTxt.setText(result); 
     } 
     } 
    } 
+0

代替helloTxt.setText(wordsArray [C]);嘗試helloTxt.append(wordsArray [c]); – JRowan

+0

感謝您的嘗試,但沒有一個響應工作:( – user3344504

+0

你有一個catch事件,不會做任何事情 - 我會建議你至少放出一個日誌,以便知道是否有任何異常提出。 ,檢查logcat是否有任何異常? – brianestey

回答

0

我不知道這是否會解決任何事情,但你可以嘗試宣告你的列表,如圖in Oracle's documentation。我會稍微看一下。

List<String> list = new ArrayList<String>(); 
+0

感謝您的嘗試,但沒有任何迴應工作:( – user3344504

0

如果它不是一個錯字,你的問題就在這裏:

String[] wordsArray=new String[list.size()]; 
list.toArray(wordsArray); 

它應該是:

String[] wordsArray = list.toArray(new String[0]); 

否則陣列用空值填充

+0

感謝您的嘗試,但沒有答覆工作:( – user3344504

0

你有空白屏幕,因爲你在主UI線程中有睡眠。請閱讀AsyncTask中的文件併發布其過程。

onCreate方法應該是這樣的:

public class MainActivity extends Activity { 


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

     ReadAndUpdateTextTask readAndUpdateTextTask = new ReadAndUpdateTextTask(); 
     readAndUpdateTextTask.execute(); 
    } 

    class ReadAndUpdateTextTask extends AsyncTask<Void, String, String> { 


    InputStream isr; 

    @Override 
    protected void onPreExecute() { 
     isr = getResources().openRawResource(R.raw.test); 
    } 
    @Override 
    protected String doInBackground(Void... params) { 
     try { 
      String currentString = ""; 
      BufferedReader reader = new BufferedReader(new InputStreamReader(isr)); 
      while ((line = reader.readLine())!= null) { 
       currentString += line + "\n"; 
       publishProgress(currentString); 

       // I don't think you really need this but you want a sleep for 5000 ms 
       SystemClock.sleep(5000); 
      } 
      isr.close(); 
     } catch (Exception ex) { 
     } 

     return currentString; 
    } 

    @Override 
    protected void onProgressUpdate(String... currentString) { 
     TextView helloTxt= (TextView)findViewById(R.id.hellotxt); 
     helloTxt.setText(currentString[0]); 
    } 
    @Override 
    protected void onPostExecute(String result) { 
     TextView helloTxt= (TextView)findViewById(R.id.hellotxt); 
     helloTxt.setText(result); 
    } 
    } 
} 
+0

感謝您的幫助,但在ReadAndUpdateTextTask類中,getResources和findVIewById方法是仍然得到編譯錯誤,它說:「方法getResources()未定義爲ReadAndUpdateTextTask」和兩個findViewById它說同樣的事情,但findViewById,而不是getResources()任何想法? – user3344504

+0

我編輯了我的答案。找不到錯誤在您的活動中定義了ReadAndUpdateTextTask。 – Devrim

+0

這解決了這些問題,但現在它說BufferedReader只能讀取讀取器,而輸入流不是讀取器。我嘗試將InputStream更改爲InputStreamReader,但這也沒有解決問題。我也在onProgressUpdate以及currentString返回的setText中獲取錯誤(但是,如果BufferedReader問題已修復,我認爲這兩個都將被修復)。再次感謝! – user3344504

0
  • 首先,你需要存儲您的文本文件中的資產文件夾
  • ,那麼你需要調用AssetManager獲得資產您的資產文件夾

    AssetManager assetManager = getAssets(); 
    InputStream inputStream = null; 
    
  • 用try塊包圍這些語句,在ca SE文件未在規定路徑中找到

    inputStream = assetManager.open("texts/sample.txt"); // path is relative to the assets folder 
        ByteArrayOutputStream bytesOutputStream = new ByteArrayOutputStream(); 
        byte[] bytes = new byte[4096]; 
        int length = 0; 
    
  • 讀取的字節並將其在輸出流寫入

    while((length = inputStream.read(bytes)) > 0) 
         bytesOutputStream.write(bytes,0,length); 
    
  • 創建一個新的String,使用構造與byteOutputStream

  • 使用UTF8進行編碼(假設不會有任何中文,日文等字符)
  • 有關的更多詳細信息,請參閱此處

    String yourString = new String(bytesOutputStream.toByteArray(), "UTF8"); 
    
  • 爪哇String類有一個方法「分裂」,這需要一個正則表達式作爲參數

  • 它將該字符串,並將其存儲到一個陣列中的單個元件,每次遇到一個新的線
  • 你的情況
  • ,使用 '\ n',這代表了新的生產線

    String[] yourStringArray = yourString.split("\n"); 
    
  • 環繞一切與一個try-catch子句(IOException異常),這爲t hrown萬一文件中沒有找到

  • 現在可以使用yourStringArray作爲

    textView.setText(yourStringArray[index]); 
    
+0

這仍然不適用於我,它在開始時崩潰而沒有5000毫秒的睡眠,但5000毫秒等待5000毫秒,然後崩潰。 – user3344504

相關問題