1-й символ исчезает после записи и чтения строки в файл - PullRequest
0 голосов
/ 31 октября 2011

Прежде всего, извините, мой бедный английский, пожалуйста. Я пытаюсь написать функцию, которая отправляет информацию о том, что такое видео на сервер. Когда сервер недоступен, он записывает его в файл и отправляет позже. Итак, я отправляю имя файла в свою функцию, загружаю файл с неотправленными именами, создаю массив имен и отправляю их все по одному. Если появятся какие-либо ошибки, запишите их обратно в файл.

Проблема в том, что при открытии сохраненного файла 1-й символ строки исчезает. Не сомневайтесь, когда axaclty: при записи или чтении файла.

Вот мой код (он содержит некоторые ненужные операции. Он предназначен для тестирования):

     void sendLog (String name) {
            String FILENAME = "Log";
            String strToSave = "";
            String logString = null;
//opening file, just to see what it cantains:
            FileInputStream fis;
            try {
                    fis = openFileInput(FILENAME);
                    fis.read();
                     ByteArrayOutputStream content = new ByteArrayOutputStream();
                     int readBytes = 0;
                     byte[] sBuffer = new byte[512];
                     while ((readBytes = fis.read(sBuffer)) != -1) {
                         content.write(sBuffer, 0, readBytes);
                         }
                     logString = new String(content.toByteArray());
                 fis.close();
                 Log.d ("Log", "Loaded log: '"+logString+"'");
                } catch (IOException e) {
                    e.printStackTrace();
                } 
            //saving empty file.
            FileOutputStream fos;
            try {
                Log.d ("Log", "Saving log: '"+strToSave+"'");
                fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
                fos.write(strToSave.getBytes());
                fos.close();
            } catch (IOException e) {
                Log.d ("File WRITE", "can't write Log file");
                e.printStackTrace();
            } 


               //opening it agane, allready empty.
               try {
                    fis = openFileInput(FILENAME);
                    fis.read();
                     ByteArrayOutputStream content = new ByteArrayOutputStream();
                     int readBytes = 0;
                     byte[] sBuffer = new byte[512];
                     while ((readBytes = fis.read(sBuffer)) != -1) {
                         content.write(sBuffer, 0, readBytes);
                         }
                     logString = new String(content.toByteArray());
                    fis.close();
                    Log.d ("Log", "Loaded log: '"+logString+"'");
                } catch (IOException e) {
                    e.printStackTrace();
                } 
                int cnt;
                //splitting loaded string to array
                if (logString.length()>1) {
                    logString = logString+name+",";
                    Log.d ("Log", "spliting log. length: "+logString.length());
                    log = logString.split(",");
                    long length = logString.length();
                    long length2 = 0;
                    cnt = 0;

//sorry for this code. Is there a better solution to know, how many strings in array?
                    for (int i = 0; length2<length; i++) {
                        length2 += playList[i].length()+1;
                        cnt++;
                    }
                }
                else {
                    log = new String[1];
                    log[0] = name+",";
                    cnt = 1;
                }
            //sending them one by one
                for (int i = 0; i<cnt; i++) { //playList[i].substring(2, playList[i].length()-1)
                    Log.d ("Log", "Sending log: '"+log[i].substring(0, log[i].length()-1) + "'");

                        HttpClient client = new DefaultHttpClient();
                        HttpGet request = new HttpGet("server link here"
                       +log[i].substring(0, log[i].length()-1)); //need to exclude ","
                        try {
                            HttpResponse response = client.execute(request);
                        } catch (ClientProtocolException e) {
//adding unsended name to string if any errors
                            strToSave = strToSave+log[i];
                            e.printStackTrace();
                        } catch (IOException e) {
                            strToSave = strToSave+log[i];
                            e.printStackTrace();
                        }
                }
//here should be empty string, but for testing i'm adding some:
            if (strToSave.length() == 0) strToSave = strToSave+log[0];//strToSave = " ";
            //saving it to file
            try {
                Log.d ("Log", "Saving log: '"+strToSave+"'");
                fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
                fos.write(strToSave.getBytes());
                fos.close();
            } catch (IOException e) {
                Log.d ("File WRITE", "can't write Log file");
                e.printStackTrace();
            } 

        }

Итак, вот логин DDMS:

10-31 09:23:17.446: DEBUG/Log(2571): Loaded log: 'UB_MENUS,'
10-31 09:23:17.446: DEBUG/Log(2571): Saving log: ''
10-31 09:23:17.446: DEBUG/Log(2571): Loaded log: ''
10-31 09:23:17.446: DEBUG/Log(2571): Sending log: 'UPLOAD_SCREEN'
10-31 09:23:17.746: DEBUG/Log(2571): Saving log: 'UPLOAD_SCREEN,'
10-31 09:23:39.386: DEBUG/Log(2571): Loaded log: 'PLOAD_SCREEN,'
10-31 09:23:39.386: DEBUG/Log(2571): Saving log: ''
10-31 09:23:39.386: DEBUG/Log(2571): Loaded log: ''
10-31 09:23:39.386: DEBUG/Log(2571): Sending log: 'APP_BUTTON'
10-31 09:23:39.646: DEBUG/Log(2571): Saving log: 'APP_BUTTON,'

...

и т. Д.

1 Ответ

0 голосов
/ 31 октября 2011

Что такое это?

try {
    fis = openFileInput(FILENAME);

    //********************************************
    fis.read();   // <<-- Danger, Will Robinson !!
    //********************************************

    ByteArrayOutputStream content = new ByteArrayOutputStream();
    int readBytes = 0;
    byte[] sBuffer = new byte[512];
    while ((readBytes = fis.read(sBuffer)) != -1) {
        content.write(sBuffer, 0, readBytes);
    }
    logString = new String(content.toByteArray());
    fis.close();
    Log.d ("Log", "Loaded log: '"+logString+"'");
} catch (IOException e) {
    e.printStackTrace();
} 

Этот голый fis.read() собирается прочитать первый байт и выбросить его.Затем вы прочитаете остаток входного потока, чтобы заполнить sBuffer.Это наиболее вероятная причина вашего пропавшего персонажа.

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