实际上,我的内部存储器中有一个名为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的array1应该包含[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());
            }

    }


现在,当我对此进行测试时,它使我两个数组都为空。难道我做错了什么。请任何人帮助!我也已经在清单中设置了WRITE_EXTERNAL_STORAGE权限,即使我没有捕获运行时权限,我也已在设置中为我的应用启用了该存储权限。

仍然我得到两个数组为空。谁能说我在做什么错。

最佳答案

我认为您的麻烦之一是方法的复杂性使其难以调试。我建议下面的代码,在将文件放入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列表。

我在本地进行了测试,并且可以正常工作。如果您仍使用该代码获取空数组,建议您尝试确保实际上正在加载正确的文件。

10-05 17:50