【问题标题】:Double FOR loop and FileOutputStream双 FOR 循环和 FileOutputStream
【发布时间】:2014-07-02 11:04:58
【问题描述】:

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

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

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

虽然完整的方法尚未完成,但我正在将行数据写入 CSV 文件的部分。目前,它不写入它。在我将此方法设置为 For 循环之前,它确实如此,现在它没有。我不知道发生了什么变化。我已插入所有这些 Log cmets 以遵循该方法,因为它传递值、接收值然后执行操作以查看失败的位置。该方法传递了要写入 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

}

谁能看到为什么这无法写入文件?

【问题讨论】:

  • 我猜它甚至无法编译(除非你有一个名为 csvfos 的类字段)。如果你有一个,它很可能没有初始化。
  • 我没说它不编译,是不是……
  • 所以你的班级确实有一个字段csvfos。请说明它是如何声明和初始化的。

标签: android outputstream fileoutputstream


【解决方案1】:

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();
}

【讨论】:

  • hmmm 我会试一试然后回来。这是一个单独的方法,它初始化了 cvsfos,然后打开了输出流。这在放置 for 循环之前运行良好。我现在想知道整个方法是否只是变得垃圾并且不再初始化 cvsfos?我会在测试后回来评论。谢谢
猜你喜欢
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-11
  • 1970-01-01
  • 1970-01-01
  • 2010-12-06
  • 1970-01-01
相关资源
最近更新 更多