Java 方法返回空字符串BufferedReader

Java 方法返回空字符串BufferedReader,java,readline,Java,Readline,我正在执行java代码readLine()方法从文本文件返回空字符串,即使文件中有文本 BufferedReader csv = new BufferedReader(new FileReader("D:/SentiWordNet_3.0.0/home/swn/www/admin/dump/senti.txt")); String line = ""; while((line = csv.readLine()) != null){

我正在执行java代码
readLine()
方法从文本文件返回空字符串,即使文件中有文本

BufferedReader csv =  new BufferedReader(new FileReader("D:/SentiWordNet_3.0.0/home/swn/www/admin/dump/senti.txt"));
String line = "";      
while((line = csv.readLine()) != null){ 
    String[] data = line.split("\t");
    Double score = Double.parseDouble(data[2])-Double.parseDouble(data[3]);
}
调用
split()
后,会引发异常
Arrayindexoutofboundsexception

下面是文本文件。每行以“a”开头,后跟一个数字。代码能够检索到带有apocrine一词的行,但无法检索带有eccrine一词的行。当我在调试模式下运行时,line变量以空字符串的形式返回

00098529 0 0 0顶分泌腺(外分泌腺)产生分泌,其中部分分泌细胞随分泌释放;“母乳是一种顶泌分泌物”

00098736 0.25 0小汗腺(外分泌腺),产生透明的水性分泌物,但不释放部分分泌细胞;对调节体温很重要

一个00098933 0 0自流的(指水)上升到水面 内部静水压力下的表面;“自流井”;“自流压力”


是否应该使用其他构造从文本文件中读取行

以下是从文件中读取数据的示例方法。
在这里,读取后,每行都添加到arraylist中,并返回arraylist

public ArrayList<String> fileRead(String fileName){
        File           f;
        String         s;
        FileReader     fr = null;
        BufferedReader br = null;
        ArrayList<String>   sl = new ArrayList<String>();
        try {
            f  = new File(fileName); 
            fr = new FileReader(f);
            br = new BufferedReader(fr);
            while((s=br.readLine())!=null){
                sl.add(s);
            }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
                try {
                    if(br!=null)
                        br.close();
                    if(fr!=null)
                        fr.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
        }
        return sl;
    }
public ArrayList fileRead(字符串文件名){
文件f;
字符串s;
FileReader fr=null;
BufferedReader br=null;
ArrayList sl=新的ArrayList();
试一试{
f=新文件(文件名);
fr=新文件读取器(f);
br=新的缓冲读取器(fr);
而((s=br.readLine())!=null){
sl.add(s);
}
}catch(filenotfounde异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}最后{
试一试{
如果(br!=null)
br.close();
如果(fr!=null)
fr.close();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
返回sl;
}
尝试使用扫描仪:

Scanner in = new Scanner(new FileReader("filename.txt"));
while (in.hasNext()){
   String str = in.next());
   // Use it
}

要阅读每一行:

while ((thisLine = br.readLine()) != null) {
     System.out.println(thisLine);
   }

如果这不起作用,那么我假设您的文本文件有问题。

关键是您错误地使用了BufferedReader,如果您像这样使用FileReader

new FileReader( filename ) 
这里的文件名是类似“/data/myfile.txt”的文件路径。ecplise或编译器不会给出编译错误或警告,但是,如果使用readLine(),这是一个致命错误,将导致从文件中不读取任何内容。 正确的方法如下:

BufferedReader csv =  new BufferedReader(new FileReader( new File("filename") ) )
csv.readLine()

我试过你的文件,发现你的文件格式不对。您的文件格式如下:00098529 0 0每个字符串都用空格分隔,但不用制表符分隔,因此当您使用拆分(“\t”)时,将一无所获。给定您的文件格式,您应该使用split(“”),或者您应该通过用tab分隔每个字符串来更改文件格式,您可以在
BufferedReader的javadoc中看到以下内容

        //Get scanner instance
        Scanner scanner = new Scanner(new File("SampleCSVFile.csv"));

        //Set the delimiter used in file
        scanner.useDelimiter(",");

        //Get all tokens and store them in some data structure
        //I am just printing them
        while (scanner.hasNext()) 
        {
            System.out.print(scanner.next() + "|");
        }

        //Do not forget to close the scanner  
        scanner.close();
读一行文字。一行被认为是由换行符('\n')、回车符('\r')或紧接着换行符的回车符中的任意一个终止的

因此,如果文本包含换行符
('\n')
,后跟回车符,
BufferedReader
将返回空字符串。考虑以下字符串。

abc\n\rdef

如果您调用
readLine()
三次,将返回
“abc”
“def”
。不仅上面的字符串,下面的字符串也可能导致相同的结果

abc\n\ndef

abc\r\rdef

在文本文件中,它必须包含一个或多个这样的组合。或者,它可能在这些特殊字符之间包含
空格。例如:

abc\n\t\ndef

abc\n\rdef

等等

这就是为什么你会得到一个空行

要解决此问题,可以检查
while循环中的行是否为空

while ((line = csv.readLine()) != null) {
    if(line.trim().isEmpty()){
        continue;
    }
    //Your code
}

请发布有问题的文本文件,不要为您的问题编写“示例”代码;发布你的真实代码。文件中有空行吗?您确定
filename
是真实文件吗?记住,如果你使用反斜杠,你必须逃脱them@PeterJaloveczki这似乎与当前问题没有重复。@doorknop将获得一个
FileNotFoundException
,而不是一个空字符串。谢谢您的回答。这是行不通的。我猜这是我的文件,我必须处理,为什么给它一个-1的值;是的,我的朋友们。。。。我只是写了一个方法,从文件中读取数据并将其存储在一个数组中。我们的答案适合我的问题。它没有抛出任何错误,并且能够返回我所有的行。谢谢你的回复。我尝试了这种方法,但仍然存在错误。我尝试了您的文件,发现您的文件格式错误。您的文件格式如下:00098529 0 0每个字符串都用空格分隔,但不用制表符分隔,因此当您使用拆分(“\t”)时,将一无所获。给定您的文件格式,您应该使用split(“”)或者你应该改变你的文件格式,用tab分隔每个字符串。有没有一种方法我可以在这个网站上传我的文本文件,因为我不确定在这里复制它是否真的有用。你可以在问题中添加一个图像来显示你的数据格式,或者在代码区域中写入你的文件,这将保护你的文件格式。下面是一个简单的方法来测试错误来自文件格式或其他原因。1.创建一个包含00098529 0 0的文件,每个字符串被一个空格分隔。2.创建一个包含00098529 0 0 0的文件,每个字符串被tab分隔。为了方便起见,您可以使用记事本++(一种软件)查看您的文件