2012-07-10 207 views
13

我使用一個標籤(/噸)作爲分隔符,我知道有我的數據,例如一些空字段:的Java StringTokenizer.nextToken()跳過空字段

one->two->->three 

在哪裏 - >等於標籤。正如你所看到的,一個空的字段仍然被標籤正確包圍。 數據使用循環收集:

while ((strLine = br.readLine()) != null) { 
    StringTokenizer st = new StringTokenizer(strLine, "\t"); 
    String test = st.nextToken(); 
    ... 
    } 

然而,Java的忽略這個「空字符串」,並跳過領域。

有沒有辦法規避這種行爲並強制java讀空字段?

+4

使用'string.split(「\ t」的)'代替。 – 2012-07-10 08:23:33

+3

來自String文檔的String tokenizer「StringTokenizer是一個遺留類,爲了兼容性的原因,雖然在新代碼中不鼓勵使用它,但建議任何尋求這種功能的人都使用String的split方法或java.util.regex取而代之。「 – Inquisitive 2012-07-10 08:35:26

+1

只看起來,它看起來像使用'string.split(「\ t」)'不會返回任何尾隨空的標記。如果這很重要,請使用'string.split(「\ t」,-1)'。 – Oded 2015-11-21 18:10:11

回答

7

謝謝都沒有。由於第一個評論我能夠找到一個解決方案: 是的,你是對的,謝謝你的參考:

Scanner s = new Scanner(new File("data.txt")); 
while (s.hasNextLine()) { 
     String line = s.nextLine(); 
     String[] items= line.split("\t", -1); 
     System.out.println(items[5]); 
     //System.out.println(Arrays.toString(cols)); 
} 
0

正如你可以在Java文檔看http://docs.oracle.com/javase/6/docs/api/java/util/StringTokenizer.html你可以returnDelimstrue

所以返回每個分隔符作爲一個單獨的字符串中使用構造public StringTokenizer(String str, String delim, boolean returnDelims)

編輯:

不要使用這種方式,因爲@npe已經打了出來,StringTokenizer的不應該使用!見的JavaDoc:

的StringTokenizer是一個遺留類被保留兼容性 原因雖然它的使用在新代碼氣餒。建議 ,任何人尋求此功能使用的Stringsplit方法或java.util.regex包來替代。

+0

我仍然面臨的問題是,我有相互背後的多個選項卡(表明blanc字段)空白值不放入數組..如何解決這個問題? – FireFox 2012-07-11 12:38:11

+0

returnDelims返回分隔符。這並沒有回答這個問題。 – 2017-04-11 11:49:57

15

有關於此StringTokenizer問題的RFE in the Sun's bug database狀態Will not fix

這個RFE狀態的評價,我引用:

隨着1.4.0添加java.util.regex包,我們有 基本廢棄需要StringTokenizer。出於兼容性原因,我們不會刪除 類。但regex只給你你需要的東西。

然後建議使用String#split(String)方法。

1

我會用Guava's Splitter,這並不需要所有的大正則表達式的機械,更乖巧比字符串的split()方法:

Iterable<String> parts = Splitter.on('\t').split(string); 
+3

打電話給我偏執狂,但我真的不認爲引入一個如此簡單的東西(更不用說包括在標準庫中)的新的依賴是有點矯枉過正。我仍然欣賞關於番石榴分流器不需要正則表達式的信息:) – posdef 2012-07-10 08:33:44

+0

我同意,一般來說,但番石榴是如此有用,並提供了很多額外的有用類,它幾乎是我所有項目的「默認」依賴項的一部分(除非它是非常小的自包含庫)。 – 2012-07-10 08:41:54

+0

番石榴確實很棒。我還沒有完全探索Guava的迷人之處,因此學習新東西總是很好的。 – posdef 2012-07-10 09:09:01