У меня странная проблема в Java с символом спецификации <feff>
.Мой код в основном считывает некоторые данные из БД, сохраняет их в JSONArray, затем изменяет их формат в соответствии с форматом, требуемым сервером, и, наконец, записывает их в файл.Вот как в настоящее время хранятся данные SYSTEM_ROLE|INSTITUTION_ROLE|ROW_STATUS|AVAILABLE_IND|EXTERNAL_PERSON_KEY|USER_ID|PASSWD|TITLE|FIRSTNAME|LASTNAME|GENDER|COUNTRY|CITY|EMAIL|H_PHONE_1|M_PHONE|BIRTHDATE|JOB_TITLE|STUDENT_ID
<feff>none|P_Unified_Program|Enabled|Y|xxxxxx@xxxxxx|xxxxxx|xxxxxx|Mr.|xxxxxx|xxxxxx|M|xxxxxx|xxxxxx (xxxxxx|xxxxxx@xxxxxx|xxxxxx|xxxxxx|05/07/2000|(xxxxxx|xxxxxx
none|P_Unified_Program|Enabled|Y|xxxxxx@xxxxxx|xxxxxx|xxxxxx|Mr.|xxxxxx|xxxxxx|M|xxxxxx|xxxxxx (xxxxxx)|xxxxxx@xxxxxx|xxxxxx|xxxxxx|xxxxxx|(xxxxxx|xxxxxx
обратите внимание на символ во второй строке.Странная вещь, что этот символ не появляется в первом ряду.Вот как я пишу данные в соответствии с форматом, требуемым сервером
public static String rawDBformat(JSONArray json, String[] columnsnames) {
if (json.length() == 0 || columnsnames.length == 0) {
logger.error("either the jsons' or the arrays' length passed to internaltoDBformat equal to zero " + json.toString());
throw new IllegalArgumentException("either the strings' or the arrays' length passed to toDBformat equal to zero");
}
int numberofcolumns = columnsnames.length;
String temp = "";
String res = "";
JSONObject jsonobj=null;
jsonobj = json.getJSONObject(0);
temp = jsonobj.getString(columnsnames[0]);
for (int j = 1; j < numberofcolumns; j++) {
temp += '|' + jsonobj.getString(columnsnames[j]);
}
res += temp + "\n";
for (int i = 0; i < json.length(); i++) {
jsonobj = json.getJSONObject(i);
temp = jsonobj.getString(columnsnames[0]);
for (int j = 1; j < numberofcolumns; j++) {
temp += '|' + jsonobj.getString(columnsnames[j]);
}
res += temp + "\n";
}
return res;
}
Так я пишу в файл
public static void writetofile(File file, String data) throws
IOException {
OutputStreamWriter outputstream = null;
FileOutputStream fos = null;
try {
logger.info("writing some data to " +
file.getCanonicalPath());
fos = new FileOutputStream(file, true);
outputstream = new
OutputStreamWriter(fos,StandardCharsets.UTF_16);
outputstream.write(data);
fos.flush();
outputstream.flush();
} catch (Exception ex) {
logger.error("An Exception occared", ex);
} finally {
try {
fos.close();
outputstream.close();
} catch (Exception ex) {
logger.error("An Exception occared", ex);
}
}
}
Так используются оба writetofile(assign, rawDBformat(res.json, res.columnsNames));
assign
- это файл, res.json
- это JSONArray, а res.columnsNames
- это строковый массив.
Сначала я думал, что char был добавлен в функцию rawDBformat, поэтому я попытался return res.substring(1);
, но этого не произошлоработа, в итоге возвращаются исходные данные без первого символа.Также я заметил, что char добавляется каждый раз, когда вызывается writetofile
, но не в первый раз, когда пишет заголовок.Есть идеи, как это решить ???