Странные символы при чтении файла на Android

123
13

Я сохраняю JSON файл в частной директории на Android. Проблема в том, что когда я читаю файл, текст дополняется странными символами в конце, и я не уверен, почему это происходит.

Журнал:

E/WRITTEN (25254): {"sex": "MALE", "activity_factor": 1.2, "weight": 0, "height": 180.0, "weight_loss_goal": 0, "age": 30}

E/StartActivity (25254): RELAUNCH 07-03

E/READ (25254): {"sex": "MALE", "activity_factor": 1.2, "weight": 0, "height": 180.0, "weight_loss_goal": 0, "age": 30}?????????????????????????????????????????????????????? (это продолжается и продолжается)

Код ввода/вывода FileWrite:

public class FileUtil
{
public static void writeToFile ( Context context, String filename, String text, int mode ) throws IOException
{
FileOutputStream fos = null;
try
{
fos = context.openFileOutput ( filename, mode );
fos.write ( text.getBytes () );

Log.e("WRITTEN",text);
}
catch ( FileNotFoundException e )
{
throw e;
}
catch ( IOException e )
{
throw e;
}
finally
{
if ( fos != null )
{
try
{
fos.close ();
}
catch ( IOException e )
{

}
}
}
}

public static String readFromFile ( Context context, String fileName ) throws IOException
{
FileInputStream fis = null;

StringBuilder content = new StringBuilder ( "" );
try
{
byte [] buffer = new byte [1024];
fis = context.openFileInput ( fileName );

while ( fis.read ( buffer ) != -1 )
{
content.append ( new String ( buffer ) );
}
}
catch ( FileNotFoundException e )
{
throw e;
}
catch ( IOException e )
{
throw e;
}
finally
{
if ( fis != null )
{
try
{
fis.close ();
}
catch ( IOException e )
{
// TODO Auto-generated catch block
e.printStackTrace ();
}
}
}
Log.e("READ",content.toString ());
return content.toString ();
}
}

спросил(а) 2021-01-19T17:15:53+03:00 2 месяца, 3 недели назад
1
Решение
75

Вы предполагаете, что весь буфер с 1024 байтами заполнен чтением, что будет иметь место только в том случае, если файл по крайней мере длинный. По-видимому, это не так, поэтому вы показываете много неинициализированной памяти за пределами места, где чтение остановилось.

Возвращаемое значение версии read(), которую вы используете, - это количество прочитанных байтов. Сохраните это в переменной вместо проверки только отказа, а затем попытайтесь использовать только это количество байтов.

ответил(а) 2021-01-19T17:15:53+03:00 2 месяца, 3 недели назад
44

При чтении файла используйте новый InputStreamReader (is, "windows-1252"). Это должно решить проблему.

ответил(а) 2021-01-19T17:15:53+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема