我遇到問題。當我在這個類中實現以下文件時,它獨立運行時似乎顯示正確讀取它的工作原理並將數據保存到ArrayList
s。這是我對那個類的代碼:Android中的FileNotFoundException但文件安裝正確,出了什麼問題?
MachineLearningInstance.java
public class MachineLearningInstance {
/*
* Setup Arraylist of Iris Items which will be the size of the .data file
*/
private ArrayList<Iris> irisData = new ArrayList<Iris>();
private ArrayList<Iris> trainingArray = new ArrayList<Iris>();
private Context context;
/*
* These are values for the NeuralNetwork Constructor
*/
private final String comma = ",";
private final String irisSetosa = "Iris-setosa";
private final String irisVersicolor = "Iris-versicolor";
private final String irisVirginica = "Iris-virginica";
public MachineLearningInstance(File f, Context context) {
this.context = context;
try {
int noOfRowsInData = 0;
LineNumberReader lnr = new LineNumberReader(new FileReader(f));
try {
lnr.skip(Long.MAX_VALUE);
noOfRowsInData = lnr.getLineNumber();
//System.out.println(noOfRowsInData);
lnr.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
irisData = new ArrayList<Iris>();
// While there is another line in inFile.
Scanner inFile = new Scanner(f);
for (int i = 0; i < noOfRowsInData - 1; i++) {
if (inFile.hasNextLine()) {
// Store line into String
String line = inFile.nextLine();
// Partition values into separate elements in array
String[] numbers = line.split(comma);
// Grab values from that line and store it into a Iris ArrayList Item
irisData.add(i, new Iris(i, numbers[0], numbers[1], numbers[2], numbers[3], numbers[4]));
}
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (irisData == null) {
Toast.makeText(context, "IRIS DATA IS NULL!", Toast.LENGTH_LONG);
}
for (int i = 0; i < irisData.size(); i++) {
Toast.makeText(context, irisData.get(i).getId(), Toast.LENGTH_SHORT).show();
Toast.makeText(context, irisData.get(i).getIrisClassName(), Toast.LENGTH_SHORT).show();
} // Used to check values
//sortData();
}
/*
Initialize method to grab the 2-D array of the Iris items
*/
public ArrayList<Iris> getTestData() {
return irisData;
}
public ArrayList<Iris> getTrainingData() {
return trainingArray;
}
public ArrayList<Iris> sortData() {
trainingArray.addAll(irisData.subList(0, 100));
return trainingArray;
}
}
當我執行下面的代碼到這個片段,我得到了NullPointerException
我認爲這是由一個FileNotFoundException
造成的,因爲我認爲通過片段實現時,文件沒有被正確讀取。這裏是我對片段的代碼:
public class PredictFragment extends Fragment {
private ListView mListView;
private ArrayList<Iris> irisArrayList;
private ArrayList<Iris> trainingSet = new ArrayList<Iris>();
private ArrayList<Iris> testSet = new ArrayList<Iris>();
private MachineLearningInstance machineLearningInstance;
private IrisAdapter irisAdapter;
private FileOutputStream rawFile;
private File rawFileOutput;
/*
MachineLearningInstance to grab data from .data file and sort it into partition arraylists
*/
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.predict_listview, container, false);
rawFileOutput = new File("C:\\iris\\iris.data");
machineLearningInstance = new MachineLearningInstance(rawFileOutput, getActivity());
trainingSet = machineLearningInstance.getTrainingData();
testSet = machineLearningInstance.getTestData();
irisAdapter = new IrisAdapter(getActivity(), testSet);
mListView = (ListView) view.findViewById(R.id.listView);
mListView.setAdapter(irisAdapter);
return view;
}
E/AndroidRuntime:致命異常:主 工藝:com.irisclassification,PID:1675 顯示java.lang.NullPointerException 在> com.irisclassification。 PredictFragment.onCreateView(PredictFragment.java:59) 在android.app.Fragment.performCreateView(Fragment.java:1700)
編輯:
所以將使用fileoutstream,然後將其轉換爲文件對象是最好的方式去做這件事?
我繼續並將.data文件捆綁到資源目錄中的原始資產文件夾中,這是否是訪問Android設備上的.data文件的正確方法?
public FileOutputStream createFile() {
try {
InputStream inputStream = getActivity().getResources().openRawResource(R.raw.iris);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
int size = 0;
// Read the entire resource into a local byte buffer
byte[] buffer = new byte[1024];
while ((size = inputStream.read(buffer, 0, 1024)) >= 0) {
outputStream.write(buffer, 0, size);
}
inputStream.close();
buffer = outputStream.toByteArray();
rawFile = new FileOutputStream("iris.data");
rawFile.write(buffer);
rawFile.close();
} catch (IOException e) {
e.printStackTrace();
}
return rawFile;
}
您顯然試圖打開一個駐留在Windows開發系統上的文件:'C:\ iris \ iris.data'。您的Android測試設備無法訪問您電腦的文件系統。最重要的是,Android基於Linux。有效的文件路徑看起來不同。您需要將'iris.data'與您的Android應用捆綁在一起,以便將其安裝到您的Android設備上。在Android上搜索「資產文件」和「原始資源」並查找教程。 – tiguchi 2014-09-30 21:37:32