在Android中动态获取字符串中的值

时间:2017-07-16 13:48:14

标签: java android arrays

实际上我的My Internal Storage中有一个名为file.txt的文件,其内容如下

device_type=10-0050F204-5
os_version=01020300
config_methods=physical_display virtual_push_button
p2p_no_group_iface=1
external_sim=1
wowlan_triggers=disconnect

network={
    ssid="KP'S TV"
    psk="thebestwifi12"
    key_mgmt=WPA-PSK
    priority=7
}

network={
    ssid="Pal 2.1"
    psk="paldroid"
    key_mgmt=WPA-PSK
    priority=8
}

network={
    ssid="Dad"
    psk="kaustubh"
    key_mgmt=WPA-PSK
    priority=9
}

network={
    ssid="AndroidAP"
    key_mgmt=NONE
    priority=10
}

我基本上是在'ssid ='之后尝试存储所有名字。在一个数组和其他数组中保存' psk ='之后的所有值这样我的ssid数组1应该包含[KP' S TV,Pal 2.1,Dad,AndroidAP]和psk的array2应该包含[thebestwifi12,paldroid,kaustubh,NONE]

正如您注意到网络的最后一个循环不包含psk所以我希望在psk的array2中如果没有psk它会保持NONE,如上所示。

我试图在两个文本视图上打印数组

为此,这是我的主要活动代码

import android.os.Bundle;
import android.os.Environment;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

public class MainActivity extends AppCompatActivity {
TextView test,test1;
    String temp;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        test = (TextView) findViewById(R.id.textbox1) ; // textbox1 is my first textview
        test1 = (TextView) findViewById(R.id.textbox2) ; // textbox2 is my first textview
        readandgetarray();
    }

    public void readandgetarray(){

       // Reading File

       File dir = Environment.getExternalStorageDirectory();
        File file = new File(dir,"file.txt");
        if(file.exists())
        {
           final StringBuilder textfile = new StringBuilder();
            try {
                BufferedReader br = new BufferedReader(new FileReader(file));
                String line;
                while ((line = br.readLine()) != null) {
                    textfile.append(line);
                }
            }
            catch (IOException e) {
                //You'll need to add proper error handling here
            }
            test.setText(textfile);
             temp = textfile.toString();
        }
        else
        {
            test.setText("Sorry file doesn't exist!!");
        }
               // Storing it into Array Now

                String str = temp;
                StringTokenizer tokenizer = new StringTokenizer(str, "\n");
                List<String> array1 = new ArrayList<>();
                List<String> array2 = new ArrayList<>();
                List<String> arraydef = new ArrayList<>();
                while (tokenizer.hasMoreElements()) {
                    String line = (String) tokenizer.nextElement();
                    String[] split = line.split("=");
                    String key = split[0];
                    String value = split[1];
                    switch (key) {
                        case "ssid":
                            array1.add(value);
                            break;
                        case "psk":
                            array2.add(value);
                            break;
                        default:
                            arraydef.add(value);
                    }
                }
                test.setText(array1.toString());
                test1.setText(array2.toString());
            }

    }

现在当我测试它时,它给了我两个数组为空。难道我做错了什么。请任何人帮忙!此外,我在Manifest中设置了WRITE_EXTERNAL_STORAGE权限,即使我没有获得运行时权限,但我已在设置中为我的应用启用了存储权限。

我仍然将两个阵列都变为空。任何人都可以说我做错了什么。

2 个答案:

答案 0 :(得分:1)

我认为问题在于此代码:

            while (tokenizer.hasMoreElements()) {
                String line = (String) tokenizer.nextElement();
                String[] split = line.split("=");
                String key = split[0];
                String value = split[1];
                switch (key) {
                    case "ssid":
                        array1.add(value);
                        break;
                    case "psk":
                        array2.add(value);
                        break;
                    default:
                        arraydef.add(value);
                }
            }

看来你的文件在“ssid”和“psk”之前有空格(即行是" ssid=foo"),所以我希望key永远不等于"ssid",尽管它可能等于" ssid"

答案 1 :(得分:0)

我认为你的部分麻烦是你的方法的复杂性使得调试变得困难。我建议您使用以下代码,以便在将文件导入file变量后使用。

if(file.exists())
{
    try {
        ArrayList<String> ssids = new ArrayList<>();
        ArrayList<String> psks = new ArrayList<>();
        String data = new String(Files.readAllBytes(file.toPath()));
        Pattern networkPat = Pattern.compile("network=\\{.*?\\}", Pattern.DOTALL);
        Pattern ssidPat = Pattern.compile("ssid=\"(?<ssid>.*?)\"");
        Pattern pskPat = Pattern.compile("psk=\"(?<psk>.*?)\"");
        Matcher netMatch = networkPat.matcher(data);
        while (netMatch.find())
        {
            Matcher ssidMatch = ssidPat.matcher(netMatch.group());
            ssidMatch.find();
            ssids.add(ssidMatch.group("ssid"));
            Matcher pskMatch = pskPat.matcher(netMatch.group());
            psks.add((pskMatch.find()) ? pskMatch.group("psk") : "NONE");
        }
    }
    catch (IOException e) {
       //You'll need to add proper error handling here
    }
}
else
{
    //Do whatever you want here.
}

这只是将整个文件抓取到一个Stringdata),然后扫描文件中的所有网络(根据正则表达式"network=\\{.*?\\}",网络定义为network = {此处包括换行符}},并为每个网络搜索ssid和psk,并将ssid放入ssid ArrayList,然后检查是否有psk,并放入psk或"NONE"进入psk列表。

我在本地进行了测试,但它确实有效。如果您仍然使用该代码获得空数组,我建议您尝试确保实际上正在加载正确的文件。