Problema Creazione file con Java

di il
2 risposte

Problema Creazione file con Java

Salve a tutti,

sono nuovo da queste parti e in generale sul mondo della programmazione Java, linguaggio che mi ha sempre affascinato e sono qui a chiedervi aiuto. Sto cercando di capire come funzionano le classi ecc ecc dopo aver seguito un corso online puramente basato sulla teoria, ora però il problema è che non riesco a mettere bene in pratica le mie conoscienze. Voglio creare una semplice applciazione per android che mi consenta di CREARE UN FILE IN UNA DIRECTORY per poi passare al metodo DELETE in seguito, sono sicuro che ho sbagliato qualcosa ma non riesco proprioa capire cosa (scusatemi fin da ora se fosse una bagianata)

Utilizzo i seguenti strumenti:

- Android Studio 3.1
- Riesco ad emulare la mia App su un samnsung Galaxy tab 3 (android 6 masmallow)
- ho impostato android studio per scrivere in compatibilità con la 5.0 come suggerito dal programma/ide stesso
- sto seguendo questa guida per le classi da utilizzare per il mio scopo http://www.html.it/articoli/creazione-eliminazione-lettura-e-scrittura-di-file-di-testo-1/

Di seguito posto il codice fin'ora stilato (activity.main.xml per l'interfaccia)
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/deleteButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:onClick="deleteFile"
        android:text="CANCELLA"
        android:visibility="visible"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/newButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:onClick="newFile"
        android:text="NEW FILE"
        android:visibility="visible"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>

Di seguito invece il cuore dell' app Main.activity.java :

package com.example.mufas.bookonline;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import java.io.File;
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

public class MainActivity extends Activity {

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

    public void deleteFile(View view) {
        //qui istruzioni metodo
    }


    public void newFile(View view) {

        File path = Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_DOWNLOADS);

       try {

           File file = new File(path, "esempio.txt");
            if (file.exists()) {
               System.out.println("Il file " + path + " esiste");
           } else if (file.createNewFile()) {
               System.out.println("Il file " + path + " è stato creato");
           } else {
                System.out.println("Il file " + path + " non può essere creato");
           }

           // Make sure the Pictures directory exists.
           path.mkdirs();

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

    }
}
qui invece il Manifest.xml come potete vedere ho settato anche tutti per i permessi di lettura e scrittura per la memoria esterna ed esterna


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.mufas.bookonline">
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_INTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.INTERNET" />
    <application
        android:isolatedProcess="true"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Posto anche il log degli errori per completezza:


 Scheduling ad refresh 60000 milliseconds from now.
04-11 21:42:37.511 32191-32191/com.example.mufas.bookonline W/System.err: java.io.IOException: open failed: ENOENT (No such file or directory)
        at java.io.File.createNewFile(File.java:939)
        at com.example.mufas.bookonline.MainActivity.newFile(MainActivity.java:45)
        at java.lang.reflect.Method.invoke(Native Method)
        at android.view.View$DeclaredOnClickListener.onClick(View.java:4453)
        at android.view.View.performClick(View.java:5204)
        at android.view.View$PerformClick.run(View.java:21153)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:148)
        at android.app.ActivityThread.main(ActivityThread.java:5417)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
04-11 21:42:37.512 32191-32191/com.example.mufas.bookonline W/System.err: Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory)
        at libcore.io.Posix.open(Native Method)
        at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
        at java.io.File.createNewFile(File.java:932)
    	... 12 more
ed infine anche il Gradle :

apply plugin: 'com.android.application'

android {
    compileSdkVersion 27
    defaultConfig {
        applicationId "com.example.mufas.bookonline"
        minSdkVersion 21
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}


Risultato l'app viene correttamente eseguita ma il file non viene creato dove sbaglio? Ripeto il mio prossimo step sarebbe quello di poter eliminare un file in una directory precisa (bottone cancella) ed inviarlo a un server remoto si tratterà di un csv e non di un txt.


Grazie a tutti e buon lavoro, e scusate se tutto ciò vi sembra stupido oppure ho scritto oscenità.

2 Risposte

  • Re: Problema Creazione file con Java

    Ok allora in attesa di risposte ho parzialmente risolto il primo ostacolo, magari è utile ad altri utenti, in pratica dalla versione 6 in poi android, Google ha un po cambiato le regole del gioco per i permessi che vanno cmq adeguatamenti settati ne file MANIFEST.

    Una soluzione poco pulita, ma sicuramente mooolto efficace, è cambiare il GRADLE in questo modo:

    apply plugin: 'com.android.application'

    android {
    compileSdkVersion 27
    defaultConfig {
    applicationId "com.example.mufas.bookonline"
    minSdkVersion 21
    targetSdkVersion 21
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }


    Questo mi ha permesso di riuscire a scrivere il file in una cartella temporanea che però si limita a quelle di default di android vorrei capire come fare a far puntare Enviroment ad un percorso specifico come indicato qui:



    Qualcuno può aiutarmi a capire come fare?

    Prossimo passo a questo punto sarà come dicevo riuscire ad eliminare/svuotare un file csv da un percorso specifico e inviarlo in una cartella su un server remoto.
  • Re: Problema Creazione file con Java

    Nessuno?
Devi accedere o registrarti per scrivere nel forum
2 risposte