3

フォルダーに大きなテキスト ファイルがありassets、ファイルの次の行を正常に読み取るボタンがあります。ただし、ユーザーが別のボタンをクリックした場合に備えて、前の行を読みたいと思います。

ファイル全体をメモリに読み込むことはできません。ファイル行には番号が付けられていません。

4

3 に答える 3

2
InputStream is = getResources().getAssets().open("abc.txt");
String result= convertStreamToString(is);

public static String convertStreamToString(InputStream is)
            throws IOException {
            Writer writer = new StringWriter();
        char[] buffer = new char[2048];
        try {
            Reader reader = new BufferedReader(new InputStreamReader(is,
                    "UTF-8"));
            int n;
            while ((n = reader.read(buffer)) != -1) {
                writer.write(buffer, 0, n);
            }
        } finally {
            is.close();
        }
        String text = writer.toString();
        return text;
}
于 2013-01-03T07:01:08.313 に答える
0

前の 1 行だけを追跡する必要がある場合は、次のようにして、反復ごとに前の行を追跡できます (リーダーを使用していると仮定しました。この例ではBufferedReader)。

String previous = null, line; // null means no previous line
while (line = yourReader.readLine()) {
    // Do whatever with line
    // If you need the previous line, use:
    if (yourCondition) {
        if (previous != null) {
            // Do whatever with previous
        } else {
            // No previous line
        }
    }
    previous = line;
}

前の複数の行を追跡する必要がある場合は、それを配列に展開する必要があるかもしれませんが、ファイルが大きい場合は、全体を読み取る場合と同じくらい大量のメモリを保持することになります。ファイル、最後の行に到達したら。

Java や Android では、前の行を読み取る簡単な方法はなく、次の行のみを読み取ります (ファイル I/O では、後方より前方の方が簡単なため)。

私が考えることができる 1 つの代替手段は、ライン マーカー (0 から開始) を保持し、ラインを進むにつれてそれを増やすことです。次に、逆方向に移動するには、その行から 1 を引いた行に到達するまで、ファイルを 1 行ずつ読み取る必要があります。前に戻る必要がある場合は、その新しい行から 1 を引いた行に移動します。おそらく重い操作になりますが、ニーズには合っています。

編集:上記のいずれも機能しない場合は、ファイルを後方に読み込む方法もあります。この方法では、前方に反復することで前の行を見つけることができます。単なる代替アイデアですが、実装するのは簡単ではありません。

于 2013-01-03T07:14:16.927 に答える
-1
public class LoadFromAltLoc extends Activity {  

    //a handle to the application's resources  
    private Resources resources;  
    //a string to output the contents of the files to LogCat  
    private String output;  

    /** Called when the activity is first created. */  
    @Override  
    public void onCreate(Bundle savedInstanceState)  
    {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  

        //get the application's resources  
        resources = getResources();  

        try  
        {  
            //Load the file from the raw folder - don't forget to OMIT the extension  
            output = LoadFile("from_raw_folder", true);  
            //output to LogCat  
            Log.i("test", output);  
        }  
        catch (IOException e)  
        {  
            //display an error toast message  
            Toast toast = Toast.makeText(this, "File: not found!", Toast.LENGTH_LONG);  
            toast.show();  
        }  

        try  
        {  
            //Load the file from assets folder - don't forget to INCLUDE the extension  
            output = LoadFile("from_assets_folder.pdf", false);  
            //output to LogCat  
            Log.i("test", output);  
        }  
        catch (IOException e)  
        {  
            //display an error toast message  
            Toast toast = Toast.makeText(this, "File: not found!", Toast.LENGTH_LONG);  
            toast.show();  
        }  
    }  

    //load file from apps res/raw folder or Assets folder  
    public String LoadFile(String fileName, boolean loadFromRawFolder) throws IOException  
    {  
        //Create a InputStream to read the file into  
        InputStream iS;  

        if (loadFromRawFolder)  
        {  
            //get the resource id from the file name  
            int rID = resources.getIdentifier("fortyonepost.com.lfas:raw/"+fileName, null, null);  
            //get the file as a stream  
            iS = resources.openRawResource(rID);  
        }  
        else  
        {  
            //get the file as a stream  
            iS = resources.getAssets().open(fileName);  
        }  

        //create a buffer that has the same size as the InputStream  
        byte[] buffer = new byte[iS.available()];  
        //read the text file as a stream, into the buffer  
        iS.read(buffer);  
        //create a output stream to write the buffer into  
        ByteArrayOutputStream oS = new ByteArrayOutputStream();  
        //write this buffer to the output stream  
        oS.write(buffer);  
        //Close the Input and Output streams  
        oS.close();  
        iS.close();  

        //return the output stream as a String  
        return oS.toString();  
    }  
} 
于 2013-01-03T07:02:51.003 に答える