Skriva till textfil med FileOutputStream fungerar inte

Diskussion i 'Frågor, support och diskussion' startad av ChrisNexus, 12 jul 2011.

  1. ChrisNexus

    ChrisNexus Kid Droid Medlem

    Blev medlem:
    8 jan 2011
    Inlägg:
    40
    Mottagna gillanden:
    7

    MINA ENHETER

    Tjena. Kör man programmet nedan får man upp en Toast som säger "File saved", vilket ska betyda att koden exekverats korrekt. Problemet är att det inte skapas någon fil öht. Jag har läst mig till att filen ska skapas i data/package, men där finns alltså inget. Vad är felet?

    Kod:
    package com.chrisnexus.simpleio;
    
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStreamWriter;
    import android.app.Activity;
    import android.content.Context;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.EditText;
    import android.widget.Toast;
    
    public class SimpleIOActivity extends Activity {
        /** Called when the activity is first created. */
        [USER=4487]OvE[/USER]rride
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
        }
        
        // Register button click
        public void mButtonClickHandler(View target) {
        	EditText etTitle = (EditText)findViewById(R.id.mEditTextTitle);
        	EditText etText = (EditText)findViewById(R.id.mEditTextForm);
    
        	WriteSettings(this.getBaseContext(), etTitle.getText().toString(), etText.getText().toString());
        }
        
        // Save data
        public void WriteSettings(Context context, String title, String text) {
        	FileOutputStream fOut = null;
        	OutputStreamWriter osw = null;
    
        	try {
        		fOut = openFileOutput("test.txt", MODE_PRIVATE);      
        		osw = new OutputStreamWriter(fOut);
        		osw.write(text);
        		osw.flush();
        		Toast.makeText(context, "File saved", Toast.LENGTH_SHORT).show();
        	}
    
        	catch (Exception e) {      
        		e.printStackTrace();
        		Toast.makeText(context, "File not saved", Toast.LENGTH_SHORT).show();
        	}
    
        	finally {
        		try {
        			osw.close();
        			fOut.close();
        		} catch (IOException e) {
        			e.printStackTrace();
        		}
        	}
        }
    }
     
    Last edited: 12 jul 2011
  2. ozp

    ozp Teen Droid Medlem

    Blev medlem:
    6 maj 2010
    Inlägg:
    250
    Mottagna gillanden:
    31

    MINA ENHETER

    Filen kommer att hamna i /data/data/<ditt paketnamn>/files/
     
  3. ChrisNexus

    ChrisNexus Kid Droid Medlem

    Blev medlem:
    8 jan 2011
    Inlägg:
    40
    Mottagna gillanden:
    7

    MINA ENHETER

    Så här ser min mappstruktur ut (visar dolda filer). Kommer inte längre än till data/[package] (motsvarande package för min app har inte skapats)

    [​IMG]
     
  4. ozp

    ozp Teen Droid Medlem

    Blev medlem:
    6 maj 2010
    Inlägg:
    250
    Mottagna gillanden:
    31

    MINA ENHETER

    Forumet tog bort en del av mitt svar

    Rätt sökväg ska vara /data/data/< ditt paket-namn >/files/

    Filen kommer inte att sparas på minneskortet utan i det interna minnet.

    Vill du spara filen på minneskortet kan du istället göra:
    Kod:
    File f = new File("/sdcard/path/filename");
    fOut = new FileOutputStream(f);
    Tänk då på att du måste lägga till
    Kod:
    < uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    i ditt manifest
     
    Last edited: 13 jul 2011
  5. mach

    mach Youth Droid Medlem

    Blev medlem:
    29 apr 2010
    Inlägg:
    115
    Mottagna gillanden:
    4

    MINA ENHETER

    Skall du skriva till SD-kortet så har jag några tips:

    Kolla upp getExternalStorageState() innan du försöker öppna filen.

    Använd getExternalStorageDirectory() istället för hårdkodad sökväg så krashar det inte på telefoner med konstiga filträd.

    Lycka till!
     
  6. Adam2

    Adam2 Adult Droid Medlem

    Blev medlem:
    26 jul 2010
    Inlägg:
    732
    Mottagna gillanden:
    55

    MINA ENHETER

    Jag instämmer med mach, använd Environmentklassen för att kontrollera om SD-kort är monterat, skrivbart och för sökväg etc.

    Sen kan jag inte undgå att du har en metod som heter WriteSettings. Någon specifik anledning till att du inte använder SharedPreferences? Den klassen underlättar en hel del. Bland annat slipper du vara beroende av SD-kort, inställningarna finns kvar även om användaren byter/formaterar sitt SD och eftersom du har full kontroll på vad som skrivs till SharedPreferences underlättar det när du läser in inställningen (slipper kontrollera att/om det är ett giltigt värde).
     
  7. ChrisNexus

    ChrisNexus Kid Droid Medlem

    Blev medlem:
    8 jan 2011
    Inlägg:
    40
    Mottagna gillanden:
    7

    MINA ENHETER

    Jag var av uppfattningen att SharedPreferences används för att lagra tillfälliga inställningar? D.v.s. så fort android dödar aktiviteten efter att man stängt ned appen så kommer även dessa sparade inställningar att gå förlorade? Är det inte så?

    Syftet med programmet ovan var egentligen bara att skapa en textfil med given data som lagras på internminnet, då jag behöver spara lite data i en annan app jag skriver. Men tack för tipsen om SD-kortet, kommer säkerligen använda det i framtiden.
     
  8. Adam2

    Adam2 Adult Droid Medlem

    Blev medlem:
    26 jul 2010
    Inlägg:
    732
    Mottagna gillanden:
    55

    MINA ENHETER

    Tvärt om, detta är en mycket smidigt sätt att spara data mellan körningar (utan att behöva oroa sig för om aktiviteten har dödats eller ej).

    SDK:n går igenom de olika (rekommenderade) sätten att spara data här. Där står bland annat:

     
    ChrisNexus gillar detta.