【问题标题】:Copy file from application Internal memory to external storage in android?将文件从应用程序内部存储器复制到android中的外部存储器?
【发布时间】:2014-06-12 15:14:00
【问题描述】:

我有一个将数据保存到名为“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文件,然后如果我再次按导出,同样的事情会再次发生,那么我在导出文件时必须重命名我的文件吗?不会有名字冲突吗?我该如何处理?我可以动态命名吗?

谢谢。

编辑:一些更正

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 卡中。

【问题讨论】:

    标签: android memory external file-transfer internal


    【解决方案1】:

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

    【讨论】:

    • 我确实读过它。我保存文件的方法是附加一个包含所有值的数组。我怀疑将已经存在的文件从内部存储器保存到外部存储器的方式,我不是首先要弄清楚文件的位置。
    • 那么你能在你的应用程序中读取你的文件吗?正如我上面提到的,如果你可以阅读它,你可以将它写入外部存储中的另一个文件。
    • 您能详细说明一下吗?我的问题是我不知道如何在内部文件中获取 sensor.txt 的位置并检查它的存在。我已经用解决方案编辑了我的答案。
    猜你喜欢
    • 2015-09-14
    • 2023-03-05
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    相关资源
    最近更新 更多