2015-04-21 224 views
1

我添加了用於文件瀏覽的外部庫。該庫返回所選文件路徑密鑰,但不包含值。Android openFileInput無法解析文件路徑

package com.example.dev.nordugrid; 
import com.orleonsoft.android.simplefilechooser.ui.FileChooserActivity; 

import android.content.Context; 
import android.os.Environment; 
import android.support.v7.app.ActionBarActivity; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.*; 
import android.view.View; 
import android.content.Intent; 
import java.io.*; 

public class jdlFailas extends ActionBarActivity { 
final int FILE_CHOOSER = 1; 
public String fileSelected; 
public String myText; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_jdl_failas); 
} 

public void openFILE(View view) { 
    Intent intent = new Intent(jdlFailas.this, FileChooserActivity.class); 
    startActivityForResult(intent, FILE_CHOOSER); 

    try { 
     FileInputStream fin = new FileInputStream (fileSelected); 
     int c; 
     String temp=""; 
     while((c = fin.read()) != -1){ 
      temp = temp + Character.toString((char)c); 
     } 

     fin.close(); 
     myText = temp.toString(); 

    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
    } 
} 


public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if ((requestCode == FILE_CHOOSER) && (resultCode == RESULT_OK)) { 
     fileSelected = data.getStringExtra(com.orleonsoft.android.simplefilechooser.Constants.KEY_FILE_SELECTED); 

     TextView textView = (TextView) findViewById(R.id.editText2); 

     Toast.makeText(this, R.string.pasirinktasFailas + myText, Toast.LENGTH_SHORT).show(); 
     textView.setText(myText); 
    } 
} 

public void jdlSave(View view) { 
    Intent intent = new Intent(jdlFailas.this, NaujaUzduotis.class); 
    startActivity(intent); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_jdl_failas, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 
} 

如果我把正常文件名,程序運行正常:

FileInputStream fin = openFileInput("file.txt"); 

不管怎樣,我的主要問題是「我怎樣才能處理文件,如果我想使用的路徑不串?」

.xml文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" 
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
android:paddingBottom="@dimen/activity_vertical_margin" 
tools:context="com.example.dev.nordugrid.jdlFailas"> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceMedium" 
    android:text="@string/pridekiteJDL" 
    android:id="@+id/textView6" 
    android:layout_alignParentTop="true" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" /> 

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@string/prideti" 
    android:id="@+id/button12" 
    android:onClick="openFILE" 
    android:layout_below="@+id/textView6" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" /> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceMedium" 
    android:text="@string/rasytiRanka" 
    android:id="@+id/textView7" 
    android:layout_below="@+id/button12" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" /> 

<EditText 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:inputType="textMultiLine" 
    android:ems="10" 
    android:id="@+id/editText2" 
    android:layout_below="@+id/textView7" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" 
    android:layout_alignParentRight="true" 
    android:layout_alignParentEnd="true" /> 

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@string/ikelti" 
    android:id="@+id/button13" 
    android:layout_alignParentBottom="true" 
    android:layout_alignParentRight="true" 
    android:layout_alignParentEnd="true" 
    android:onClick="jdlSave" /> 

有在引擎收錄鏈接logcat的代碼:http://pastebin.com/43kzEgRu

+0

我不知道你問的是什麼?你可以通過調用['file.getAbsolutePath()'](http://developer.android.com/reference/java/io/File.html#getAbsolutePath())從'File'獲得(絕對)路徑,並通過調用其構造函數之一來獲取基於路徑的文件。無論哪種方式,一個'路徑'通常只是由一個字符串表示,而不是某種特殊的對象層次結構(儘管沒有什麼能阻止你創建一個,如果你真的想的話)。 –

+0

您忘記告訴並顯示您使用onActivityResult()。請告訴'fileSelected'的類型和值。不要使用openFileInput而是使用FileOpenStream。 – greenapps

+0

當文件名是「SOMETHING.txt」時,我可以工作。但我需要使用選定的文件,其值爲「/storage/sdcard/uzduotis.txt」 –

回答

0
public void openFILE(View view) { 
Intent intent = new Intent(jdlFailas.this, FileChooserActivity.class); 
startActivityForResult(intent, FILE_CHOOSER); 

try { 
    FileInputStream fin = new FileInputStream (fileSelected); 
    int c; 
    String temp=""; 
    while((c = fin.read()) != -1){ 
     temp = temp + Character.toString((char)c); 
    } 

    fin.close(); 
    myText = temp.toString(); 

} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
} 
} 

正如之前所說:不能打開該文件馬上爲用戶第一次有選擇一個文件。因此,更改爲:

public void openFILE(View view) { 
Intent intent = new Intent(jdlFailas.this, FileChooserActivity.class); 
startActivityForResult(intent, FILE_CHOOSER); 
} 

和:

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
if ((requestCode == FILE_CHOOSER) && (resultCode == RESULT_OK)) { 
    fileSelected = data.getStringExtra(com.orleonsoft.android.simplefilechooser.Constants.KEY_FILE_SELECTED); 
    Toast.makeText(this, fileSelected, Toast.LENGTH_SHORT).show(); 

try { 
    FileInputStream fin = new FileInputStream (fileSelected); 
    int c; 
    String temp=""; 
    while((c = fin.read()) != -1){ 
     temp = temp + Character.toString((char)c); 
    } 

    fin.close(); 
    myText = temp.toString(); 
    TextView textView = (TextView) findViewById(R.id.editText2); 

    Toast.makeText(this, R.string.pasirinktasFailas + myText, Toast.LENGTH_SHORT).show(); 
    textView.setText(myText); 
} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
    Toast.makeText(this, "FileNotFoundException: " + e.getMessage(), Toast.LENGTH_SHORT).show(); 
    } catch (IOException e) { 
e.printStackTrace();  
    Toast.makeText(this, "IOException: " + e.getMessage(), Toast.LENGTH_SHORT).show(); 
} 
} 
+0

仍然存在問題,因爲我無法使用'/storage/sdcard/uzduotis.txt'文件路徑'' –

+1

'我無法使用該文件路徑'。爲什麼不?任何錯誤?請告訴!!會發生什麼呢?任何例外? – greenapps

+0

您已經申請了清單文件中的READ_EXTERNAL_STORAGE權限? – greenapps

0

你的問題歸根結底是由於俯瞰VS

FileInputStream fin = new FileInputStream("failas.txt") 

FileInputStream fin = openFileInput("file.txt"); 

之間的關鍵區別首先是可行的(在一個n活動或服務),因爲openFileInput()是Android獨有的方法,它會打開位於應用程序的私人目錄中的文件

二是在Android 不可行,因爲只給出一個文件名時,Java的FileInputStream(String path)構造函數將嘗試在工作目錄,這對Android的設備根目錄下打開一個文件 - 一個地方,你的應用程序不能存儲任何數據。

當你正在處理的外部存儲作爲你的路「/storage/sdcard/uzduotis.txt」表示,不能使用openFileInput(),但是相比於你的說法,你可以做到以下幾點:

String path = "/storage/sdcard/uzduotis.txt"; 
FileInputStream fin = new FileInputStream(path); 

甚至從字面上硬編碼爲

FileInputStream fin = new FileInputStream("/storage/sdcard/uzduotis.txt"); 

當然整體的成功,一如既往,取決於所有usuals如具有工作程序,被許可到外部存儲,並且以前在該名稱和位置創建了一個文件。

+0

謝謝你的回答:)將有用的功能;] –

1

我有類似的問題,當FILE_NAME包含一個路徑:

InputStream inputStream = context.openFileInput(file_name); 

溶液用以下替換上述行:

file_name=context.getFilesDir() + "/"+file_name; 
InputStream inputStream = new FileInputStream(new File(file_name));