簡體   English   中英

bufferedreader不會移至下一行

[英]bufferedreader won't move to the next line

晚上好,

我需要從文件中讀取一些行,文件為csv,文件的結構如下:

4,
Mo Farah,30,
Jessica Ennis,27,

我需要讀取這些值並將其放入變量中,這就是我嘗試執行的操作:

  while(nextline != null){
           StringTokenizer st = new StringTokenizer(nextline,",");
           int size = Integer.parseInt(st.nextToken());
           System.out.println(size);

           nextline = reader.readLine();

           StringTokenizer st2 = new StringTokenizer(nextline, ","); //why???


           String name = st2.nextToken();
           System.out.println(name);
           int age = Integer.parseInt(st2.nextToken());

           System.out.println(age);

第一個int(4)讀得很好,但是,如果我想移至下一行,它會引發noSuchElementException,因此我必須在“ // why ???”旁邊寫一行 為了移至下一行,我真的要在每次要移至下一行時實例化一個新的令牌生成器嗎? 還是有更好的方法呢?

非常感謝你

讓我們看看發生了什么

nextline = reader.readLine(); // I'm assuming you have this here
while(nextline != null){

下面將分析行"4,"並將其拆分為由分隔的令牌,它將包含1個令牌: "4"

       StringTokenizer st = new StringTokenizer(nextline,",");

以下將成功執行,但是您確實應該在執行此操作之前檢查st.hasMoreTokens()返回true。 它將使用st的令牌"4" ,該令牌現在不再包含令牌:

       int size = Integer.parseInt(st.nextToken());
       System.out.println(size);

       // We read the next line into "nextline", this is okay but not pretty.
       // Also you need to check that nextline is not `null` here.
       nextline = reader.readLine();

       StringTokenizer st2 = new StringTokenizer(nextline, ","); //why???

為什么?

因為使st解析了行"4," 在解析該行之后分配nextline不會更新st的內部狀態(無法實現)。 這樣根本行不通。 因此,如果您在此處調用st.nextToken() ,則將獲得如您所說的NoSuchElementException 因為您已經從st讀取了"4" ,所以沒有標記了。

如果您想使用StringTokenizer ,那么以下是正確的做法,它將導致將"Mo Farah,30,"行解析為令牌: "Mo Farah""30"

       st = new StringTokenizer(nextline, ","); // Just parse the new line.
       // You can reuse the old st variable as it is now depleted.

現在,以下代碼將從下一行"Mo Farah"返回第一個令牌。 盡管再次,您確實應該首先檢查st.hasMoreTokens()並給出合理的錯誤消息:

       String name = st.nextToken(); // Change from st2 to st
       System.out.println(name);
       int age = Integer.parseInt(st.nextToken()); // Ditto

       System.out.println(age);

因此,簡短的答案是,是的,如果要使用StringTokenizer ,則必須為每行創建一個新的StringTokenizer 如果您不在乎行尾,則可以先讀取所有行並將它們連接起來,然后再將所有行傳遞給StringTokenizer

但是最簡單的方法就是使用String tokens [] = newline.split(“,”); 就像馬克在回答中所做的那樣。

如果我認為csv中的模式始終相同...:

  while(nextline != null){ 

      String[] lecture = reader.readLine().split(",");

       if(lecture.lenght()>0){
                  System.out.println("Name: " + lecture[0]);
               int age = Integer.parseInt(lecture[1]);//you need to int?

                  System.out.println(lecture[1]);
        }
              else
                  System.out.println("Name: " + lecture[0]);
    }

希望這可以幫助...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM