FileInputStream in Fragment 给出 FileNotFound 异常



我正在尝试使用片段类在内部存储上保存整数,并且似乎能够使用FileOutputStream来保存文件,但是程序似乎永远无法在创建后找到它们。

下面是相关的 Java 类:

public View onCreateView(final LayoutInflater inflater, final ViewGroup container,
final Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.fragment_preferences, container, false);
final SeekBar s1 = (SeekBar) root.findViewById(R.id.s1Bar);
Button button = (Button) root.findViewById(R.id.savebutton);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int spi = s1.getProgress();
String fileContents = String.valueOf(spi);
try {
FileOutputStream outputStream = getActivity().openFileOutput("myText.txt", Context.MODE_PRIVATE);
outputStream.write(fileContents.getBytes());
outputStream.close();
Toast.makeText(getContext(), "File saved!", Toast.LENGTH_SHORT).show();}
catch (Exception e){
e.printStackTrace();
Toast.makeText(getContext(), "File not saved!", Toast.LENGTH_SHORT).show();
}
}
});
s1.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean fromUser) {
spicinessText.setText("Spiciness: "+i);
int spiciness = i;
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
try {
FileInputStream inputStream = getActivity().openFileInput("myText.txt");

String m = inputStream.toString();
int c = Integer.parseInt(m);
s1.setProgress(c);
Toast.makeText(getContext(), "File Received!", Toast.LENGTH_SHORT).show();
} catch (Exception e){
e.printStackTrace();
Toast.makeText(getContext(), "File not received", Toast.LENGTH_SHORT).show();
}
return root;
}

加载片段时,它总是给出 FileNotFound 异常,即使我之前已经创建了它。任何帮助非常感谢!

您仅在单击按钮后创建文件,但您尝试在创建片段后立即读取文件。这就是为什么你得到FileNotFound Exception。

将文件读取代码放在方法中,并在单击按钮后随时调用它。像这样:

public void readFile(){
try {
FileInputStream inputStream = getActivity().openFileInput("myText.txt");
String m = inputStream.toString();
int c = Integer.parseInt(m);
s1.setProgress(c);
Toast.makeText(getContext(), "File Received!", Toast.LENGTH_SHORT).show();
} catch (Exception e){
e.printStackTrace();
Toast.makeText(getContext(), "File not received", Toast.LENGTH_SHORT).show();
}
}

public View onCreateView(final LayoutInflater inflater, final ViewGroup container,
final Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.fragment_preferences, container, false);
final SeekBar s1 = (SeekBar) root.findViewById(R.id.s1Bar);
Button button = (Button) root.findViewById(R.id.savebutton);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int spi = s1.getProgress();
String fileContents = String.valueOf(spi);
try {
FileOutputStream outputStream = getActivity().openFileOutput("myText.txt", Context.MODE_PRIVATE);
outputStream.write(fileContents.getBytes());
outputStream.close();
Toast.makeText(getContext(), "File saved!", Toast.LENGTH_SHORT).show();
readFile(); // FILE IS CREATED NOW. SO YOU CAN READ IT.
}
catch (Exception e){
e.printStackTrace();
Toast.makeText(getContext(), "File not saved!", Toast.LENGTH_SHORT).show();
}
}
});
s1.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean fromUser) {
spicinessText.setText("Spiciness: "+i);
int spiciness = i;
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
return root;
}

您是否尝试创建一个 File 对象,然后调用 exists((、canRead(( 或 canExecute(( 方法来测试目录是否有效? 我今天遇到了同样的问题,花了大约两个小时才部分弄清楚。太烦人了。根据类代码的结构,Java 不允许读取单元测试中的文本文件。尝试在主方法中阅读它。 让我知道它是否有效:)

最新更新