好的;
我正在尝试根据列表选择读取一些文件(来自资产)。下面的代码打开文件,即使是阿拉伯字母也能很好地检索内容。唯一的问题是文本是一个非常长的字符串,没有任何空格或换行符。例如,文件内容是: 第一行 第二行 第三行
输出将是:firstlinesecondlinethirdline
代码是:
public void onItemSelected(AdapterView parent, View v,
int position, long id) {
String filename = getFileName(position);
InputStreamReader ls = null;
try {
AssetManager am = getResources().getAssets();
ls = new InputStreamReader(am.open(filename), "UTF-8");
StringBuffer sb = new StringBuffer();
while( true ) {
int c = ls.read();
if( c < 0 )
break;
if( c >= 32 )
sb.append( (char)c );
selection.setText(new String(sb));
}
} catch(IOException e) {
Log.e(LOG_APP_TAG, e.getMessage());
} finally {
if (ls != null) {
try {
ls.close();
} catch (IOException e) {
Log.e(LOG_APP_TAG, e.getMessage());
}
}
}
}
答案 0 :(得分:1)
您的代码有几个问题:
你可以拥有像
这样的东西boolean finished = true;
while( !finished )
{
if( c < 0 )
finished = true;
}//while
这种循环在我的脑海中读起来更加愉快,并且不会“震惊”,因为当你阅读它时没有“无限循环”。
此外,您应该考虑使用BufferedReader来读取文本文件。这个类将为您提供字符行,这将提供更简单的代码:
BufferedReader bfr = new BufferedReader( new InputStreamReader(am.open(filename), "UTF-8"); );
StringBuffer sb = new StringBuffer();
String read = "";
while( (read=bfr.readLine()) != null )
sb.apennd( read );
BuffereReader将使用缓冲区一次从文件中读取多个字节,效率更高。
顺便说一句,你尝试/ catch / finally结构已经做得很好。
此致 斯特凡
答案 1 :(得分:0)
新行的字符值为10(&lt; 32),因此未附加,因此请考虑将所有字符附加&gt; 0值,因此更改为
if( c <= 0 )
break;
else
sb.append( (char)c );