Java 使用FileInputStream的文件输入无法正常工作
下面的程序应该将Java 使用FileInputStream的文件输入无法正常工作,java,file-io,newline,fileinputstream,Java,File Io,Newline,Fileinputstream,下面的程序应该将字符串“Humpty Dumpty坐在墙上,\n Humpty Dumpty摔了个大跤”打印到一个文件中,然后再输入回来 package io; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.PrintStream; public class ByteIO { /** * @pa
字符串
“Humpty Dumpty坐在墙上,\n Humpty Dumpty摔了个大跤”打印到一个文件中,然后再输入回来
package io;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintStream;
public class ByteIO {
/**
* @param args
*/
public static void main(String[] args) {
String output = "Humpty Dumpty sat on a wall,\n Humpty Dumpty had a great fall.";
System.out.println("Output String : " + output);
try(PrintStream out = new PrintStream("F:\\Test.txt")) {
out.println(output);
} catch(FileNotFoundException e) {
e.printStackTrace();
}
String input = "";
try(FileInputStream in = new FileInputStream("F:\\Test.txt")) {
while(in.read() != -1)
input += (char)in.read();
} catch(FileNotFoundException e) {
e.printStackTrace();
} catch(IOException e) {
e.printStackTrace();
}
System.out.println("Input String : " + input);
}
}
然而,我从
文件输入流中得到的字符串是“upyDmt a nawl,upyDmt a ra al?”!另外,当我打开文件“Test.txt”时,我发现输出字符串变成了“Humpty Dumpty坐在墙上,Humpty Dumpty摔了个大跤”。\n
到哪里去了?您在.read()中调用两次:
while(in.read() != -1)
input += (char)in.read();
这将在每次迭代中读取两个字符,而不是一个字符,因此每次实际上都会丢弃一个字符
尝试将字符存储在while条件中,然后将该字符添加到输入中
:
编辑:基于JavaNewbie_M107的评论
int i;
while((i = in.read()) != -1)
input += (char)i;
您正在.read()中调用,
两次:
while(in.read() != -1)
input += (char)in.read();
这将在每次迭代中读取两个字符,而不是一个字符,因此每次实际上都会丢弃一个字符
尝试将字符存储在while条件中,然后将该字符添加到输入中
:
编辑:基于JavaNewbie_M107的评论
int i;
while((i = in.read()) != -1)
input += (char)i;
对于第二部分,Windows(以及许多应用程序,如记事本)不将\n识别为新行。在Windows中,\r\n标记新行。尝试使用更严格的编辑程序打开(写字板应该足够了),您将看到它的格式正确。对于第二部分,Windows(以及许多应用程序,如记事本)无法识别\n为新行。在Windows中,\r\n标记新行。试着用一个更严肃的编辑程序打开(写字板应该足够了),你会看到它的格式正确。正如亨特所说,你需要将你的代码改成这个
char c;
while((c=in.read()) != -1)
input += c;
正如亨特所说,您需要将代码更改为
char c;
while((c=in.read()) != -1)
input += c;
这是我的问题的正确解决方案:
int i = 0;
char c;
do {
c = (char)i;
input += c;
i = in.read();
} while(i != -1);
使用.trim()
方法去除前面多余的空间。这是解决我问题的正确方法:
int i = 0;
char c;
do {
c = (char)i;
input += c;
i = in.read();
} while(i != -1);
使用.trim()
方法删除前面多余的空间。文件在那里,\n但您的编辑器可能不会显示它。关于您的输入:您的循环被中断,因为它只提供第二个字符。您应该在写入和读取文件之间关闭该文件。@JavaNewbie在得到解决方案时始终接受答案。@PeterLawrey不是必需的,因为我使用了try with resources:文件在try块的末尾自动关闭。@JavaNewbie\u M107使用try with将解决这个问题。我会抓住例外,除非你对它们做些有用的事情。如果您没有捕获到异常,它将打印出异常。\n在那里,但是您的编辑器可能不会显示它。关于您的输入:您的循环被中断,因为它只提供第二个字符。您应该在写入和读取文件之间关闭该文件。@JavaNewbie在得到解决方案时始终接受答案。@PeterLawrey不是必需的,因为我使用了try with resources:文件在try块的末尾自动关闭。@JavaNewbie\u M107使用try with将解决这个问题。我会抓住例外,除非你对它们做些有用的事情。如果你没有捕捉到异常,它会打印出来。你的代码的问题是char
c永远不会返回-1,相反,它会一直返回零,从而设置一个无限循环。@JavaNewbie\u M107你完全正确,我之前错过了。我将进行编辑。您的代码的问题是,char
c永远不会返回-1,相反,它会一直返回零,从而设置一个无限循环。@JavaNewbie\u M107您完全正确,我之前错过了。我将进行编辑。