2014-09-30 22 views
1

我遇到問題。當我在這個類中實現以下文件時,它獨立運行時似乎顯示正確讀取它的工作原理並將數據保存到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; 
} 
+0

您顯然試圖打開一個駐留在Windows開發系統上的文件:'C:\ iris \ iris.data'。您的Android測試設備無法訪問您電腦的文件系統。最重要的是,Android基於Linux。有效的文件路徑看起來不同。您需要將'iris.data'與您的Android應用捆綁在一起,以便將其安裝到您的Android設備上。在Android上搜索「資產文件」和「原始資源」並查找教程。 – tiguchi 2014-09-30 21:37:32

回答

0

C:\iris\iris.data在Android中不存在。你必須改變你的設備上存在的文件的路徑(讀取文件可能需要額外的權限!)或捆綁它,並使用AssetManager在運行時檢索它(如Nobu Games寫的)。

相關問題