Sauvegarder un fichier en interne

rapidegoyes Messages postés 107 Date d'inscription samedi 22 février 2020 Statut Membre Dernière intervention 12 février 2025 - 23 déc. 2024 à 22:13
rapidegoyes Messages postés 107 Date d'inscription samedi 22 février 2020 Statut Membre Dernière intervention 12 février 2025 - 2 janv. 2025 à 16:47

Bonjour,

J'essaye de coder une petite appli avec android studio sous java.

J'ai l'intention de sauvegarder un fichier txt en interne.

Mon code compile sans problème mais lorsque je clique sur le bouton afficherFichier mon appli plante.

Ce bouton lance la méthode lireFichier.

Ci-dessous mon code ainsi que mon fichier xml pour identifier les divers widgets.

Le fichier .xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center_horizontal"
    tools:context=".RelevFragment">

    <!-- TODO: Update blank fragment layout -->
    <TextView
        android:id="@+id/Titre"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="25dp"
        android:padding="10dp"
        android:textSize="25sp"
        android:text="@string/relev_des_tensions"/>

    <EditText
        android:id="@+id/LesTensions"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="15dp"
        android:hint="@string/marquer_les_tensions_s_par_es_d_une_virgule_sans_espace"
        android:textSize="22sp"
        android:minHeight="200dp"
        android:layout_marginHorizontal="10dp"
        />

    <Button
        android:id="@+id/CreateFichier"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:text="@string/cr_er_le_fichier"
        android:textAlignment="center"
        android:textSize="20sp"
        android:paddingHorizontal="16dp"
        />

    <Button
        android:id="@+id/afficherFichier"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:text="@string/afficher_le_fichier"
        android:textAlignment="center"
        android:textSize="20sp"
        android:paddingHorizontal="16dp"/>

    <TextView
        android:id="@+id/Mesreleves"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:padding="10dp"
        android:textSize="20sp"

        />


</LinearLayout>
Le fichier ReleveFragment.java


package com.example.essaitension1;

import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.example.essaitension1.databinding.FragmentRelevBinding;
import org.jetbrains.annotations.Nullable;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class RelevFragment extends Fragment {
    //variable globale pour binding
    FragmentRelevBinding binding;
    public String  voirtensions; //variable représentant les tensions dans EditText

    //ci-dessous constructeur
    public RelevFragment() {
        this.voirtensions = voirtensions;
    }

    public static RelevFragment newInstance(){
    RelevFragment fragment = new RelevFragment();
    return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        //ci-dessous modif pour indiquer au systeme qu'il doit faire la liaison avec la classe
        // de liaison viewBinding
        binding = FragmentRelevBinding.inflate(inflater, container, false);
        return binding.getRoot();
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        binding.CreateFichier.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                voirtensions= binding.LesTensions.getText().toString();
                ecrireFichier("monFichier.txt", binding.LesTensions.getText().toString());
            }
        });
//************************************************************************************
        binding.afficherFichier.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                binding.LesTensions.setText(lireFichier("monFichier.txt"));
            }
        });
    }
//***********************************************************************************
    private void ecrireFichier(String nomFichier, String voirtensions){
        BufferedWriter writer = null;
        try {
            File dir = getDir("TousMesFichiers");
            File newfile = new File(dir.getAbsolutePath() + File.separator + nomFichier);
            newfile.createNewFile();
            writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(newfile)));
            writer.write(voirtensions);

        } catch (Exception e) {
            e.printStackTrace();
        }
        finally {
            if (writer != null)
            {
                try
                {
                    writer.close();
                } catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
        }
    }

    private File getDir(String tousMesFichiers) {

        return (null);
    }

   //************************************************************************************
    private String lireFichier(String nomFichier) {
        File dir = getDir("ToutMesFichiers");
        File newFile = new File(dir.getAbsolutePath() + File.separator + nomFichier);
        String voirtensions = " ";
        BufferedReader input = null;
        try {
            input = new BufferedReader(new InputStreamReader(new FileInputStream(newFile)));
            String line;
            StringBuffer buffer = new StringBuffer();
            while ((line = input.readLine()) != null) {
                buffer.append(line);
            }

            voirtensions = buffer.toString();
            
        } catch (Exception e) {
            e.printStackTrace();
        }
        finally {
            if (input != null) {
                try {
                    input.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return voirtensions;
    }


}
Merci et Joyeux Noël
a+++ rapidego


Windows / Firefox 133.0

A voir également:

5 réponses

BunoCS Messages postés 15505 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 5 février 2025 3 913
24 déc. 2024 à 09:46

Hello,

Que dit le logcat ? Cela devrait pouvoir t'aider je pense, et nous aussi par la même occasion


0
rapidegoyes Messages postés 107 Date d'inscription samedi 22 février 2020 Statut Membre Dernière intervention 12 février 2025 7
Modifié le 26 déc. 2024 à 18:05

Bonjour BrunoCS,

Merci de m'avoir répondu, juste une précision il y a environ cinq ou six années j'avais codé une petite appli et le code avait bien fonctionné.

Après avoir oublié un peu android studio je me suis remis à essayer de coder.

J'ai repris cette partie de mon code pour l'utiliser dans une nouvelle appli. Depuis des choses ont changées ! j'ai voulu relancer mon appli mais avec la nouvelle version impossible de relancer mon appli

Ci-dessous l'extrait du logcat.

ViewPostImeInputStage processPointer 0
2024-12-26 17:19:26.175 11570-11570 System                  com.example.essaitension1            W  ClassLoader referenced unknown path: /system/framework/QPerformance.jar
2024-12-26 17:19:26.179 11570-11570 BoostFramework          com.example.essaitension1            E  BoostFramework() : Exception_1 = java.lang.ClassNotFoundException: Didn't find class "com.qualcomm.qti.Performance" on path: DexPathList[[],nativeLibraryDirectories=[/system/lib64, /vendor/lib64]]
2024-12-26 17:19:26.179 11570-11570 BoostFramework          com.example.essaitension1            V  BoostFramework() : mPerf = null
2024-12-26 17:19:26.243 11570-11570 ViewRootIm...nActivity] com.example.essaitension1            D  ViewPostImeInputStage processPointer 1
2024-12-26 17:19:26.244 11570-11570 InputMethodManager      com.example.essaitension1            D  ISS - flag : 0Pid : 11570 view : com.example.essaitension1
2024-12-26 17:19:26.574 11570-11570 ViewRootIm...nActivity] com.example.essaitension1            D  MSG_RESIZED: ci=Rect(0, 96 - 0, 0) vi=Rect(0, 96 - 0, 1248) or=1
2024-12-26 17:19:39.930 11570-11570 ViewRootIm...nActivity] com.example.essaitension1            D  The input has been finished in ImeInputStage.
2024-12-26 17:19:39.972 11570-11570 ViewRootIm...nActivity] com.example.essaitension1            D  The input has been finished in ImeInputStage.
2024-12-26 17:19:39.998 11570-11570 ViewRootIm...nActivity] com.example.essaitension1            D  MSG_RESIZED: ci=Rect(0, 96 - 0, 0) vi=Rect(0, 96 - 0, 0) or=1
2024-12-26 17:19:42.797 11570-11570 ViewRootIm...nActivity] com.example.essaitension1            D  ViewPostImeInputStage processPointer 0
2024-12-26 17:19:42.930 11570-11570 ViewRootIm...nActivity] com.example.essaitension1            D  ViewPostImeInputStage processPointer 1
2024-12-26 17:19:42.939 11570-11570 System.err              com.example.essaitension1            W  java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.io.File.getAbsolutePath()' on a null object reference
2024-12-26 17:19:42.947 11570-11570 System.err              com.example.essaitension1            W  	at com.example.essaitension1.RelevFragment.ecrireFichier(RelevFragment.java:77)
2024-12-26 17:19:42.947 11570-11570 System.err              com.example.essaitension1            W  	at com.example.essaitension1.RelevFragment.-$$Nest$mecrireFichier(RelevFragment.java)
2024-12-26 17:19:42.947 11570-11570 System.err              com.example.essaitension1            W  	at com.example.essaitension1.RelevFragment$1.onClick(RelevFragment.java:61)
2024-12-26 17:19:42.947 11570-11570 System.err              com.example.essaitension1            W  	at android.view.View.performClick(View.java:6199)
2024-12-26 17:19:42.947 11570-11570 System.err              com.example.essaitension1            W  	at android.widget.TextView.performClick(TextView.java:11090)
2024-12-26 17:19:42.947 11570-11570 System.err              com.example.essaitension1            W  	at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1218)
2024-12-26 17:19:42.947 11570-11570 System.err              com.example.essaitension1            W  	at android.view.View$PerformClick.run(View.java:23647)
2024-12-26 17:19:42.947 11570-11570 System.err              com.example.essaitension1            W  	at android.os.Handler.handleCallback(Handler.java:751)
2024-12-26 17:19:42.947 11570-11570 System.err              com.example.essaitension1            W  	at android.os.Handler.dispatchMessage(Handler.java:95)
2024-12-26 17:19:42.947 11570-11570 System.err              com.example.essaitension1            W  	at android.os.Looper.loop(Looper.java:154)
2024-12-26 17:19:42.947 11570-11570 System.err              com.example.essaitension1            W  	at android.app.ActivityThread.main(ActivityThread.java:6682)
2024-12-26 17:19:42.947 11570-11570 System.err              com.example.essaitension1            W  	at java.lang.reflect.Method.invoke(Native Method)
2024-12-26 17:19:42.947 11570-11570 System.err              com.example.essaitension1            W  	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
2024-12-26 17:19:42.947 11570-11570 System.err              com.example.essaitension1            W  	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)
2024-12-26 17:20:03.285 11570-11570 ViewRootIm...nActivity] com.example.essaitension1            D  ViewPostImeInputStage processPointer 0
2024-12-26 17:20:03.445 11570-11570 ViewRootIm...nActivity] com.example.essaitension1            D  ViewPostImeInputStage processPointer 1
2024-12-26 17:20:03.451 11570-11570 AndroidRuntime          com.example.essaitension1            D  Shutting down VM
2024-12-26 17:20:03.453 11570-11570 AndroidRuntime          com.example.essaitension1            E  FATAL EXCEPTION: main
                                                                                                    Process: com.example.essaitension1, PID: 11570
                                                                                                    java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.io.File.getAbsolutePath()' on a null object reference
                                                                                                    	at com.example.essaitension1.RelevFragment.lireFichier(RelevFragment.java:107)
                                                                                                    	at com.example.essaitension1.RelevFragment.-$$Nest$mlireFichier(RelevFragment.java)
                                                                                                    	at com.example.essaitension1.RelevFragment$2.onClick(RelevFragment.java:68)
                                                                                                    	at android.view.View.performClick(View.java:6199)
                                                                                                    	at android.widget.TextView.performClick(TextView.java:11090)
                                                                                                    	at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1218)
                                                                                                    	at android.view.View$PerformClick.run(View.java:23647)
                                                                                                    	at android.os.Handler.handleCallback(Handler.java:751)
                                                                                                    	at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                                                    	at android.os.Looper.loop(Looper.java:154)
                                                                                                    	at android.app.ActivityThread.main(ActivityThread.java:6682)
                                                                                                    	at java.lang.reflect.Method.invoke(Native Method)
                                                                                                    	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
                                                                                                    	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)
---------------------------- PROCESS ENDED (11570) for package com.example.essaitension1 ----------------------------

voici la référence de Android studio installée

Android Studio Ladybug | 2024.2.1 Patch 3
Build #AI-242.23339.11.2421.12700392, built on November 22, 2024
Runtime version: 21.0.3+-12282718-b509.11 amd64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o.
Toolkit: sun.awt.windows.WToolkit
Windows 10.0
GC: G1 Young Generation, G1 Concurrent GC, G1 Old Generation
Memory: 2048M
Cores: 4
Registry:
  ide.experimental.ui=true
  i18n.locale=

1) je rentre quelques caractères

2) j'appuie sur le bouton Créer le fichier là pas de problème.

3) Je clique sur le bouton Afficher le fichier .

à ce moment mon appli plante avec le message Essaitension1 s'est arrêté

Ce qui me pose des questions c'est cette traduction du logcat ci-dessous:

Tentative d'invocation de la méthode virtuelle 'java.lang.String java.io.File.getAbsolutePath()' sur une référence d'objet nulle

Merci de bien vouloir m'aider.

Cordialement a +++

rapidego

0
rapidegoyes Messages postés 107 Date d'inscription samedi 22 février 2020 Statut Membre Dernière intervention 12 février 2025 7
26 déc. 2024 à 21:54

Bonsoir,

J'ai une autre traduction quand je clique sur mes deux boutons, soit l'un ou l'autre

java.io.IOException: No such file or directory

java.io.IOException : aucun fichier ou répertoire de ce type

donc je n'ai ni répertoire ni fichier

a+++ cordialement

rapidego

0
BunoCS Messages postés 15505 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 5 février 2025 3 913
2 janv. 2025 à 09:50

La gestion des fichiers a bien changé sur les dernières versions d'Android. Notamment, il faut maintenant gérer les permissions et les apps n'ont plus la possibilité d'aller lire/écrire n'importe où.

Voici la doc qui pourrait t'aider: https://developer.android.com/guide/topics/data?hl=fr


0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
rapidegoyes Messages postés 107 Date d'inscription samedi 22 février 2020 Statut Membre Dernière intervention 12 février 2025 7
2 janv. 2025 à 16:47

Bonsoir BrunoCS,

Merci pour le lien.

Je présente  à tous mes Meilleurs vœux pour 2025.

0 +++ cordialement

rapidegoyes

0