实际上我的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权限,即使我没有获得运行时权限,但我已在设置中为我的应用启用了存储权限。
我仍然将两个阵列都变为空。任何人都可以说我做错了什么。
答案 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.
}
这只是将整个文件抓取到一个String
(data
),然后扫描文件中的所有网络(根据正则表达式"network=\\{.*?\\}"
,网络定义为network = {此处包括换行符}},并为每个网络搜索ssid和psk,并将ssid放入ssid ArrayList
,然后检查是否有psk,并放入psk或"NONE"
进入psk列表。
我在本地进行了测试,但它确实有效。如果您仍然使用该代码获得空数组,我建议您尝试确保实际上正在加载正确的文件。