BufferedReader 被不同的行分隔符弄乱了
BufferedReader messed up by different line seperators
我正在缓冲 reader 流式传输文件。目前有两种情况:
它正在流式传输在一台PC 上生成的文件,我们称它为File1。
它正在流式传输在另一台计算机上生成的文件,我们称之为 File2。
我假设我的问题是由 EOL 引起的。
BufferedReader 会读取这两个文件,但对于 File2,它会为每个新行读取一个额外的空行。
此外,当我使用 line.equalsIgnoreCase("abc")
比较该行时,鉴于该行是 "abc"
它不 return 正确。
将此代码与两个链接中提供的两个文件一起使用以复制问题:
public class JavaApplication {
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws IOException {
File file = new File("C:/Users/User/Downloads/html (2).htm");
BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));
String line = "";
while ((line = in.readLine()) != null) {
System.out.println(line);
}
}
注意第二个文件如何在每行后打印 一个空行...
我一直在搜索、尝试、搜索、尝试,但找不到解决方案。
有什么解决办法吗? (特别是比较的东西?)
适合我。
public class CRTest
{
static StringReader test = new StringReader( "Line 1\rLine 2\rLine 3\r" );
public static void main(String[] args) throws IOException {
BufferedReader buf = new BufferedReader( test );
for( String line = null; (line = buf.readLine()) != null; )
System.out.println( line );
}
}
打印:
run:
Line 1
Line 2
Line 3
BUILD SUCCESSFUL (total time: 1 second)
正如 Joop 所说,我认为您混淆了哪个文件不起作用。请使用上面的框架创建一个 MCVE 并向我们确切说明哪些文件输入不适合您。
由于您的文件似乎有 \r\n
行颠倒,这是我第一次尝试修复。请测试一下,我还没有尝试过。你需要用这个 class 包住你的 InputStreamReader
,然后像往常一样把 BufferedReader
包在外面。
class CRFix extends Reader
{
private final Reader reader;
private boolean readNL = false;
public CRFix( Reader reader ) {
this.reader = reader;
}
@Override
public int read( char[] cbuf, int off, int len )
throws IOException
{
for( int i = off; i < off+len; i++ ) {
int c = reader.read();
if( c == -1 )
if( i == off ) return -1;
else return i-off-1;
if( c == '\r' && readNL ) {
readNL = false;
c = reader.read();
}
if( c == '\n' )
readNL = true;
else
readNL = false;
cbuf[i] = (char)c;
}
return len;
}
@Override
public void close()
throws IOException
{
reader.close();
}
}
Joop 是对的,经过更多研究后似乎,即使两个文件都在其 header 中指定了 UTF-16 编码,但一个是用 UTF-16 编码的,另一个 (File1)在 UTF-8 中。这导致了"double line effect"。
感谢您为回答这个问题所做的努力。
我正在缓冲 reader 流式传输文件。目前有两种情况:
它正在流式传输在一台PC 上生成的文件,我们称它为File1。 它正在流式传输在另一台计算机上生成的文件,我们称之为 File2。
我假设我的问题是由 EOL 引起的。
BufferedReader 会读取这两个文件,但对于 File2,它会为每个新行读取一个额外的空行。
此外,当我使用 line.equalsIgnoreCase("abc")
比较该行时,鉴于该行是 "abc"
它不 return 正确。
将此代码与两个链接中提供的两个文件一起使用以复制问题:
public class JavaApplication {
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws IOException {
File file = new File("C:/Users/User/Downloads/html (2).htm");
BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));
String line = "";
while ((line = in.readLine()) != null) {
System.out.println(line);
}
}
注意第二个文件如何在每行后打印 一个空行...
我一直在搜索、尝试、搜索、尝试,但找不到解决方案。
有什么解决办法吗? (特别是比较的东西?)
适合我。
public class CRTest
{
static StringReader test = new StringReader( "Line 1\rLine 2\rLine 3\r" );
public static void main(String[] args) throws IOException {
BufferedReader buf = new BufferedReader( test );
for( String line = null; (line = buf.readLine()) != null; )
System.out.println( line );
}
}
打印:
run:
Line 1
Line 2
Line 3
BUILD SUCCESSFUL (total time: 1 second)
正如 Joop 所说,我认为您混淆了哪个文件不起作用。请使用上面的框架创建一个 MCVE 并向我们确切说明哪些文件输入不适合您。
由于您的文件似乎有 \r\n
行颠倒,这是我第一次尝试修复。请测试一下,我还没有尝试过。你需要用这个 class 包住你的 InputStreamReader
,然后像往常一样把 BufferedReader
包在外面。
class CRFix extends Reader
{
private final Reader reader;
private boolean readNL = false;
public CRFix( Reader reader ) {
this.reader = reader;
}
@Override
public int read( char[] cbuf, int off, int len )
throws IOException
{
for( int i = off; i < off+len; i++ ) {
int c = reader.read();
if( c == -1 )
if( i == off ) return -1;
else return i-off-1;
if( c == '\r' && readNL ) {
readNL = false;
c = reader.read();
}
if( c == '\n' )
readNL = true;
else
readNL = false;
cbuf[i] = (char)c;
}
return len;
}
@Override
public void close()
throws IOException
{
reader.close();
}
}
Joop 是对的,经过更多研究后似乎,即使两个文件都在其 header 中指定了 UTF-16 编码,但一个是用 UTF-16 编码的,另一个 (File1)在 UTF-8 中。这导致了"double line effect"。 感谢您为回答这个问题所做的努力。