2013-07-03 4 views
0

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

Вход:

Е/ПИСЬМЕННЫЙ (25254): { "пол": "мужской", "activity_factor": 1.2, "вес": 0, "высота": 180,0,» weight_loss_goal ": 0," возраст ": 30}

Е/StartActivity (25254): Relaunch 07-03

Е/ЧТЕНИЕ (25254): {" пол ":" мужскими», "activity_factor" : 1.2, "вес": 0, "высота": 180,0, "weight_loss_goal": 0, "возраст": 30} ??????????????????????? ?????????????????????????????????????????????? ??????????????????????? .. (это продолжается и дальше и дальше)

FileWrite I/O код:

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(); 
    } 
} 
+0

Ну что это за «режим» в этом случае? И файл существовал заранее? Плохая идея использовать String.getBytes без указания кодировки, между прочим. –

+0

Попробуйте использовать 'text.getBytes (« UTF-8 »)' и 'new String (buffer,« UTF-8 »)'. –

+0

Я не знал этого, я следил за примером на странице разработчика Android. Несмотря на это, он все еще не работает. –

ответ

2

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

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

+0

Должен был это видеть. Благодаря :) –

0

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

Смежные вопросы