【问题标题】:Android read line text fileAndroid读取行文本文件
【发布时间】:2014-10-01 14:41:08
【问题描述】:

我有一个文本文件,其中包含土耳其语中所有五个字母的单词。从那里,我想画一个随机的词。 AssetManager 丝网印刷了所有的字,但不知怎的,我一个字都没有掉。如何使用循环?

如果您能提供帮助,我会很高兴。

来源:

public class MainActivity extends Activity {

    Button degistir;
    TextView kelime;
    EditText ykelime;
    Random rnd =new Random();

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

        degistir=(Button)findViewById(R.id.btngiris);
        kelime=(TextView)findViewById(R.id.kelime);
        ykelime=(EditText)findViewById(R.id.giris);

        AssetManager assetManager = getAssets();

        // To load text file
        InputStream input;
        try {
            input = assetManager.open("5HarfliKelimeler.txt");

            int size = input.available();
            byte[] buffer = new byte[size];
            input.read(buffer);
            input.close();

            // byte buffer into a string
            String text = new String(buffer);

            int sayi=rnd.nextInt(text.length());

            kelime.setText(text);
        } 
        catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        degistir.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                kelime.setText(ykelime.getText());
                ykelime.setText(null);
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
}

【问题讨论】:

  • 您的文件存在吗?是否抛出异常?也许你可以记录一个,但是你应该阅读输入流直到它完成。
  • 我有文件,你可以把所有的字都查到5000字左右,但是我想做一个随机的字从屏幕上打印出来。

标签: android android-file android-assets


【解决方案1】:

逐行读取文件并将所有单词放入列表中。(How to read line by line | check here)

然后,为每个按钮单击指定一个随机索引。最后,使用生成的索引显示列表中的单词。 (索引范围必须从 0 到列表大小

-- 我在没有任何编辑器的情况下编辑了您的代码。 --

    public class MainActivity extends Activity {

            Button degistir;

             TextView kelime;

            EditText ykelime;
            List<String> wordList=null;

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

                degistir=(Button)findViewById(R.id.btngiris);
                kelime=(TextView)findViewById(R.id.kelime);
                ykelime=(EditText)findViewById(R.id.giris);

                AssetManager assetManager = getAssets();

                // To load text file
                InputStream input;
                try {
                    input = assetManager.open("5HarfliKelimeler.txt");
                    wordList= new ArrayList<String>();

       BufferedReader reader = new BufferedReader(new InputStreamReader(input , charset.forName("UTF-8")));

                    String line = "";



                        while ((line = reader.readLine()) != null) {
                           wordList.add(line);
                        }





                } 
                catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }


                degistir.setOnClickListener(new OnClickListener(){

                    @Override
                    public void onClick(View arg0) {
                        // TODO Auto-generated method stub
                        if(wordList!=null){
                         Random rnd =new Random();
                         Integer generatedIndex = rnd.nextInt(wordList.size());                    
                         String selectedWord=wordList.get(generatedIndex);
                         kelime.setText(selectedWord);
                         // ykelime.setText(null);
                        }
                          else{
                          //DISPLAY MSG ETC.
                         }
                    }

                });
            }
            @Override
            public boolean onCreateOptionsMenu(Menu menu) {
                getMenuInflater().inflate(R.menu.main, menu);

                return true;
            }

        }

【讨论】:

  • 谢谢 :) 在我点击按钮之前随机访问我只是做了一点改变。你太棒了:)
  • 嗯,我在EditText中输入的话如何检查ArrayList是否存在。
  • stackoverflow.com/questions/587404/… 您需要使用收藏搜索。为每个字符更改事件查找匹配项并显示它们。
  • 或者简单的for循环。性能不佳,但易于实施。
【解决方案2】:

首先,如果您的文件内容不会改变,那么您必须计算最大行数并将其写为常量:

private String getRandomLine() {
        final int FILE_MAX_LINE_INDEX = 5000;//if your file has 5000 lines, and it's content never be changed
        Random rnd = new Random();
        final int lineIndex = rnd.nextInt(FILE_MAX_LINE_INDEX);
        try {
            LineNumberReader lnr = new LineNumberReader(new InputStreamReader(getAssets().open("5HarfliKelimeler.txt")));
            String s;
            while ((s = lnr.readLine()) != null) {
                if (lnr.getLineNumber() == lineIndex) {
                    lnr.close();
                    return s;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "";
    }

或者,如果您的内容可能会更改,并且您不知道文件中有多少行:

private String getRandomLine() {
        List<String> fiveLetterWords = new ArrayList<String>(5000);
        try {
            LineNumberReader lnr = new LineNumberReader(new InputStreamReader(getAssets().open("5HarfliKelimeler.txt")));
            String s;
            while ((s = lnr.readLine()) != null) {
                fiveLetterWords.add(s);
            }
            lnr.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        Random rnd = new Random();
        return fiveLetterWords.get(rnd.nextInt(fiveLetterWords.size()));
    }

【讨论】:

  • 为什么必须使用静态最大线索引?将每个单词添加到列表中并从中选择一个随机索引。 (从 0 到 listSize)@Autocrab
  • 如果你知道文件的内容不会改变,它会更快,所以你知道,该文件包含的行数总是相同的。因此,您可以将此计数指定为常量,并从此值生成随机整数。您不必阅读所有行,您只需阅读随机索引之前的行。
  • 您可以轻松阅读 5 k 10k 或 50k 毫秒的单词。只有几毫秒……如果是 5143 行呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-01
  • 2015-09-13
  • 2011-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多