フォルダーに大きなテキスト ファイルがありassets
、ファイルの次の行を正常に読み取るボタンがあります。ただし、ユーザーが別のボタンをクリックした場合に備えて、前の行を読みたいと思います。
ファイル全体をメモリに読み込むことはできません。ファイル行には番号が付けられていません。
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;
}
前の 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 を引いた行に移動します。おそらく重い操作になりますが、ニーズには合っています。
編集:上記のいずれも機能しない場合は、ファイルを後方に読み込む方法もあります。この方法では、前方に反復することで前の行を見つけることができます。単なる代替アイデアですが、実装するのは簡単ではありません。
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();
}
}