将文件从应用程序内存复制到android中的外部存储?

时间:2014-04-27 00:14:46

标签: android memory external file-transfer internal

我有一个应用程序将数据保存到名为'sensorLog.txt'的文件中。我不确定它存储在哪里,但我知道这只能由应用程序访问,并且它位于内部存储器中。

当我点击“导出”按钮时,我希望能够将当前文件的副本写入外部存储。我已粘贴了一小部分程序,但我不确定如何将sensorLog.txt文件复制到外部存储器。

    public class MainActivity extends Activity {

    private static final String DEBUG_TAG = "MainActivity";

    private Button buttonStartService;
    private Button buttonStopService;
    private Button buttonSettings;
    private Button buttonExport;

    private TextView textStatus;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Context context = getApplicationContext();
        setContentView(R.layout.activity_main);

        buttonStartService = (Button) findViewById(R.id.button_start_service);
        buttonStopService = (Button) findViewById(R.id.button_stop_service);
        buttonSettings = (Button) findViewById(R.id.button_settings);
        buttonExport = (Button) findViewById(R.id.button_export);

        textStatus = (TextView) findViewById(R.id.text_status);


        buttonStartService.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                startSensorService();
            }
        });

        buttonStopService.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                stopSensorService();
            }
        });
        //export button listener

        buttonExport.setOnClickListener(export_handler);
    }

    public void startSensorService() {
        // Schedule
        AlarmManager scheduler = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(getApplicationContext(), SensorService.class);
        PendingIntent scheduledIntent = PendingIntent.getService(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

        // 30 seconds
        long interval = 30 * 1000;

        scheduler.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), interval, scheduledIntent);

        Log.d(DEBUG_TAG, "Service started");

    }

    public void stopSensorService() {
        // Cancel
        AlarmManager scheduler = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(this, SensorService.class);
        PendingIntent scheduledIntent = PendingIntent.getService(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

        scheduler.cancel(scheduledIntent);
        Log.d(DEBUG_TAG, "Service stopped");

    }

    View.OnClickListener export_handler = new View.OnClickListener() {

        public void onClick(View v)
        {
            // Here is the part I am not sure what to do. I want to copy a file    sensorLog.txt that has all my sensor information to sd card

            String state = Environment.getExternalStorageState();

            if (Environment.MEDIA_MOUNTED.equals(state))
            {
                Log.d(DEBUG_TAG, "SD card detected");



            stopSensorService();

             File file = new File(Environment.getExternalStoragePublicDirectory(
                        Environment.DIRECTORY_DOCUMENTS),"SensorLog.txt");








             // delete file from the internal storage once exported
             context.deleteFile("SensorLog.txt");












            startSensorService();



        }
            else

            {
                Log.d(DEBUG_TAG, "No external storage detected(cannot copy file)");
            }
        }
    };

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

我创建sensorLog.txt ***的部分(我不认为有必要阅读此问题,但以防有人需要) *

private class SensorServiceLoggerTask extends AsyncTask<SensorFrame, Void, Void> {

        @Override
        protected Void doInBackground(SensorFrame... frames) {
            SensorFrame frame = frames[0];

            BufferedWriter bufWr = null;
            try {
                File file = new File(getApplicationContext().getFilesDir(), "SensorLog.txt");
                if (file.exists()) {
                    // Write to new file
                    bufWr = new BufferedWriter(new FileWriter(file, true));

                } else {
                    file.createNewFile();
                    Log.d(DEBUG_TAG, "New log file created");
                    // Append to existing file
                    bufWr = new BufferedWriter(new FileWriter(file, false));
                    // Write header
                    bufWr.append(sensorHeader.toString());
                }
                // Write frame
                bufWr.append(sensorFrame.toString());
                bufWr.flush();
                Log.d(DEBUG_TAG, "Added frame to log");
            } catch (IOException ex) {
                // TODO: useful error handling
            } finally {
                // Cleanup
                if (bufWr != null) {
                    try {
                        bufWr.close();
                    } catch (IOException ex) {
                        // TODO: useful error handling
                    }
                }
            }
            return null;
        }
    }

我还有2个查询:

  1. 假设我想在移动之前在文件顶部附加一些信息,我该怎么办呢?

  2. 我的目标是在按下导出按钮时将sensorLog.txt文件从内部存储器传输到外部存储器。删除或清空内部的sensorLog.txt文件然后如果我再次按导出再次发生同样的事情,那么当我导出它时我将不得不重命名我的文件?会不会有名字冲突?我该如何处理?我能动态地给出一个名字吗?

  3. 谢谢。

    编辑:一些更正

    View.OnClickListener export_handler = new View.OnClickListener() {
    
            public void onClick(View v)
            {
    
                String state = Environment.getExternalStorageState();
    
                if (Environment.MEDIA_MOUNTED.equals(state))
                {
                    Log.d(DEBUG_TAG, "SD card detected");
    
    
    
                stopSensorService();
    
                    Log.d(DEBUG_TAG, "stopSensorService for file transfer");
    
                    //make the timestamp the file name
                    long TS = System.currentTimeMillis();
                    StringBuilder stringBuilder = new StringBuilder();
    
                    stringBuilder.append(TS);
                    stringBuilder.append(".txt");
    
                    String file_name = stringBuilder.toString();
    
                    //file name stored in file_name
    
    
                    File file_ext = new File(Environment.getExternalStoragePublicDirectory(
                            Environment.DIRECTORY_DOCUMENTS),file_name);
    
    
    // attempt to create this new directory
    
    
    //read from sensorLog.txt file
                    try
                    {
                        file_ext.createNewFile();
    
                        File file = getBaseContext().getFileStreamPath("sensorLog.txt");
                        if(file.exists())
                        {
    
    
    
                        FileInputStream read_file = openFileInput("sensorLog.txt");
    
    
    
    
    
    
                    //read contents of internal file
                    InputStreamReader inputStreamReader = new InputStreamReader(read_file);
                    BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
                    StringBuilder sb = new StringBuilder();
                    sb.append("Timestamp of export to SD"+TS+"/n");
                    String line;
                    while ((line = bufferedReader.readLine()) != null) {
                        sb.append(line);
                    }
                    BufferedWriter bufWr = null;
    
                   bufWr = new BufferedWriter(new FileWriter(file_ext, false));
    
    
    
                    // Write header
                    bufWr.append(sb.toString());
                    inputStreamReader.close();
                    bufWr.close();
                    read_file.close();
    
    
    
    
                    //delete sensor file once exported
                    getApplicationContext().deleteFile("sensorLog.txt");
                        }
    
                }
    
                    catch(Exception e){}
    

    但由于某种原因,我的文件没有存储在SD卡中。

1 个答案:

答案 0 :(得分:-1)

查看Android documentation。如果您可以读取sensorLog.txt文件,则可以将其保存在String中,然后将该字符串保存到外部存储器中的文件中。