2011-04-14 87 views
0

我分裂一個字符串,其中包含從Windows系統的文件名。該字符串使用ascii FS將文件名與其他信息分開java拆分混淆空間字符

例如, filename.jpgFSotherInformationFSanotherPartOfInformation

這裏是一些示例代碼:

String fs = new String(new byte[]{(byte)32}); 
String information ="filename (copy).jpg"+fs+"otherInformation"; 
String[] parts = information.split(fs); 

爲什麼分裂混淆空間分隔與ascii-FS?

我應該使用不同的功能拆分嗎? Pattern.quote(FS)確實有助於要麼... :-(

回答

1

因爲FS是不是ASCII值32

http://bestofthisweb.com/blogs/tag/ascii-table/

FS是字符28,但不應該使用這個控制字符在文件名中,只對一些罕見的二進制文件格式(我不知道其中一個使用它了的)

空格字符是32這就是爲什麼它看起來是一樣的分裂,因爲它是。

爲了一個簡單字段分隔符,我建議你使用','或'\ t',它可以很容易地閱讀爲文本或使用電子表格軟件包。

我建議在調試器中單步執行代碼,這樣你就可以看到你的程序在做什麼。

+0

那解釋一切。我需要fs作爲文件名中沒有使用的字符,所以fs是完美的。 – 2011-04-14 11:54:10

+1

在Linux上,除了二進制零「\ 0」和路徑分隔符斜槓'/'外,每個字符都允許使用文件名。 – 2011-04-14 12:17:46

+0

@ Hans-Wurscht,我會說TB' \ t'更好,因爲它更容易閱讀。例如您可以將數據加載到Excel或Open Office中。正如@user unknown指出的那樣,在UNIX上,FS或TB可以是文件名,所以如果你真的擔心它,我會使用'\ 0'或者不同的格式。例如有領域前的每個領域的長度。例如writeUTF()/ readUTF()這允許字段中的任何字符。 – 2011-04-14 12:27:08

1

你已經用一個空格初始化了fs(用相當複雜的方式)。以下是平等的,並顯示您的問題:

String fs = " "; 
String information ="filename (copy).jpg"+fs+"otherInformation"; 
String[] parts = information.split(fs); 

的ASCII字符FS擁有數0x1C,所以這應該正常工作:

String fs = "\u001C"; 
String information ="filename (copy).jpg"+fs+"otherInformation"; 
String[] parts = information.split(fs); 

背景資料

文件分隔符FS是一個有趣的控制代碼,因爲它讓我們瞭解了六十年代計算機技術的組織方式。我們現在習慣於RAM和磁盤之類的隨機訪問介質,但是當定義ASCII標準時,大多數數據都是串行的。我不僅在談論串行通信,還談到串行存儲如打孔卡,紙帶和磁帶。在這種情況下,使用單個控制代碼發送兩個文件的分隔信號顯然是有效的。 FS是爲此目的而定義的。 (source)

FS被髮明分離真正文件而不是在分層文件目錄。技術上,是的,你可以使用它,但它有不同的含義。

+0

或者甚至是'char fs = 28;' – 2011-04-14 11:17:10

+0

@Peter - 如果涉及到我仍然是一個老式的十六進制傢伙ascii的代碼;) – 2011-04-14 11:19:07

+0

我記得編程我的8086之前,我用十六進制編譯我的所有文本兩年之前;)如何'char fs = 0x1C;' – 2011-04-14 11:22:12

0

怎麼一回事,因爲FS是ASCII值28

ASCII值32是space

0

拆分的參數實際上是一個正則表達式,你嘗試過

String[] parts = information.split("\\x20"); 

甚至

String[] parts = information.split("\\s");