我正在使用缓冲读卡器来传输文件。现在有两种情况:
它正在流式传输一台PC上生成的文件,我们称之为File1。 它正在流式传输另一台计算机上生成的文件,我们称之为File2。
我认为我的问题是由EOL引起的。
BufferedReader会读取这两个文件,但对于File2,会为每个新行读取一个额外的空行。
此外,当我使用line.equalsIgnoreCase("abc")
比较该行时,如果该行为"abc"
,则不会返回true。
将此代码与复制问题的两个链接中提供的两个文件一起使用:
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);
}
}
注意第二个文件如何在每行后打印一个空行...
我一直在搜索和尝试,搜索和尝试,但无法提出解决方案。
任何想法如何解决? (特别是比较的东西?)
答案 0 :(得分:1)
适合我。
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
行的文件,这是我第一次尝试修复。请测试一下,我还没试过。您需要将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();
}
}
答案 1 :(得分:0)
Joop是对的,经过一些更多的研究似乎,即使两个文件都在其标题中指定了UTF-16编码,一个编码为UTF-16,另一个(File1)编码为UTF-8。这导致了双线效应&#34;。 感谢您在回答这个问题时付出的努力。