Buffer Reader 读取输入文件的代码
Buffer Reader code to read input file
我有一个名为 "message.txt" 的文本文件,它是使用缓冲区 Reader 读取的。文本文件的每一行都包含 "word" 和 "meaning",如本例所示:
"PS:Primary school"
其中PS - 单词,小学 - 意思
当文件被读取时,每一行都从“:”标记为 "word" 和 "meaning"。
如果 "meaning" 等于给定的名为 "f_msg3" 的输入字符串,则 "f_msg3" 将显示在名为 "txtView" 的文本视图上。否则,它会在文本视图中显示 "f_msg"。
但是 "if condition" 在此代码中无法正常工作。例如,如果 "f_msg3" 等于 "Primary school",文本视图的输出必须是 "Primary school"。但它给出的输出为 "f_msg" 而不是 "f_msg3"。 ("f_msg3" 不包含任何不必要的字符串。)
谁能解释一下我哪里出错了?
try {
BufferedReader file = new BufferedReader(new InputStreamReader(getAssets().open("message.txt")));
String line = "";
while ((line = file.readLine()) != null) {
try {
/*separate the line into two strings at the ":" */
StringTokenizer tokens = new StringTokenizer(line, ":");
String word = tokens.nextToken();
String meaning = tokens.nextToken();
/*compare the given input with the meaning of the read line */
if(meaning.equalsIgnoreCase(f_msg3)) {
txtView.setText(f_msg3);
} else {
txtView.setText(f_msg);
}
} catch (Exception e) {
txtView.setText("Cannot break");
}
}
} catch (IOException e) {
txtView.setText("File not found");
}
我在你的代码中没有看到任何明显的错误,也许这只是一个问题
在比较之前清理字符串(即删除标题和尾随空格、换行符等)。
尝试修剪 meaning
,例如像这样:
...
String meaning = tokens.nextToken();
if(meaning != null) {
meaning = meaning.trim();
}
if(f_msg3.equalsIgnoreCase(meaning)) {
txtView.setText(f_msg3);
} else {
txtView.setText(f_msg);
}
...
StringTokenizer 会处理数字(导致错误的原因)和其他 "tokens" - 因此可能会被认为调用了太多的复杂性。
String[] pair = line.split("\s*\:\s*", 2);
if (pair.length == 2) {
String word = pair[0];
String meaning = pair[1];
...
}
这使用正则表达式将行分成最多 2 个部分(第二个可选参数)。 \s*
代表任何空格:制表符和空格。
您也可以在属性中加载所有内容。在属性文件中,格式 key=value
是惯例,但 key:value
也是允许的。然而,可能需要一些转义。
试试这个
............
meaning = meaning.replaceAll("\s+", " ");
/*compare the given input with the meaning of the read line */
if(meaning.equalsIgnoreCase(f_msg3)) {
txtView.setText(f_msg3);
} else {
txtView.setText(f_msg);
}
............
否则注释else部分即可。
ArrayList vals = new ArrayList();
String jmeno = "Adam";
vals.add("Honza");
vals.add("Petr");
vals.add("Jan");
if(!(vals.contains(jmeno))){
vals.add(jmeno);
}else{
System.out.println("Adam je už v seznamu");
}
for (String jmena : vals){
System.out.println(jmena);
}
try (BufferedReader br = new BufferedReader(new FileReader("dokument.txt")))
{
String aktualni = br.readLine();
int pocetPruchodu = 0;
while (aktualni != null)
{
String[] znak = aktualni.split(";");
System.out.println(znak[pocetPruchodu] + " " +znak[pocetPruchodu + 1]);
aktualni = br.readLine();
}
br.close();
}
catch (IOException e)
{
System.out.println("Nezdařilo se");
}
try (BufferedWriter bw = new BufferedWriter(new FileWriter("dokument2.txt")))
{
int pocetpr = 0;
while (pocetpr < vals.size())
{
bw.write(vals.get(pocetpr));
bw.append(" ");
pocetpr++;
}
bw.close();
}
catch (IOException e)
{
System.out.println("Nezdařilo se");
}
我有一个名为 "message.txt" 的文本文件,它是使用缓冲区 Reader 读取的。文本文件的每一行都包含 "word" 和 "meaning",如本例所示:
"PS:Primary school"
其中PS - 单词,小学 - 意思
当文件被读取时,每一行都从“:”标记为 "word" 和 "meaning"。 如果 "meaning" 等于给定的名为 "f_msg3" 的输入字符串,则 "f_msg3" 将显示在名为 "txtView" 的文本视图上。否则,它会在文本视图中显示 "f_msg"。
但是 "if condition" 在此代码中无法正常工作。例如,如果 "f_msg3" 等于 "Primary school",文本视图的输出必须是 "Primary school"。但它给出的输出为 "f_msg" 而不是 "f_msg3"。 ("f_msg3" 不包含任何不必要的字符串。)
谁能解释一下我哪里出错了?
try {
BufferedReader file = new BufferedReader(new InputStreamReader(getAssets().open("message.txt")));
String line = "";
while ((line = file.readLine()) != null) {
try {
/*separate the line into two strings at the ":" */
StringTokenizer tokens = new StringTokenizer(line, ":");
String word = tokens.nextToken();
String meaning = tokens.nextToken();
/*compare the given input with the meaning of the read line */
if(meaning.equalsIgnoreCase(f_msg3)) {
txtView.setText(f_msg3);
} else {
txtView.setText(f_msg);
}
} catch (Exception e) {
txtView.setText("Cannot break");
}
}
} catch (IOException e) {
txtView.setText("File not found");
}
我在你的代码中没有看到任何明显的错误,也许这只是一个问题
在比较之前清理字符串(即删除标题和尾随空格、换行符等)。
尝试修剪 meaning
,例如像这样:
...
String meaning = tokens.nextToken();
if(meaning != null) {
meaning = meaning.trim();
}
if(f_msg3.equalsIgnoreCase(meaning)) {
txtView.setText(f_msg3);
} else {
txtView.setText(f_msg);
}
...
StringTokenizer 会处理数字(导致错误的原因)和其他 "tokens" - 因此可能会被认为调用了太多的复杂性。
String[] pair = line.split("\s*\:\s*", 2);
if (pair.length == 2) {
String word = pair[0];
String meaning = pair[1];
...
}
这使用正则表达式将行分成最多 2 个部分(第二个可选参数)。 \s*
代表任何空格:制表符和空格。
您也可以在属性中加载所有内容。在属性文件中,格式 key=value
是惯例,但 key:value
也是允许的。然而,可能需要一些转义。
试试这个
............
meaning = meaning.replaceAll("\s+", " ");
/*compare the given input with the meaning of the read line */
if(meaning.equalsIgnoreCase(f_msg3)) {
txtView.setText(f_msg3);
} else {
txtView.setText(f_msg);
}
............
否则注释else部分即可。
ArrayList vals = new ArrayList();
String jmeno = "Adam";
vals.add("Honza");
vals.add("Petr");
vals.add("Jan");
if(!(vals.contains(jmeno))){
vals.add(jmeno);
}else{
System.out.println("Adam je už v seznamu");
}
for (String jmena : vals){
System.out.println(jmena);
}
try (BufferedReader br = new BufferedReader(new FileReader("dokument.txt")))
{
String aktualni = br.readLine();
int pocetPruchodu = 0;
while (aktualni != null)
{
String[] znak = aktualni.split(";");
System.out.println(znak[pocetPruchodu] + " " +znak[pocetPruchodu + 1]);
aktualni = br.readLine();
}
br.close();
}
catch (IOException e)
{
System.out.println("Nezdařilo se");
}
try (BufferedWriter bw = new BufferedWriter(new FileWriter("dokument2.txt")))
{
int pocetpr = 0;
while (pocetpr < vals.size())
{
bw.write(vals.get(pocetpr));
bw.append(" ");
pocetpr++;
}
bw.close();
}
catch (IOException e)
{
System.out.println("Nezdařilo se");
}