Следующее исправление работает хорошо для меня.
// I am using Struts2
ServletContext sc = (ServletContext) ac.get(StrutsStatics.SERVLET_CONTEXT);
fileInputStream = sc.getResourceAsStream("test.xls");
После развертывания файла war я могу получить файл из контекстного пути.
Да, Java использует кодировку в стиле UTF-16 для внутреннего представления строк и, да, она кодирует символы вне базовой многоязычной плоскости ( BMP ) с использованием Схема суррогатного материнства.
Если вы знаете, что будете иметь дело с символами вне BMP, то вот канонический способ перебора символов строки Java:
final int length = s.length();
for (int offset = 0; offset < length; ) {
final int codepoint = s.codePointAt(offset);
// do something with the codepoint
offset += Character.charCount(codepoint);
}
Итерация по кодовым точкам подается в Sun как запрос функции.
См. Sun Bug Entry
Там также есть пример того, как перебирать String CodePoints.