【问题标题】:readLine() method returns empty String, BufferedReaderreadLine() 方法返回空字符串,BufferedReader
【发布时间】:2013-08-30 12:10:50
【问题描述】:

我正在执行 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 的行。当我在调试模式下运行时,行变量返回为空字符串。

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

a 00098736 0.25 0 eccrine#1(外分泌腺)产生清澈的水性分泌物,但不释放部分分泌细胞;对调节体温很重要

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

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

【问题讨论】:

  • 请发布有问题的文本文件,不要为您的问题编写“示例”代码;发布您的真实代码。文件中有空行吗?
  • 确定 filename 是真实文件吗?请记住,如果您使用反斜杠,则必须转义它们
  • @PeterJaloveczki 这似乎与当前问题没有重复。
  • @Doorknob 这将得到一个FileNotFoundException,而不是一个空字符串。

标签: java readline


【解决方案1】:

您可以在BufferedReaderreadline() 的javadoc 中看到以下内容..

读取一行文本。行被视为由换行符 ('\n')、回车符 ('\r') 或回车符后紧跟换行符中的任何一种来终止。

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

abc\n\rdef

如果您调用readLine() 3 次,这将返回"abc""""def"。不仅是上面的String,下面的String也可能会导致同样的结果。

abc\n\ndef

abc\r\rdef

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

abc\n\t\ndef

abc\n \rdef

等等……

这就是你得到一个空行的原因。

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 为什么给它一个-1值;是对的我的朋友们......我只是写了一个方法来从文件中读取数据并将其存储在一个ArrayList中
    • 您的回答适合我的问题。它没有抛出任何错误,并且能够将所有行都返回给我。谢谢
    【解决方案3】:

    读取每一行:

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

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

    【讨论】:

    • 感谢您的回复。这不起作用。我想这是我的文件,我必须照顾好
    【解决方案4】:

    尝试使用扫描仪:

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

    【讨论】:

      【解决方案5】:
              //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();
      

      【讨论】:

      • 但也会尝试你的方法
      【解决方案6】:

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

      new FileReader( filename ) 
      

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

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

      我试了你的文件,发现你的文件格式不对。您的文件格式如下:a 00098529 0 0 每个字符串都由空格分隔,但不是制表符,因此当您使用 split("\t") 时,您什么也得不到。给定您的文件格式,您应该使用 split(" ") 或者您应该通过用制表符分隔每个字符串来更改文件格式

      【讨论】:

      • 感谢您的回复。我试过这种方法,但仍然存在错误
      • 我试了你的文件,发现你的文件格式不对。您的文件格式如下:a 00098529 0 0 每个字符串都由空格分隔,但不是制表符,因此当您使用 split("\t") 时,您什么也得不到。给定您的文件格式,您应该使用 split(" ") 或者您应该通过用制表符分隔每个字符串来更改文件格式
      • 有没有办法可以将我的文本文件上传到这个网站,因为我不确定在这里复制它是否真的有帮助
      • 您可以在问题中添加图像以显示您的数据格式或将您的文件写入代码区域以保护您的文件格式。
      • 这里有一个简单的方法来测试错误是来自文件格式还是其他原因。 1.创建一个文件,其中包含一个00098529 0 0,每个字符串用一个空格分隔。 2.创建一个文件,其中包含一个00098529 0 0,每个字符串由制表符分隔。为方便起见,您可以使用 notepad++(一种软件)来查看您的文件。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多