2011-04-14 88 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");