SQLite Database App에 대한 백업/복원 (내보내기/가져 오기) 프로세스를 만드는 중입니다.외부에서 만든 파일에 어떻게 액세스합니까? 파일이 어디 있니?
필자는 파일을 생성하여 채 웠지만 (이제 알았습니다.) DDMS 나 Windows 탐색기에서 파일을 볼 수 없습니다. 나는 정말로 후자를 할 수 있기를 바란다. (더 구체적인 질문은 아래를 보라).
는 내가 성공적으로 파일을 작성하고 다음 코드를 사용하여 파일을 읽은: 앱 실행이 실패 설치할 때 쇼 (필터로 외부 입력을 사용하여) 로그
이package mjt.sqlitetutorial;
import android.database.Cursor; //+++++ Added
import android.os.Build;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log; //+++++ Added
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class MainActivity extends AppCompatActivity {
public int API_VERSION = Build.VERSION.SDK_INT;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (API_VERSION >= 23) {
ExternalStoragePermissions.verifyStoragePermissions(this);
}
final String EXTSTGTAG = "EXTERNSTG";
File file = getExternalFilesDir("File");
Log.i(EXTSTGTAG,file.toString());
//String extstgdirabs = Environment.getExternalStorageDirectory().getAbsolutePath();
String extstgdirpth = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath();
Log.i(EXTSTGTAG,"<=\nEXTERN STG PUB DIR=>" + extstgdirpth);
String filepath = extstgdirpth + File.separator + "myfile.txt";
Log.i(EXTSTGTAG,"Full File Path and name is\n\t" + filepath);
File f = new File(filepath);
if(!f.exists()) {
Log.i(EXTSTGTAG,"File did not exist (path=" + filepath + ")");
try {
f.createNewFile();
}
catch (IOException e) {
Log.e(EXTSTGTAG,"Failure Creating New File MSG=" + e.getMessage());
}
}
if(f.exists()) {
Log.i(EXTSTGTAG,"File Already Exists (" + filepath + ")");
try {
Log.i(EXTSTGTAG,"Creating FileOutputStream instance.");
FileOutputStream fos = new FileOutputStream(f);
Log.i(EXTSTGTAG,"Creating OutputStreamWriter instance from FileOutputStream.");
OutputStreamWriter osw = new OutputStreamWriter(fos);
Log.i(EXTSTGTAG,"Adding Data to OutputStreamWriter.");
osw.append("My Test Data.");
Log.i(EXTSTGTAG,"Closing OutputStreamWriter.");
osw.close();
Log.i(EXTSTGTAG,"Flushing FileOutputStream.");
fos.flush();
Log.i(EXTSTGTAG,"Closing FileOutputStream");
fos.close();
Log.i(EXTSTGTAG,"All Done OK.");
} catch (IOException e) {
Log.e(EXTSTGTAG, "Failure Trying to write to file." + e.getMessage());
e.printStackTrace();
}
} else {
Log.i(EXTSTGTAG,"File doesn't appear to exist when it should????");
}
f.setReadable(true);
f.setWritable(true);
if(f.exists()) {
try {
byte[] bytes;
FileInputStream fis = new FileInputStream(f);
InputStreamReader isr = new InputStreamReader(fis);
BufferedReader br = new BufferedReader(isr);
StringBuilder sb = new StringBuilder();
String line = null;
while((line = br.readLine()) != null) {
sb.append(line).append("\n");
}
br.close();
Log.i(EXTSTGTAG,"Read the following data:\n" + sb.toString());
}
catch (IOException e) {
Log.e(EXTSTGTAG,"Failure trying to read file." + e.getMessage());
e.printStackTrace();
}
}
}
}
출력 (첫 번째 실행에주의 .하지만 요청과 세트 권한은)이이 문제/원인이라고 생각하지 않습니다 -
10-18 12:54:40.159 32393-32393/? I/EXTERNSTG: /storage/emulated/0/Android/data/mjt.sqlitetutorial/files/File
10-18 12:54:40.159 32393-32393/? I/EXTERNSTG: <=
EXTERN STG PUB DIR=>/storage/emulated/0/Download
10-18 12:54:40.159 32393-32393/? I/EXTERNSTG: Full File Path and name is
/storage/emulated/0/Download/myfile.txt
10-18 12:54:40.159 32393-32393/? I/EXTERNSTG: File Already Exists (/storage/emulated/0/Download/myfile.txt)
10-18 12:54:40.159 32393-32393/? I/EXTERNSTG: Creating FileOutputStream instance.
10-18 12:54:40.159 32393-32393/? I/EXTERNSTG: Creating OutputStreamWriter instance from FileOutputStream.
10-18 12:54:40.159 32393-32393/? I/EXTERNSTG: Adding Data to OutputStreamWriter.
10-18 12:54:40.159 32393-32393/? I/EXTERNSTG: Closing OutputStreamWriter.
10-18 12:54:40.159 32393-32393/? I/EXTERNSTG: Flushing FileOutputStream.
10-18 12:54:40.159 32393-32393/? I/EXTERNSTG: Closing FileOutputStream
10-18 12:54:40.169 32393-32393/? I/EXTERNSTG: All Done OK.
10-18 12:54:40.169 32393-32393/? I/EXTERNSTG: Read the following data:
My Test Data.
는 파일 (I 가정)을 읽는 것을 나타내는 마지막 줄. 제공된 메시지 중에는 다른 로그 메시지가 없습니다 (이전과 이후의 많은 메시지).
내가 테스트하고있는 장치는 SD 카드가있는 비 루팅 HTC One M8입니다. 그러나 /storage/emulated/0/Download, 파일이 기록되는 디렉토리가 내부 메모리에 있다고 생각합니다.
DDMS를 사용하면이 파일을 볼 수없는 것으로 보입니다 (실제 SD 카드의 다운로드 디렉토리는 입니다).
윈도우 탐색기에서 나는 HTC_0PKV1 장치에서 장치 등을 모두 내부 저장 및 SD 카드을 볼 수 있습니다.Windows 탐색기에서 다운로드 디렉토리에는 등록 정보를 통해 0 개의 디렉토리 및 파일이 있습니다. 읽기 전용이나 숨김이 표시되지 않습니다.
나는 setReadable
과 setWritable()
이있는 경우와없는 경우 모두 시도했습니다.
방금 전화로 파일 관리자를 사용해 보았습니다. 이제 파일을 볼 수 있습니다. 더 구체적으로 말하면 질문은 다음과 같습니다. Windows 탐색기를 통해 파일에 액세스하기 위해 전화를 뿌리 뽑고 전화상의 파일 관리자를 통해 파일을 옮기는 방법이 있습니까?
또한 앱이 태블릿에서 실행되므로 메소드가 기기에 고유하지 않고 일반 텍스트 여야한다고 명시해야합니다.