2017-01-28 8 views
1

Ich versuche in meinem Programm zweimal auf eine Datei zuzugreifen.File.exists gibt false zurück

Zuerst lese ich aus der Datei, die läuft gut.

Das zweite Mal versuche ich die gleiche Datei zu löschen, von der ich gelesen habe.

Seltsamerweise das zweite Mal keine Datensätze in der Datei vorhanden sind. Tatsächlich, wenn ich versuche, den Befehl file.exists auszuführen, gibt es false zurück. Warum passiert das?

Folgende ist mein Code:

public class ControlLights extends AppCompatActivity { 

    private RoomListAdapter adapter; 
    private List<ROOM> mRoomList; 

    @Override 
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { 
     super.onCreateContextMenu(menu, v, menuInfo); 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.popup,menu); 
    } 

    public void filedel(int pos) { 
     Toast.makeText(getApplicationContext(), String.valueOf(pos), Toast.LENGTH_LONG).show(); 
     File filemain = new File("roomdata.txt"); 
     try { 
      File temp = File.createTempFile("file",".txt",filemain.getParentFile()); 
      String charset = "UTF-8"; 
      BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(temp), charset)); 
      PrintWriter writer = new PrintWriter(new OutputStreamWriter(new FileOutputStream(temp), charset)); 
      int p=0; 
      for(String line; (line=reader.readLine())!=null;) { 
       if(p == pos) { 
        line = line.replace(line,""); 
        writer.println(line); 
       } 
       writer.println(line); 
      } 
      reader.close(); 
      writer.close(); 
      filemain.delete(); 
      temp.renameTo(filemain); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     }  
    } 

    @Override 
    public boolean onContextItemSelected(MenuItem item) { 
     AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); 
     switch (item.getItemId()) { 
      case R.id.Edit: 
       return true; 

      case R.id.Delete: 
       filedel(info.position); 
       mRoomList.remove(info.position); 
       adapter.notifyDataSetChanged(); 
       return true; 

      default: 
       return super.onContextItemSelected(item); 
     } 
    } 

    public void loadrooms() { 

     int block = 1024; 

     try { 
      boolean exists = (new File("roomdata.txt").exists()); 
      Toast.makeText(getApplicationContext(), String.valueOf(exists), Toast.LENGTH_LONG).show(); 

      FileInputStream fis = openFileInput("roomdata.txt"); 
      InputStreamReader isr = new InputStreamReader(fis); 
      char[] data = new char[block]; 
      String roomdata = ""; 
      int size; 
      try { 
       while ((size = isr.read(data)) > 0) { 
        String read_data = String.copyValueOf(data, 0, size); 
        roomdata += read_data; 
        data = new char[block]; 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

      String[] room_display = roomdata.split("\n"); 
      String[] tempstring; 
      ListView lsv = (ListView) findViewById(R.id.Room_list); 
      mRoomList = new ArrayList<>(); 
      for (int b = 0; b < room_display.length; b++) { 
       tempstring = room_display[b].split(":"); 
       mRoomList.add(new ROOM(tempstring[0], tempstring[1], tempstring[2], tempstring[3], tempstring[4], tempstring[5], tempstring[6], tempstring[7], tempstring[8], tempstring[9])); 
      } 

      adapter = new RoomListAdapter(getApplicationContext(), mRoomList); 
      lsv.setAdapter(adapter); 
      registerForContextMenu(lsv); 


      int count = mRoomList.size(); 
      final ArrayList<Integer> disabledpos = new ArrayList<Integer>(); 

      for (int q = 0; q < count; q++) { 
       ROOM temp_room1 = mRoomList.get(q); 
       String IP = temp_room1.getRoom_IP_Address(); 
       String online = null; 
       ConnectionTest CT = new ConnectionTest(); 
       try { 
        online = CT.execute(IP, "a", "b").get(); 
        Boolean b1 = Boolean.valueOf(online); 

        if (!b1) { 
         disabledpos.add(q); 
        } 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } catch (ExecutionException e) { 
        e.printStackTrace(); 
       } 

      } 
      try { 
       isr.reset(); 
       isr.close(); 
       fis.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

      if (new File("roomdata.txt").delete()) { 
       Toast.makeText(getApplicationContext(), "deleted", Toast.LENGTH_LONG).show(); 
      } else { 
       Toast.makeText(getApplicationContext(), "not deleted", Toast.LENGTH_LONG).show(); 
       // Not deleted 
      } 

      lsv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

       @Override 
       public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
        int temp_position = position; 
        Intent p = new Intent(ControlLights.this, Electrical_equipment_list.class); 
        if (!(disabledpos.contains(position))) { 
         ROOM temp_room = mRoomList.get(temp_position); 
         p.putExtra("EE1", temp_room.getEE1()); 
         p.putExtra("EE2", temp_room.getEE2()); 
         p.putExtra("EE3", temp_room.getEE3()); 
         p.putExtra("EE4", temp_room.getEE4()); 
         p.putExtra("EE5", temp_room.getEE5()); 
         p.putExtra("EE6", temp_room.getEE6()); 
         p.putExtra("EE7", temp_room.getEE7()); 
         p.putExtra("EE8", temp_room.getEE8()); 
         p.putExtra("IPaddress", temp_room.getRoom_IP_Address()); 
         startActivity(p); 
        } 
       } 
      }); 

     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } 

    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_control_lights); 
     loadrooms(); 
    } 

    public class ConnectionTest extends AsyncTask<String, String, String> { 

     @Override 
     protected String doInBackground(String... params) { 
      Boolean online; 
      String tempstring = null; 
      try { 
       InetAddress roomaddress = InetAddress.getByName(params[0]); 
       online = roomaddress.isReachable(100); 
       tempstring = String.valueOf(online); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      return tempstring; 
     } 

     @Override 
     protected void onPostExecute(String s) { 
      super.onPostExecute(s); 
     } 
    } 
} 

Antwort

0
  1. Ihre File als Klasse halten Mitglied, da es ein wesentlicher Bestandteil dessen, was die Klasse tut

  2. Ihre innere Logik bewegen und Dateireferenzinitialisierung auf onStart()

    öffentliche Klasse ControlLights erweitert AppCompatActivity { privater RoomListAdapter-Adapter; private Liste mRoomList; private Datei filemain; ...

    public void filedel(int pos) { 
        Toast.makeText(getApplicationContext(), String.valueOf(pos), Toast.LENGTH_LONG).show(); 
        try { 
         File temp = File.createTempFile("file",".txt", filemain.getParentFile()); 
         ... 
        } 
    } 
    
    public void loadrooms() { 
        int block = 1024; 
        try { 
         boolean exists = filemain.exists(); 
         ... 
         if (filemain.delete()) { 
          Toast.makeText(getApplicationContext(), "deleted", Toast.LENGTH_LONG).show(); 
         } else { 
          Toast.makeText(getApplicationContext(), "not deleted", Toast.LENGTH_LONG).show(); 
          // Not deleted 
         } 
        } ... 
    } 
    
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_control_lights); 
    } 
    
    @Override 
    protected void onStart() { 
        super.onStart(); 
        filemain = new File("roomdata.txt"); 
        loadrooms(); 
    } 
    

    }

Fussnote

ich für das schreckliche Codeformat entschuldigen, aber anscheinend änderten sie den Parsing-Algorithmus zu einem Punkt, wo Sie manuell zu Geben Sie den gesamten Code erneut ein, anstatt ihn nur kopieren und einfügen zu können. Jeder, der es entsprechend bearbeiten soll, ist willkommen.

+0

Danke Chisko. Endlich konnte ich die Datei mit dem Befehl deletefile löschen. Meine Beobachtung ist, dass Dateien, die mit dem Dateieingabestream erstellt wurden, nicht mit dem Befehl file.delete gelöscht werden können. Korrigiere mich, wenn ich falsch liege. Freue mich von Dir zu hören. –