从文件中检索到的字符串内容在连接或相等性检查期间消失
String's content retrieved from file disappears during concatenation or equality check
我正在制作一个必须 read/write 纯文本文件的程序。我从文件中读取文本,然后对其进行处理以将字符串分成几个部分(即行,然后是 variable/value)。当我尝试处理其中一些组件时,字符串的内容似乎会暂时改变或消失。此代码重现了问题:
package spriteModder;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class ErrorThing {
public static void main(String[] args) throws IOException {
loadFile(new File("settings.config"));
}
public static void loadFile(File f) throws IOException {
FileInputStream fis=new FileInputStream(f);
int numread=1;
StringBuilder contentBuilder= new StringBuilder();
byte[] buffer=new byte[8];
while(numread>0) {
numread=fis.read(buffer);
if(numread==-1){break;}
contentBuilder.append(new String(buffer, 0, numread));
}
String source=contentBuilder.toString();
System.out.println(source);
String[] lines=source.split("\n");
for(String s:lines){
System.out.println(s);
String[] a=s.split("=");
for(String s2:a){
System.out.println(s2);
System.out.println(s2+"4");
System.out.println(s2.equals("true"));
}
}
}
}
这是输出:
//these three lines are to verify the contents of the settings.config file, which works as expected
outputDir=*here
lookInSubDirectories=true
inputDir=*here
outputDir=*here //the first line of the file
outputDir //the first component of the line
outputDir4 //the first component of the line after concatenation.
false //checks if the component (w/o concatenation) is equal to "true"
*here //second component of the line
4 //second component of the line after concatenation, which is missing the entire original component
false //checks if the second component of the line is equal to "true"
lookInSubDirectories=true
lookInSubDirectories //the first component of the second line
lookInSubDirectories4
false
true // the second component
4 //this component also disappears during concatenation
false // but also fails the equality check, even though the content is "true"
inputDir=*here
inputDir
inputDir4
false
*here
*here4 //you can see concatenation working on the third line's second component here for some reason
false
settings.config的内容是:
outputDir=*here
lookInSubDirectories=true
inputDir=*here
我试过更改字节缓冲区的大小,使用 FileReader 而不是 FileInputStream,并使用临时变量但没有成功。我还绕过读取文件,只是将相同的内容硬编码到一个字符串中,从而避免了这个问题。但是,从文件中读取内容是必须的。当仅连接一个空字符串 ("") 时,连接始终有效,但任何其他内容都会导致这两行中的原始内容消失。无论是否使用 .equals 或 ==,相等性检查都会失败。使用 substring() 而不是 split() 来生成组件没有任何效果。到底是怎么回事?为什么连接会导致原始字符串在结果中消失,但只是有时会消失?为什么相等性检查不起作用?
好的,所以这里没有任何东西消失,并且您的程序可以正常运行,即使是以不必要的麻烦方式编写的。最简单的方法是留下这一行:
System.out.println(s2);
作为拆分 String
迭代的唯一输出。唯一的错误是得出结论 'disappears'。我要大胆猜测,然后说你 运行 这个代码在 Windows 上,否则你的 settings.config
文件的换行符是 \r\n 而不仅仅是 \n。因此,仅在 \n 上拆分会留下悬挂的 \rs,因此您有:
"*here\r" + "4"
这被打印为
*here
4
最好使用调试器或 if 语句检查挂起的 \rs。
因此,您的程序与将 abc=123
拆分为 "abc"
和 "123"
一样有效(或者更确切地说,拆分为 "abc"
和 "123\r"
) .但是请考虑使用 Java 的内置方法从文件中加载 Properties
,或者至少使用 BufferedReader
,我认为 readLine
方法会消耗两者回车 return 和换行字符。
我正在制作一个必须 read/write 纯文本文件的程序。我从文件中读取文本,然后对其进行处理以将字符串分成几个部分(即行,然后是 variable/value)。当我尝试处理其中一些组件时,字符串的内容似乎会暂时改变或消失。此代码重现了问题:
package spriteModder;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class ErrorThing {
public static void main(String[] args) throws IOException {
loadFile(new File("settings.config"));
}
public static void loadFile(File f) throws IOException {
FileInputStream fis=new FileInputStream(f);
int numread=1;
StringBuilder contentBuilder= new StringBuilder();
byte[] buffer=new byte[8];
while(numread>0) {
numread=fis.read(buffer);
if(numread==-1){break;}
contentBuilder.append(new String(buffer, 0, numread));
}
String source=contentBuilder.toString();
System.out.println(source);
String[] lines=source.split("\n");
for(String s:lines){
System.out.println(s);
String[] a=s.split("=");
for(String s2:a){
System.out.println(s2);
System.out.println(s2+"4");
System.out.println(s2.equals("true"));
}
}
}
}
这是输出:
//these three lines are to verify the contents of the settings.config file, which works as expected
outputDir=*here
lookInSubDirectories=true
inputDir=*here
outputDir=*here //the first line of the file
outputDir //the first component of the line
outputDir4 //the first component of the line after concatenation.
false //checks if the component (w/o concatenation) is equal to "true"
*here //second component of the line
4 //second component of the line after concatenation, which is missing the entire original component
false //checks if the second component of the line is equal to "true"
lookInSubDirectories=true
lookInSubDirectories //the first component of the second line
lookInSubDirectories4
false
true // the second component
4 //this component also disappears during concatenation
false // but also fails the equality check, even though the content is "true"
inputDir=*here
inputDir
inputDir4
false
*here
*here4 //you can see concatenation working on the third line's second component here for some reason
false
settings.config的内容是:
outputDir=*here
lookInSubDirectories=true
inputDir=*here
我试过更改字节缓冲区的大小,使用 FileReader 而不是 FileInputStream,并使用临时变量但没有成功。我还绕过读取文件,只是将相同的内容硬编码到一个字符串中,从而避免了这个问题。但是,从文件中读取内容是必须的。当仅连接一个空字符串 ("") 时,连接始终有效,但任何其他内容都会导致这两行中的原始内容消失。无论是否使用 .equals 或 ==,相等性检查都会失败。使用 substring() 而不是 split() 来生成组件没有任何效果。到底是怎么回事?为什么连接会导致原始字符串在结果中消失,但只是有时会消失?为什么相等性检查不起作用?
好的,所以这里没有任何东西消失,并且您的程序可以正常运行,即使是以不必要的麻烦方式编写的。最简单的方法是留下这一行:
System.out.println(s2);
作为拆分 String
迭代的唯一输出。唯一的错误是得出结论 'disappears'。我要大胆猜测,然后说你 运行 这个代码在 Windows 上,否则你的 settings.config
文件的换行符是 \r\n 而不仅仅是 \n。因此,仅在 \n 上拆分会留下悬挂的 \rs,因此您有:
"*here\r" + "4"
这被打印为
*here
4
最好使用调试器或 if 语句检查挂起的 \rs。
因此,您的程序与将 abc=123
拆分为 "abc"
和 "123"
一样有效(或者更确切地说,拆分为 "abc"
和 "123\r"
) .但是请考虑使用 Java 的内置方法从文件中加载 Properties
,或者至少使用 BufferedReader
,我认为 readLine
方法会消耗两者回车 return 和换行字符。