Ява раскол запутанный пробел - PullRequest
0 голосов
/ 14 апреля 2011

Я разбиваю строку, которая содержит имя файла из системы Windows. Строка использует ascii FS для отделения имени файла от другой информации

например. filename.jpgFSotherInformationFSanotherPartOfInformation

Вот пример кода:

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

Почему split смешивает пробел с ascii-FS?

Должен ли я использовать другую функцию, которая разделяет? Pattern.quote (FS) тоже помогает ...: - (

Ответы [ 4 ]

1 голос
/ 14 апреля 2011

Вы инициализировали fs пробелом (довольно сложным способом). Следующее равно и показывает вашу проблему:

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

ascii char FS имеет номер 0x1C, поэтому это должно работать правильно:

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

Справочная информация

Разделитель файлов FS представляет собой интересный управляющий код, поскольку он дает нам представление о том, как компьютерные технологии были организованы в шестидесятых годах. Сейчас мы привыкли к носителям с произвольным доступом, таким как RAM и магнитные диски, но когда был определен стандарт ASCII, большинство данных были последовательными. Я говорю не только о последовательной связи, но и о последовательном хранении, таком как перфокарты, бумажная лента и магнитные ленты. В такой ситуации очевидно, что эффективнее иметь один управляющий код для сигнализации о разделении двух файлов. ФС была определена для этой цели. (источник)

FS был изобретен для разделения реальных файлов , а не имен файлов в иерархической директории файлов. Технически, да, вы можете использовать его, но оно имеет другое значение.

1 голос
/ 14 апреля 2011

Поскольку FS не является значением ascii 32.

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

FS - это символ 28, но этот управляющий символ не должен использоваться в именах файлов, только в некоторых редких случаях.бинарные форматы файлов (я не знаю ни одного, который использует его больше)

Символ пробела равен 32, поэтому он выглядит так же, как разделение, потому что это так.

Для простогоПолевой разделитель, я предлагаю вам использовать ',' или '\ t', которые можно легко прочитать как текст или с помощью пакета электронных таблиц.

Я бы предложил пройтись по коду в отладчике, чтобы вы могли увидеть, что выПрограмма делает.

0 голосов
/ 14 апреля 2011

Параметр Split на самом деле является регулярным выражением, вы пробовали

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

Или даже

String[] parts = information.split("\\s");
0 голосов
/ 14 апреля 2011

Из-за значений 28

Значение Ascii 32 равно space

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...