区切り文字としてタブ(/ t)を使用していますが、データに空のフィールドがいくつかあることを知っています。例:
one->two->->three
ここで、->はタブと同じです。ご覧のとおり、空のフィールドはまだタブで正しく囲まれています。データはループを使用して収集されます:
while ((strLine = br.readLine()) != null) {
StringTokenizer st = new StringTokenizer(strLine, "\t");
String test = st.nextToken();
...
}
しかし、Javaはこの「空の文字列」を無視し、フィールドをスキップします。
この動作を回避し、とにかく空のフィールドを読み取るようにJavaを強制する方法はありますか?
どうもありがとうございました。最初のコメントのために私は解決策を見つけることができました:はい、あなたは正しいです、あなたの参照に感謝します:
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));
}
SunのバグデータベースのRFE このStringTokenizer
の問題についてステータス_Will not fix
_があります。
このRFEの評価は、次のように述べています。
_
Java.util.regex
_に_1.4.0
_パッケージが追加されたことで、基本的にStringTokenizer
の必要性がなくなりました。互換性の理由からクラスを削除しません。しかし、regex
は単に必要なものを提供します。
そして、 String#split(String)
メソッドの使用を提案します。
Apache
Commons StringUtils.splitPreserveAllTokens() を使用できます。それはまさにあなたが必要とすることをします。
Guava's Splitter を使用します。これは、すべての大きな正規表現機構を必要とせず、Stringのsplit()
メソッドよりも動作が優れています。
Iterable<String> parts = Splitter.on('\t').split(string);
Java Doc http://docs.Oracle.com/javase/6/docs/api/Java/util/StringTokenizer.html あなたに見られるようにコンストラクタpublic StringTokenizer(String str, String delim, boolean returnDelims)
をreturnDelims
true
とともに使用できます
したがって、各区切り文字を個別の文字列として返します。
編集:
しないでください @npeはすでに入力されているため、この方法を使用してください。StringTokenizerはこれ以上使用しないでください。 JavaDocを参照してください。
StringTokenizerはレガシークラスであり、互換性の理由で保持されます使用されますが新しいコードでは推奨されません。この機能をお探しの方は、代わりに
split
またはJava.util.regex
パッケージのString
メソッドを使用することをお勧めします。