不,Scanner
不会为你这样做。您必须自己进行翻译。
(请注意,如果您使用sc.useDelimiter("\\\\n")
其他人建议的方法,您将破坏普通next()
方法的功能,并且nextLine()
可能无法按预期运行。)
这是我将如何解决它的草图:
改变
Scanner input = new Scanner(new FileReader(fileName));
到
Scanner input = new Scanner(new JavaEscapeReader(new FileReader(fileName)));
^^^^^^^^^^^^^^^^^^^^^ ^
哪里JavaEscapeReader
会像这样延伸FilterReader
:
class JavaEscapeReader extends FilterReader {
JavaEscapeReader(Reader in) {
super(in);
}
@Override
public int read() throws IOException {
int ch = super.read();
switch (ch) {
case '\\':
switch (super.read()) {
case '\\': return '\\';
case 'n': return '\n';
case 't': return '\t';
case 'f': return '\f';
// ...
default:
throw new IOException("Invalid char sequence.");
}
default:
return ch;
}
}
@Override
public int read(char[] cbuf, int off, int len) throws IOException {
int i = 0, ch;
while (i < len && -1 != (ch = read()))
cbuf[i++] = (char) ch;
return i == 0 ? -1 : i;
}
}
给定一个包含内容的输入文件
Line1\nLine2
Line3\nLine3
该程序
Scanner sc = new Scanner(new JavaEscapeReader(new FileReader("filename.txt")));
while (sc.hasNextLine())
System.out.println(sc.nextLine());
印刷
Line1
Line2
Line3
Line4
另一种选择是使用StringEscapeUtils.unescapeJava
和后处理读取的字符串。