实际上,我的内部存储器中有一个名为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.
}
这只是将整个文件抓到一个
String
(data
)中,然后扫描文件中的所有网络(按照正则表达式"network=\\{.*?\\}"
,网络定义为network = {此处包括换行符的所有内容)) ,对于每个网络,搜索ssid和psk,然后将ssid放入ssid ArrayList
,然后检查是否存在psk,然后将psk或"NONE"
放入psk列表。我在本地进行了测试,并且可以正常工作。如果您仍使用该代码获取空数组,建议您尝试确保实际上正在加载正确的文件。