java - Android openFileInput 无法解析文件路径

标签 java android fileinputstream

我添加了用于文件浏览的外部库。该库返回选定的文件路径键,但不返回值。

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" />

pastebin 链接中有 LogCat 代码:http://pastebin.com/43kzEgRu

最佳答案

你的问题归根结底是因为忽略了两者之间的关键区别

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

对比

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

第一个是可行的(在 Activity 或服务中),因为 openFileInput() 是 Android 特有的方法,它打开一个位于应用程序私有(private)目录中.

第二个在 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");

当然,与往常一样,总体成功取决于所有常见情况,例如拥有一个工作程序、拥有对外部存储的权限,以及之前在该名称和位置创建了一个文件。

关于java - Android openFileInput 无法解析文件路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29767912/

相关文章:

java - 为什么使用 Scanner.next() 会导致这种奇怪的 System.out.println() 行为?

java - 如何处理创建的损坏文件但发生 IOException?

java: FileInputStream.read()读取一个字节但可以读取一个字符,这是怎么回事?

android - 使用 Android Studio 将文件转换为字符串,然后转换为 Base64 Fromate

java - 为什么javafx中main方法的类应该是public的?

java - 是否可以更改正则表达式重复中的最后一个字符?

java - 为什么我的运行配置在 Android Studio 中被禁用?

java - getUIsettings.setMyLocationButtonEnabled(true) 不工作

javascript - Android onBackPress 调用 JavaScript 函数或退出 Android 应用程序

android - 如何检测软件键盘在 Android 设备上是否可见?