双FOR循环和FileOutputStream

时间:2014-07-02 11:04:58

标签: android outputstream fileoutputstream

在我的应用程序的这一部分,我有一个数据库,它吸收我的光传感器的数据。它有一个与每行相关联的RowID。

在后台我有一个AsyncTaskRunner,它读取该表并将每一行写入CSV文件。它应该在数据写入时循环遍历整个表,查找当前TID中尚未复制到CSV的所有行。然后它应该将行值写入CSV并返回并将该行标记为已复制。

第一个循环应该出现在没有返回数据库游标并查找尚未复制到CSV文件的下一行的情况下。每次复制到CSV后,它应评估该CSV文件的大小,以确保它不满。如果不是Full,则应返回Database游标并查找要写入CSV文件的下一行。如果isfull那么它应该循环回到LoopMain并重新开始创建一个要写入的新CSV文件。

虽然完整方法尚未完成,但我处于行数据被写入CSV文件的部分。目前,它没有写入它。在我把这个方法变成For循环之前,它确实做到了,现在却没有。我无法弄清楚发生了什么变化。我已经插入了所有这些日志注释以跟随方法,因为它传递值,接收值然后执行操作以查看它失败的位置。该方法传递了写入CSV文件的部分并继续,但该文件为空。

public void lightloop(){

    //Loop Main
    int loopcounter;
    LoopMain: for(loopcounter = 0; loopcounter < 4; loopcounter++ ){
        Log.d(CSV, "lightloop loopcounter = " + loopcounter);

    String CSVFinalFileName=createlightcsv();
       Log.w(CSV, "LightLoop, CSVFinalFileName = " + CSVFinalFileName);


      //Loop 2

       Loop2: for(int useless=1; useless > 0; useless++ ){
       String flightRowId = evaluateLightTable(filenamePrefix); //returns the rowid of the first line not transmitted
          Log.w(CSV, "LightLoop, flightRowId = " + flightRowId);
          Log.d(CSV, "filefullBoolean " + useless);

       if(flightRowId != null){
           Log.w(CSV, "LightLoop flightRowId is NOT NULL");
           //write row to csv
              //Get all row values and put into a string
              String lightRowValues=fetchLightRowData(flightRowId, filenamePrefix);
                 Log.w(CSV, "lightLoop, lightRowValues are " + lightRowValues);
              //Append that data to the CSV file
                Log.w(CSV, "Opening File Output Stream");
                try {
                    FileOutputStream csvfos = mContext.openFileOutput(CSVFinalFileName, Context.MODE_PRIVATE);
                } catch (FileNotFoundException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }

                OutputStreamWriter sensorCSVWriter = new OutputStreamWriter(csvfos);        
                try {
                    sensorCSVWriter.append("LIGHT " + lightRowValues);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

        /**     try {
                    sensorCSVWriter.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }  **/

           //mark row as transmitted
                SQLDatabase updatelightrow = new SQLDatabase(mContext);
                updatelightrow.open();
                SQLDatabase.updateLightRow(flightRowId);
                updatelightrow.close();

            }// end If rowid is not null


           //evaluate size of csv
                Boolean filefull = CsvStreamer.checkFileSize(CSVFinalFileName);

                if(!filefull){
                    //return to cursor
                    Log.d(CSV, "lightloop, File is NOT full");
                    break Loop2;

                }else{
                    Log.d(CSV, "lightloop, File IS full");
                    //file is full. close it, 

                    //transmit it, 

                    //open a new one

                    //goto CSV table and mark it transmitted

                    break LoopMain;
                }
       }//end Loop2

}//end LoopMain

}

任何人都可以看到为什么没有写入文件?

1 个答案:

答案 0 :(得分:0)

csvfos不在同一范围内。我假设该类还有一个名为csvfos的属性,因此该方法正在访问该属性,而不是在try catch中创建的csvfos变量。

尝试更改

try 
{
    FileOutputStream csvfos = mContext.openFileOutput(CSVFinalFileName, Context.MODE_PRIVATE);
} 
catch (FileNotFoundException e1) 
{
     // TODO Auto-generated catch block
     e1.printStackTrace();
}

FileOutputStream csvfos = null;

try 
{
    csvfos  = mContext.openFileOutput(CSVFinalFileName, Context.MODE_PRIVATE);
} 
catch (FileNotFoundException e1) 
{
     // TODO Auto-generated catch block
     e1.printStackTrace();
}