readLine()方法返回空String,BufferedReader

时间:2013-08-30 12:10:51

标签: 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){ 
    String[] data = line.split("\t");
    Double score = Double.parseDouble(data[2])-Double.parseDouble(data[3]);
}

调用split()后,会抛出异常Arrayindexoutofboundsexception 下面是文本文件。每行以"a"开头,后跟一个数字。代码能够使用单词apocrine检索行,但不能使用单词eccrine检索行。当我在调试模式下运行时,行变量返回为空字符串。

  大汗腺#1(外分泌腺)产生分泌物,其中部分分泌细胞随分泌物释放; “母乳是一种大汗腺分泌物”

     一个外分泌腺体#1(外分泌腺)产生明显的水分泌而不释放部分分泌细胞;对调节体温很重要

     <000> a 00098933 0 0自流#1(水)上升到   内部静水压力下的表面; “一个自流井”; “自流压力”

我应该使用其他构造来读取文本文件中的行

6 个答案:

答案 0 :(得分:1)

您可以在以下BufferedReader中的readline()的javadoc中看到..

  

读取一行文字。一条线被认为是由换行符('\ n'),回车符('\ r')或回车符后面的任何一个终止。

因此,如果文本包含换行符('\n')后跟回车符,则BufferedReader将返回一个空字符串。请考虑遵循String。

  

ABC \ n \ rdef

如果您拨打"abc" 3次,这将返回"""def"readLine()。不仅上面的String,以下String也可能导致相同的结果。

  

ABC \ n \ NDEF

     

ABC \ r \ rdef

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

  

ABC \ n \吨\ NDEF

     

abc \ n \ rdef

     

依旧......

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

要解决此问题,您可以检查while-loop中的行是否为空。

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

答案 1 :(得分:0)

尝试使用扫描仪:

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

答案 2 :(得分:0)

阅读每一行:

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

如果这不起作用,那么我认为你的文本文件有问题。

答案 3 :(得分:0)

        //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();

答案 4 :(得分:-1)

以下是从文件中读取数据的示例方法。
在阅读完每个行后,将其添加到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;
    }

答案 5 :(得分:-1)

关键是你错误地使用BufferedReader,如果你使用像

这样的FileReader
new FileReader( filename ) 

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

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

我试过你的文件,发现你的文件格式错了。你的文件格式如下:a 00098529 0 0每个字符串用空格分隔但不是tab,所以当你使用split(“\ t”)时你什么也得不到。给定您的文件格式,您应该使用split(“”)或者您应该通过将每个字符串除以tab来更改文件格式