英文:
.parseBoolean turns out "false" with the String being "true"?
问题
import java.io.FileReader;
import java.io.IOException;
public class StackOverflow {
public static void main(String[] args) throws IOException {
String textRead = "";
FileReader fileReader = new FileReader("test.txt");
char[] Array = new char[100];
fileReader.read(Array);
for(int i = 0; i<Array.length; i++)
{
//if I were to print textRead it would print true
textRead = textRead + Array[i];
}
//The .txt file contains only "true" and nothing else
boolean test = Boolean.parseBoolean(textRead);
//This prints out false for some reason
System.out.print(test);
fileReader.close();
}
}
但当我运行此程序时,它打印出值 "false",即使应该读取的 .txt 文件只包含 "true"。
我尝试寻找解决方案,但由于我对Java和编程都还很陌生,所以没有取得多大进展,有人可以帮我解决这个问题吗?
英文:
So I was trying to make a program that reads the content of a .txt file and then stores it as a boolean
import java.io.FileReader;
import java.io.IOException;
public class StackOverflow {
public static void main(String[] args) throws IOException {
String textRead = "";
FileReader fileReader = new FileReader("test.txt");
char[] Array = new char[100];
fileReader.read(Array);
for(int i = 0; i<Array.length; i++)
{
//if I were to print textRead it would print true
textRead = textRead + Array[i];
}
//The .txt file contains only "true" and nothing else
boolean test = Boolean.parseBoolean(textRead);
//This prints out false for some reason
System.out.print(test);
fileReader.close();
}
}
But when I run this it prints out the value "false" even though the .txt that was supposed to be read only contained "true".
I tried looking for a solution but didn't get very far as I am still pretty new to java and coding in general, can anyone help me out with this?
答案1
得分: 1
这实际上是您的String
内容,没有修剪:
00000000: 7472 7565 0a00 0000 0000 0000 0000 0000 true............
00000010: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000040: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000050: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000060: 0000 0000 ....
与C/C++等语言不同,Java的String
可以 包含空字符。因此,您需要在读取后使用 textRead = textRead.trim();
进行修剪,但正如我所说,最好是按行读取。尽管如此,无论如何读取,调用 trim()
是明智的
英文:
This is, in fact the content of your String
without trimming:
00000000: 7472 7565 0a00 0000 0000 0000 0000 0000 true............
00000010: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000040: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000050: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000060: 0000 0000 ....
Unlike languages like C/C++, Java String
s can contain null characters. So you need textRead = textRead.trim();
after reading, but as I said, it would be better to read lines. Having said that, however you read it, it would be wise to call trim()
答案2
得分: 1
以下是翻译好的部分:
当 char 数组被创建时,它最初会包含空字符值。
char[] Array = new char[100];
因此,当您循环遍历 Array 时,textRead 将会附加空的 char 值。
textRead = textRead + Array[i];
您可以通过在 for 循环 内部添加一个检查来避免这种情况。
for(int i = 0; i<Array.length; i++)
{
if (Array[i] == '\u0000') break;
//如果我打印textRead,它将会打印true
textRead = textRead + Array[i];
}
或者,您可以利用 String 构造方法,或者使用 String#valueOf 方法来构造字符串。随后,使用 String#trim 方法来移除任何前导和尾随的空白字符,包括空字符。
textRead = new String(Array).trim();
textRead = String.valueOf(Array).trim();
值得注意的是,您可以利用 BufferedReader 类,该类具有 readLine 方法。
BufferedReader fileReader = new BufferedReader(new FileReader("test.txt"));
textRead = fileReader.readLine();
fileReader.close();
英文:
When the char array is created it will initially contain null character values.
char[] Array = new char[100];
So, when you are looping though Array, textRead will have null char values appended to it.
textRead = textRead + Array[i];
You can avoid this by adding a check within the for-loop.
for(int i = 0; i<Array.length; i++)
{
if (Array[i] == '\u0000') break;
//if I were to print textRead it would print true
textRead = textRead + Array[i];
}
Alternately, you can utilize the String constructor method, or the String#valueOf method, to construct the string.
Subsequently, use the String#trim method to remove any leading and trailing white-space characters—which includes the null character.
textRead = new String(Array).trim();
textRead = String.valueOf(Array).trim();
It's worth noting, you can utilize the BufferedReader class, which has a readLine method.
BufferedReader fileReader = new BufferedReader(new FileReader("test.txt"));
textRead = fileReader.readLine();
fileReader.close();
答案3
得分: 0
public static boolean parseBoolean(String s) { return "true".equalsIgnoreCase(s); }
Hope that explains your issue.
Also the unused elements in your char array are treated as nulls
英文:
public static boolean parseBoolean(String s) {
return "true".equalsIgnoreCase(s);
}
Hope that explains your issue.
Also the unused elements in your char array are treated as nulls
答案4
得分: 0
你已经被解释过(非常好地)随意声明一个数组来存储值的问题,其中您可能不知道需要读取整个布尔值文件的元素数量,因此我不会在这里再次这样做。然而,我建议您根本不使用数组,而是使用List接口或ArrayList来存储文件行结果,这些结果可以动态增长,并且不会可能充满null或空元素(如果您不希望如此)。
下面是如何使用List接口的示例。请务必阅读代码中的注释。
应该注意,在这个用例中,文件行被修剪以去掉空格等。您还会注意到使用String#matches()方法与正则表达式(regex)字符串来验证读取的文件行是否包含“true”或“false”。下面是对使用的正则表达式的简要解释:
(?i)
忽略大小写;true
文件行仅包含“true”;|
或false
文件行仅包含“false”;
再次阅读代码中的注释:
// 用于存储true/false文件行结果的List接口:
List<Boolean> list = new ArrayList<>();
/* 在这里使用`Try With Resources`自动关闭()读取器
并在完成时释放资源。 */
try (Scanner reader = new Scanner(new File("test.txt"))) {
String line;
while (reader.hasNextLine()) {
line = reader.nextLine().trim();
/* 任何包含除true或false之外的内容的文件行都会被忽略,包括空行。 */
// 行是否为true或false(不区分大小写):
if (line.matches("(?i)true|false")) {
// 将行转换为布尔值并添加到List中:
list.add(Boolean.valueOf(line));
}
}
// 如果您愿意,可以将列表转换为数组(在读取之后):
// Boolean[] array = list.toArray(new Boolean[0]);
// 显示List:
for (Boolean bool : list) {
System.out.println(bool);
}
}
catch (FileNotFoundException ex) {
System.err.println(ex.getMessage());
}
(Note: The code comments and URLs are retained as provided.)
英文:
You've already been explained (quite nicely) the problem with arbitrarily declaring an array to hold values where you possibly have no idea how many elements you may need to read the entire file of boolean values so I won't do that again here. I will suggest however, that you don't use an array at all but instead, use a List Interface or an ArrayList to hold file line results which can grow dynamically and wont possibly end up being full of null or empty elements (if you don't want it to).
Below is an example of how a List Interface can be used. Be sure to read the comments in code.
It should be noted that, in this use case, the file lines are trimmed of white-spacing etc as the file lines are read. You will also note that the String#matches() method is used with a Regular Expression (regex) string to validate the fact that a read file line contains either "true" or "false". Below is a brief explanation of the regex used:
(?i)
Ignore letter case;true
The file line contains only "true";|
ORfalse
The file line contains only "false";
Again...read the comments in code:
// List Interface to hold true/false file line results:
List<Boolean> list = new ArrayList<>();
/* `Try With Resources` used here to auto-close() the reader
and free resources when done. */
try (Scanner reader = new Scanner(new File("test.txt"))) {
String line;
while (reader.hasNextLine()) {
line = reader.nextLine().trim();
/* Any file line that contains anything other than
true or false is ignored, including blank lines. */
// Is the line true or false (not letter case sensitive):
if (line.matches("(?i)true|false")) {
// Convert line to boolean and add to List:
list.add(Boolean.valueOf(line));
}
}
// Convert list to an array if you like (after the reading):
// Boolean[] array = list.toArray(new Boolean[0]);
// Display List:
for (Boolean bool : list) {
System.out.println(bool);
}
}
catch (FileNotFoundException ex) {
System.err.println(ex.getMessage());
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论