elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Como guardar arraylist en archivo de texto interno android java
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Como guardar arraylist en archivo de texto interno android java  (Leído 6,499 veces)
victor96

Desconectado Desconectado

Mensajes: 10


Ver Perfil
Como guardar arraylist en archivo de texto interno android java
« en: 19 Noviembre 2018, 12:32 pm »

Estoy buscando como guardar mediante código un archivo de texto que contenga un arraylist, he intentado con este código, pero da error cuando intenta guardar dicho arraylist en el archivo

 try
            {
                OutputStreamWriter fout=
                        new OutputStreamWriter(
                                openFileOutput("contactos.txt", Context.MODE_PRIVATE));

                fout.write(contactos);
                fout.close();
            }
            catch (Exception ex)
            {
                Log.e("Ficheros", "Error al escribir fichero a memoria interna");
            }

En este caso contactos es el arraylist que deseo guardar dentro del archivo contactos.txt


En línea

rub'n


Desconectado Desconectado

Mensajes: 1.217


(e -> λ("live now")); tatuar -> λ("α");


Ver Perfil WWW
Re: Como guardar arraylist en archivo de texto interno android java
« Respuesta #1 en: 19 Noviembre 2018, 13:42 pm »

Hola usa Geshi, y prueba este código, depende como lo apliques quizas genere error, postea el log para ver la posible excepción  



openFileOutput escribe datos en el directorio interno, haciéndolo privado para tu aplicación la linea 7 lo mete en un Thread() o sea, asíncrono para que cuando sean muchos contactos tu UI no se bloque, bueno hay muchas formas para correr eso de manera asíncrona, siendo esta una de las mas guarras como dicen en Spain, porque no retorna ningún valor


Código
  1.    private void writeFileTo() {
  2.        final List<ContactoDemo> contactos = new ArrayList<>();
  3.        contactos.add(new ContactoDemo("victor96", 32525, "oculto"));
  4.        contactos.add(new ContactoDemo("victor96", 32525, "oculto"));
  5.        contactos.add(new ContactoDemo("victor96", 32525, "oculto"));
  6.        new Thread(() -> {
  7.            try (final BufferedOutputStream bR = new BufferedOutputStream(openFileOutput("contactos.txt", Context.MODE_PRIVATE))) {
  8.                contactos.forEach(contacto -> {
  9.                    try {
  10.                        bR.write((contacto.toString() + "\n").getBytes());
  11.                    } catch (Exception ex) {
  12.                        ex.printStackTrace();
  13.                    }
  14.                });
  15.            } catch (Exception ex) {
  16.                ex.printStackTrace();
  17.            }
  18.        }).start();
  19.    }
  20.  

Código
  1. public class ContactoDemo {
  2.        private String name;
  3.        private int phone;
  4.        private String email;
  5.  
  6.        public ContactoDemo(String name, int phone, String email) {
  7.            this.name = name;
  8.            this.phone = phone;
  9.            this.email = email;
  10.        }
  11.  
  12.        public String getName() {
  13.            return name;
  14.        }
  15.  
  16.        public void setName(String name) {
  17.            this.name = name;
  18.        }
  19.  
  20.        public int getPhone() {
  21.            return phone;
  22.        }
  23.  
  24.        public void setPhone(int phone) {
  25.            this.phone = phone;
  26.        }
  27.  
  28.        public String getEmail() {
  29.            return email;
  30.        }
  31.  
  32.        public void setEmail(String email) {
  33.            this.email = email;
  34.        }
  35.  
  36.        @Override
  37.        public String toString() {
  38.            return "ContactoDemo{" +
  39.                    "name='" + name + '\'' +
  40.                    ", phone=" + phone +
  41.                    ", email='" + email + '\'' +
  42.                    '}';
  43.        }
  44.    }
  45.  


Aparentemente pareciera que no escribiste nada pero en realidad si debes agregar esto en tu AndroidManifest.xml fuera del tag <application></application>

Código
  1. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

Si intentas leer el archivo contactos.txt debes añadir también

Código
  1. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

Código
  1. private String readFileFrom() {
  2.        final StringBuilder sb = new StringBuilder();
  3.        try(final BufferedReader bR = new BufferedReader(new InputStreamReader(openFileInput("contactos.txt")))) {
  4.  
  5.            bR.lines().forEach(texto -> sb.append(texto+"\n"));
  6.  
  7.        } catch (IOException ex) { ex.printStackTrace(); }
  8.        return sb.toString();
  9. }
  10.  

Te debería imprimir su contenido, en realidad para tener acceso físico a ese archivo debes tener el smartphone rooteado, a menos que uses el Device File Explorer por ejemplo el de Android Studio, esto es solo en modo de developer


Si deseas escribir el fichero contactos.txt  en directorios públicos como Documents, Movies, DCIM etc , debes usar

Código
  1. Environment.getExternalStoragePublicDirectory()

primero creas el directorio en cuestión por ejemplo /Contactos porque? pues porque no existe, sino arrojaría

Código
  1. java.nio.file.NoSuchFileException: /storage/emulated/0/Contactos/contactos.txt

Código
  1. final Path dir = Paths.get(Environment.getExternalStoragePublicDirectory("/Contactos").toString());
  2.    if (!Files.exists(dir)) {
  3.        try {
  4.            Files.createDirectory(dir);
  5.        } catch (IOException e) {
  6.            e.printStackTrace();
  7.        }
  8.     }
  9.  

Una vez que ya tenemos el directorio creado podemos indicar donde queremos que se cree nuestro contactos.txt

Código
  1. final Path dir2 = Paths.get(Environment.getExternalStoragePublicDirectory("/Contactos/contactos.txt").toString());
  2. try (final BufferedOutputStream b = new BufferedOutputStream(Files.newOutputStream(dir2))) {
  3.     contactos.forEach(contacto -> {
  4.         try {
  5.             b.write((contacto.toString() + "\n").getBytes());
  6.         } catch (IOException e) {
  7.             e.printStackTrace();
  8.         }
  9.     });
  10. }catch (IOException ex) {
  11.    ex.printStackTrace();
  12. }
  13.  

quedando

Código
  1. private void writeFileTo() {
  2.        final List<ContactoDemo> contactos = new ArrayList<>();
  3.        contactos.add(new ContactoDemo("victor96", 32525, "oculto"));
  4.        contactos.add(new ContactoDemo("victor96", 32525, "oculto"));
  5.        contactos.add(new ContactoDemo("victor96", 32525, "oculto"));
  6.        new Thread(() -> {
  7.            final Path dir = Paths.get(Environment.getExternalStoragePublicDirectory("/Contactos").toString());
  8.            if (!Files.exists(dir)) {
  9.                try {
  10.                    Files.createDirectory(dir);
  11.                } catch (IOException e) {
  12.                    e.printStackTrace();
  13.                }
  14.            }
  15.            final Path dir2 = Paths.get(Environment.getExternalStoragePublicDirectory("/Contactos/contactos.txt").toString());
  16.            try (final BufferedOutputStream b = new BufferedOutputStream(Files.newOutputStream(dir2))) {
  17.                contactos.forEach(contacto -> {
  18.                    try {
  19.                        b.write((contacto.toString() + "\n").getBytes());
  20.                    } catch (IOException e) {
  21.                        e.printStackTrace();
  22.                    }
  23.                });
  24.            } catch (IOException ex) {
  25.                ex.printStackTrace();
  26.            }
  27.        }).start();
  28.    }


« Última modificación: 23 Noviembre 2018, 17:50 pm por rub'n » En línea

rubn0x52.com KNOWLEDGE  SHOULD BE FREE.
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen king
victor96

Desconectado Desconectado

Mensajes: 10


Ver Perfil
Re: Como guardar arraylist en archivo de texto interno android java
« Respuesta #2 en: 21 Noviembre 2018, 14:50 pm »

He probado el código que me has proporcionado, pero sigo teniendo un error que no se como solucionar:

He probado a debuggear el programa para ver que es lo que falla y me aparece que el fallo se encuentra en la linea 10, justo la linea que crea el archivo.

Este es el codigo que probe:

 
Código:
@RequiresApi(api = Build.VERSION_CODES.O)
    private void escribirDatosContactos(List contactos) {


        new Thread(() -> {
            final Path dir = Paths.get(Environment.getExternalStoragePublicDirectory("/Contactos").toString());
            if (!Files.exists(dir)) {
                try {
                    
                    Files.createDirectory(dir);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            final Path dir2 = Paths.get(Environment.getExternalStoragePublicDirectory("/Contactos/contactos.txt").toString());
            try (final BufferedOutputStream b = new BufferedOutputStream(Files.newOutputStream(dir2))) {
                contactos.forEach(contacto -> {
                    try {
                        b.write((contacto.toString() + "\n").getBytes());
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                });
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }).start();
    } @RequiresApi(api = Build.VERSION_CODES.O)
    private void escribirDatosContactos(List contactos) {


        new Thread(() -> {
            final Path dir = Paths.get(Environment.getExternalStoragePublicDirectory("/Contactos").toString());
            if (!Files.exists(dir)) {
                try {
                    
                    Files.createDirectory(dir);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            final Path dir2 = Paths.get(Environment.getExternalStoragePublicDirectory("/Contactos/contactos.txt").toString());
            try (final BufferedOutputStream b = new BufferedOutputStream(Files.newOutputStream(dir2))) {
                contactos.forEach(contacto -> {
                    try {
                        b.write((contacto.toString() + "\n").getBytes());
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                });
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }).start();
    }

Y esta es la excepción que me aparece en el debugger:

Código:
e: "java.nio.file.AccessDeniedException: /storage/emulated/0/Contactos"
Al ser AccessDeniedException he pensado que podria ser por falta de permisos en la ruta, entonces he añadido estas dos lineas de codigo:

Código
  1. Path dirabsoluta= Environment.getExternalStorageDirectory().toPath();
  2.  
  3. Files.setPosixFilePermissions(dirabsoluta, PosixFilePermissions.fromString("rwxrwxrwx"));

Antes de crear el directorio, pero me sigue apareciendo el mismo error a pesar de que le concedo todos los permisos para crear la carpeta allí

No se que puede ser la verdad
« Última modificación: 21 Noviembre 2018, 14:56 pm por victor96 » En línea

rub'n


Desconectado Desconectado

Mensajes: 1.217


(e -> λ("live now")); tatuar -> λ("α");


Ver Perfil WWW
Re: Como guardar arraylist en archivo de texto interno android java
« Respuesta #3 en: 21 Noviembre 2018, 15:07 pm »

Hola,

Bueno como decia Jack aka el popular the Ripper(destripador), empecemos por partes
     

Usa geshi, por segunda vez  :xD

  • Versión de Api que estas usando
  • Añadiste los permisos en el AndroidManifest.xml
  • Pregunta importante donde deseas escribir? en un directorio publico o privado?

y de paso tu  metodo

Código
  1. private void escribirDatosContactos(List contactos) {}

No usas el parámetro entrante ahí correspondiente a la linea 10 dog
« Última modificación: 21 Noviembre 2018, 15:32 pm por rub'n » En línea

rubn0x52.com KNOWLEDGE  SHOULD BE FREE.
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen king
victor96

Desconectado Desconectado

Mensajes: 10


Ver Perfil
Re: Como guardar arraylist en archivo de texto interno android java
« Respuesta #4 en: 21 Noviembre 2018, 16:02 pm »

Gracias de nuevo por tu ayuda, te contesto a todas:

1. Creo que mi version es la 4.03(15), pero como puedes ver en el código, puse para que pueda permitir hasta la versión oreo(26)

Código
  1. @RequiresApi(api = Build.VERSION_CODES.O)

2. Los permisos los tengo metidos fuera de la aplicacion te pongo el androidmanifest para que lo puedas ver completo:

Código
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3.    package="com.example.victor.miscompaneros">
  4.  
  5.    <application
  6.        android:allowBackup="true"
  7.        android:icon="@mipmap/ic_launcher"
  8.        android:label="@string/app_name"
  9.        android:roundIcon="@mipmap/ic_launcher_round"
  10.        android:supportsRtl="true"
  11.        android:theme="@style/AppTheme">
  12.        <activity android:name=".MainActivity" android:screenOrientation="fullSensor">
  13.            <intent-filter>
  14.                <action android:name="android.intent.action.MAIN" />
  15.  
  16.                <category android:name="android.intent.category.LAUNCHER" />
  17.            </intent-filter>
  18.        </activity>
  19.  
  20.        <activity android:name=".menucontactos" android:screenOrientation="fullSensor"></activity>
  21.        <activity android:name=".editarcontacto" android:screenOrientation="fullSensor"></activity>
  22.    </application>
  23.  
  24.    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  25.    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  26.  
  27.  
  28.  
  29. </manifest>
  30.  

3. No me importa realmente si es en uno publico o en uno privado, el que de menos problemas para escribir.

4. Si que uso el parámetro, lo que pasa es que lo tengo declarado en otra parte del programa de esta forma:

Código
  1. final List<Contacto> contactos = new ArrayList<>();

Y luego entra en un metodo como parametro

Código
  1. escribirDatosContactos(contactos);

No quiero poner el código completo del programa porque es muy largo, disculpas si te ha podido confundir, si necesitas mas lineas de código dímelo.
En línea

rub'n


Desconectado Desconectado

Mensajes: 1.217


(e -> λ("live now")); tatuar -> λ("α");


Ver Perfil WWW
Re: Como guardar arraylist en archivo de texto interno android java
« Respuesta #5 en: 21 Noviembre 2018, 21:28 pm »

dog esa anotación por alguna razón vía reflection no esta haciendo el trabajo, todo lo hice con la ultima API de android, si estas usando un api tan vieja sera por tus requerimientos  :-\ , algo pasa por ahí q no logro ver aun, baje hasta la api ICE CREAM

logro escribir el archivo en la sdDcard /Contactos/contactos.txt y visualizarlo por el Device File Explorer de momento

me reporto luego...

« Última modificación: 21 Noviembre 2018, 21:32 pm por rub'n » En línea

rubn0x52.com KNOWLEDGE  SHOULD BE FREE.
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen king
victor96

Desconectado Desconectado

Mensajes: 10


Ver Perfil
Re: Como guardar arraylist en archivo de texto interno android java
« Respuesta #6 en: 22 Noviembre 2018, 14:22 pm »

Pues lo único que se me ocurre es pasarte el código completo, haber si puedes ver el fallo :S

Editar contacto.java

Código
  1. package com.example.victor.miscompaneros;
  2.  
  3. import android.annotation.TargetApi;
  4. import android.content.Context;
  5. import android.content.Intent;
  6. import android.graphics.Color;
  7. import android.net.Uri;
  8. import android.os.Build;
  9. import android.os.Bundle;
  10. import android.os.Environment;
  11. import android.provider.MediaStore;
  12. import android.support.annotation.RequiresApi;
  13. import android.support.v7.app.AppCompatActivity;
  14. import android.telephony.PhoneNumberUtils;
  15. import android.util.Log;
  16. import android.view.Gravity;
  17. import android.view.View;
  18. import android.widget.Button;
  19. import android.widget.ImageView;
  20. import android.widget.TableLayout;
  21. import android.widget.TableRow;
  22. import android.widget.TextView;
  23.  
  24. import java.io.BufferedOutputStream;
  25. import java.io.BufferedReader;
  26. import java.io.BufferedWriter;
  27. import java.io.DataOutputStream;
  28. import java.io.File;
  29. import java.io.FileInputStream;
  30. import java.io.FileNotFoundException;
  31. import java.io.FileOutputStream;
  32. import java.io.FileWriter;
  33. import java.io.IOException;
  34. import java.io.InputStreamReader;
  35. import java.io.ObjectInputStream;
  36. import java.io.ObjectOutputStream;
  37. import java.io.OutputStreamWriter;
  38. import java.io.Serializable;
  39. import java.nio.file.Files;
  40. import java.nio.file.Path;
  41. import java.nio.file.Paths;
  42. import java.nio.file.attribute.PosixFilePermissions;
  43. import java.time.LocalDate;
  44. import java.time.Period;
  45. import java.time.ZoneId;
  46. import java.util.ArrayList;
  47. import java.util.Date;
  48. import java.util.List;
  49. import java.util.logging.Level;
  50. import java.util.logging.Logger;
  51.  
  52.  
  53. public class editarcontacto  extends AppCompatActivity implements Serializable{
  54.  
  55.  
  56.  
  57.    TextView campo1, campo2, campo3, campo4, campo5, campo6, campo7, campo8, advertencia1;
  58.  
  59.    Integer telefono;
  60.    String nombre, papellido, sapellido, direccion, poblacion;
  61.    private static final int PICK_IMAGE = 100;
  62.    Uri imageUri;
  63.    ImageView foto_gallery;
  64.    Button boton1;
  65.    LocalDate fechanacimiento;
  66.    TableLayout lista;
  67.    static int contGlobal=0;
  68.  
  69.  
  70.  
  71.    TableRow tabla2, tabla3, tabla4, tabla5, tabla6, tabla7, tabla8, tabla9;
  72.  
  73.    int filas = 0, columnas = 0;
  74.  
  75.    //static ArrayList<Contacto> contactos = new ArrayList<Contacto>();
  76.    final List<Contacto> contactos = new ArrayList<>();
  77.  
  78.    int i = 0;
  79.  
  80.    /*String ruta ="/home/miscompaneros/contactos.txt";
  81.     File archivo = new File(this.getExternalFilesDir("hola"));*/
  82.    //File archivo = new File(this.getExternalFilesDir(null),"hola");
  83.  
  84.  
  85.  
  86.  
  87.    @Override
  88.    @TargetApi(Build.VERSION_CODES.P)
  89.    protected void onCreate(Bundle savedInstanceState) {
  90.        super.onCreate(savedInstanceState);
  91.        setContentView(R.layout.editarcontacto);
  92.  
  93.  
  94.  
  95.  
  96.        //se asigna el campo de texto a la id que deseamos
  97.        campo1 = (TextView) findViewById(R.id.campo1);
  98.        campo2 = (TextView) findViewById(R.id.campo2);
  99.        campo3 = (TextView) findViewById(R.id.campo3);
  100.        campo4 = (TextView) findViewById(R.id.campo4);
  101.        campo5 = (TextView) findViewById(R.id.campo5);
  102.        campo6 = (TextView) findViewById(R.id.campo6);
  103.        campo7 = (TextView) findViewById(R.id.campo7);
  104.        campo8 = (TextView) findViewById(R.id.textView2);
  105.        foto_gallery = (ImageView) findViewById(R.id.imageView);
  106.        boton1 = (Button) findViewById(R.id.button7);
  107.        lista = (TableLayout) findViewById(R.id.lista);
  108.  
  109.  
  110.        //definimos las tablas
  111.  
  112.        tabla2 = (TableRow) findViewById(R.id.tabla2);
  113.        /*tabla3= (TableRow) findViewById(R.id.tabla3);
  114.         tabla4= (TableRow) findViewById(R.id.tabla4);
  115.         tabla5= (TableRow) findViewById(R.id.tabla5);
  116.         tabla6= (TableRow) findViewById(R.id.tabla6);
  117.         tabla7= (TableRow) findViewById(R.id.tabla7);
  118.         tabla8= (TableRow) findViewById(R.id.tabla8);
  119.         tabla9= (TableRow) findViewById(R.id.tabla9);
  120.         */
  121.  
  122.  
  123.  
  124.  
  125.        advertencia1 = (TextView) findViewById(R.id.textView3);
  126.  
  127.        //if (contactos.size()>=1) {
  128.  
  129.            //cargardatosentabla();
  130.        //}
  131.  
  132.  
  133.        foto_gallery.setOnClickListener(new View.OnClickListener() {
  134.            @Override
  135.            public void onClick(View v) {
  136.                openGallery();
  137.            }
  138.        });
  139.  
  140.  
  141.        Intent intent = getIntent();
  142.        //Le llega la accion que debe tomar
  143.        Bundle extras = intent.getExtras();
  144.  
  145.        int dato = extras.getInt("DATO");
  146.  
  147.        if (dato == 1) {
  148.            campo8.setText("AÑADIR CONTACTO");
  149.            boton1.setText("Añadir");
  150.  
  151.        }
  152.  
  153.    }
  154.  
  155.    /*private void cargardatosentabla() {
  156.  
  157.         TextView textview1 = (TextView) findViewById(R.id.textView10);
  158.         TextView textview2 = (TextView) findViewById(R.id.textView11);
  159.         TextView textview3 = (TextView) findViewById(R.id.textView12);
  160.         TextView textview4 = (TextView) findViewById(R.id.textView13);
  161.  
  162.         for (int cont=0;cont<contactos.size();cont++)
  163.         {
  164.             String n = contactos.get(i).getNombre();
  165.             String apellido1 = contactos.get(i).getPapellido();
  166.             String apellido2 = contactos.get(i).getSapellido();
  167.             String apellidos = apellido1 + " " + apellido2;
  168.             Integer telefono = contactos.get(i).getTelefono();
  169.             String poblacion = contactos.get(i).getPoblacion();
  170.             //LocalDate f = contactos.get(i).getFechanacimiento();
  171.  
  172.  
  173.             //añadimos los atributos a sus respectivo texto
  174.  
  175.             textview1.setText(n);
  176.             textview2.setText(apellidos);
  177.             textview3.setText(String.valueOf(telefono));
  178.             textview4.setText(poblacion);
  179.         }
  180.     }*/
  181.  
  182.    public void metodo_iniciar(View view) {
  183.  
  184.        Intent intent = new Intent(getApplicationContext(), menucontactos.class);
  185.        intent.putExtra("DATO", 1);
  186.        startActivity(intent);
  187.        finish();
  188.    }
  189.  
  190.    @TargetApi(Build.VERSION_CODES.P)
  191.    public void metodo_editar2(View view) throws IOException, ClassNotFoundException {
  192.  
  193.        setContentView(R.layout.menucontactos);
  194.  
  195.        //fila1
  196.        TextView textview1 = (TextView) findViewById(R.id.textView10);
  197.        TextView textview2 = (TextView) findViewById(R.id.textView11);
  198.        TextView textview3 = (TextView) findViewById(R.id.textView12);
  199.        TextView textview4 = (TextView) findViewById(R.id.textView13);
  200.        Button button1 = (Button) findViewById(R.id.button1);
  201.  
  202.        //fila2
  203.        TextView textview20 = (TextView) findViewById(R.id.textView20);
  204.        TextView textview21 = (TextView) findViewById(R.id.textView21);
  205.        TextView textview22 = (TextView) findViewById(R.id.textView22);
  206.        TextView textview23 = (TextView) findViewById(R.id.textView23);
  207.        Button button2 = (Button) findViewById(R.id.button2);
  208.  
  209.        //se añade el contacto
  210.  
  211.        nombre = campo1.getText().toString();
  212.        papellido = campo2.getText().toString();
  213.        sapellido = campo3.getText().toString();
  214.        direccion = campo4.getText().toString();
  215.        poblacion = campo6.getText().toString();
  216.        try {
  217.            telefono = Integer.parseInt(campo5.getText().toString());
  218.        } catch (Exception e) {
  219.  
  220.            advertencia1.setText("INTRODUZCA UN TELEFONO CORRECTO");
  221.            advertencia1.setVisibility(View.VISIBLE);
  222.        }
  223.        try {
  224.            fechanacimiento = LocalDate.parse(campo7.getText().toString());
  225.  
  226.  
  227.            //convertimos la fecha tipo date en local date
  228.            //fechanacimiento = fechanacimiento.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
  229.  
  230.            LocalDate fechaactual = LocalDate.now();
  231.            LocalDate birthday = LocalDate.of(fechaactual.getYear(), fechanacimiento.getMonthValue(), fechanacimiento.getDayOfMonth());
  232.            if (fechaactual.isAfter(birthday))
  233.                birthday = birthday.plusYears(1);
  234.            Period diff = Period.between(fechaactual, birthday);
  235.            Contacto contacto = new Contacto(nombre, papellido, sapellido, direccion, poblacion, R.drawable.agenda, telefono, fechanacimiento);
  236.  
  237.            contactos.add(contacto);
  238.  
  239.  
  240.            // se añade el array a la tabla del menu superior
  241.  
  242.  
  243.            do {
  244.  
  245.  
  246.                String n = contactos.get(i).getNombre();
  247.                String apellido1 = contactos.get(i).getPapellido();
  248.                String apellido2 = contactos.get(i).getSapellido();
  249.                String apellidos = apellido1 + " " + apellido2;
  250.                Integer telefono = contactos.get(i).getTelefono();
  251.                String poblacion = contactos.get(i).getPoblacion();
  252.                //LocalDate f = contactos.get(i).getFechanacimiento();
  253.  
  254.  
  255.                //añadimos los atributos a sus respectivo texto
  256.                switch(i) {
  257.                    case 0: textview1.setText(n);
  258.                    textview2.setText(apellidos);
  259.                    textview3.setText(String.valueOf(telefono));
  260.                    textview4.setText(poblacion);
  261.                    button1.setVisibility(View.VISIBLE);
  262.                    break;
  263.  
  264.                    case 1:
  265.                        textview20.setText(n);
  266.                        textview21.setText(apellidos);
  267.                        textview22.setText(String.valueOf(telefono));
  268.                        textview23.setText(poblacion);
  269.                        button2.setVisibility(View.VISIBLE);
  270.                        break;
  271.                }
  272.  
  273.                //convertimos fecha en string para poder añadirla al texto
  274.                //String fechatexto = contactos.get(i).convertirfecha(contactos.get(i).getFechanacimiento());
  275.  
  276.                //textofecha.setText(fechatexto);
  277.  
  278.                //escribirDatosContactos();
  279.  
  280.                i++;
  281.  
  282.            } while (i < (contactos.size() - 1));
  283.  
  284.            //Guarda estado de actividad antes de cerrarla
  285.            escribirDatosContactos(contactos);
  286.  
  287.  
  288.        } catch (Exception e) {
  289.  
  290.            Logger.getLogger(editarcontacto.class.getName()).log(Level.SEVERE, null, e);
  291.            //e.printStackTrace();
  292.            advertencia1.setText("INTRODUZCA UNA FECHA CORRECTA");
  293.            advertencia1.setVisibility(View.VISIBLE);
  294.        }
  295.  
  296.        //cerramos esta actividad
  297.        finish();
  298.  
  299.        //iniciamos la actividad desde menucontactos
  300.        Intent intent = new Intent(getApplicationContext(), menucontactos.class);
  301.        intent.putExtra("DATO",1);
  302.        startActivity(intent);
  303.  
  304.            leerFichContactos(contactos);
  305.  
  306.  
  307.    }
  308.  
  309.  
  310.    private void openGallery() {
  311.        Intent gallery = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.INTERNAL_CONTENT_URI);
  312.        startActivityForResult(gallery, PICK_IMAGE);
  313.    }
  314.  
  315.    @Override
  316.    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  317.        if (resultCode == RESULT_OK && requestCode == PICK_IMAGE) {
  318.            imageUri = data.getData();
  319.            foto_gallery.setImageURI(imageUri);
  320.        }
  321.    }
  322.  
  323.  
  324.    /*@RequiresApi(api = Build.VERSION_CODES.KITKAT)
  325.     static void leerFichContactos(File archivo) throws IOException, ClassNotFoundException {
  326.  
  327.         if(archivo.exists()) {
  328.             FileInputStream fileIn = new FileInputStream(archivo);
  329.             ObjectInputStream objectIn = new ObjectInputStream(fileIn);
  330.             contactos = (ArrayList<Contacto>) objectIn.readObject();
  331.             objectIn.close();
  332.  
  333.             ObjectInputStream leyendoFichero = new ObjectInputStream(new FileInputStream("ruta"));
  334.             contactos = (ArrayList<Contacto>) leyendoFichero.readObject();
  335.             leyendoFichero.close();
  336.         }
  337.  
  338.     }*/
  339.    @RequiresApi(api = Build.VERSION_CODES.N)
  340.    private String leerFichContactos(List contactos) {
  341.        final StringBuilder sb = new StringBuilder();
  342.        try(final BufferedReader bR = new BufferedReader(new InputStreamReader(openFileInput("contactos.txt")))) {
  343.  
  344.            bR.lines().forEach(texto -> sb.append(texto+"\n"));
  345.  
  346.        } catch (IOException ex) { ex.printStackTrace(); }
  347.        return sb.toString();
  348.    }
  349.  
  350.  
  351.    /*@RequiresApi(api = Build.VERSION_CODES.KITKAT)
  352.     static void escribirDatosContactos(File archivo) throws IOException {
  353.  
  354.  
  355.  
  356.         if(!archivo.exists()) {
  357.             archivo.getParentFile().mkdirs();
  358.             archivo.createNewFile();
  359.         }
  360.         else{
  361.             FileOutputStream fout=new FileOutputStream("/home/miscompaneros/contactos.txt");
  362.             ObjectOutputStream out= new ObjectOutputStream(fout);
  363.             out.writeObject(contactos);
  364.             out.close();
  365.         }
  366.  
  367.  
  368.     }*/
  369.  
  370.    @RequiresApi(api = Build.VERSION_CODES.O)
  371.    private void escribirDatosContactos(List contactos) {
  372.  
  373.  
  374.        new Thread(() -> {
  375.            final Path dir = Paths.get(Environment.getExternalStoragePublicDirectory("/Contactos").toString());
  376.            if (!Files.exists(dir)) {
  377.                try {
  378.  
  379.                    Files.createDirectory(dir);
  380.                } catch (IOException e) {
  381.                    e.printStackTrace();
  382.                }
  383.            }
  384.            final Path dir2 = Paths.get(Environment.getExternalStoragePublicDirectory("/Contactos/contactos.txt").toString());
  385.            try (final BufferedOutputStream b = new BufferedOutputStream(Files.newOutputStream(dir2))) {
  386.                contactos.forEach(contacto -> {
  387.                    try {
  388.                        b.write((contacto.toString() + "\n").getBytes());
  389.                    } catch (IOException e) {
  390.                        e.printStackTrace();
  391.                    }
  392.                });
  393.            } catch (IOException ex) {
  394.                ex.printStackTrace();
  395.            }
  396.        }).start();
  397.    }
  398.  
  399.    }
  400.  
  401.  
  402.  
En línea

rub'n


Desconectado Desconectado

Mensajes: 1.217


(e -> λ("live now")); tatuar -> λ("α");


Ver Perfil WWW
Re: Como guardar arraylist en archivo de texto interno android java
« Respuesta #7 en: 22 Noviembre 2018, 22:50 pm »

Hola, bueno bueno ok retomemos

Usa esta api, que es la ultima control + alt + s y en el buscador escribe android sdk



Como vas a usar otra api, debes crear una nueva unidad virtual, si por alguna razon no te quiera iniciar el .apk diciendo waiting for target device to come online android hazle wipe data como en la imagen siguiente



en tu archivo de compilación de gradle Module:app

Código
  1. android {
  2.    compileSdkVersion 28
  3.    defaultConfig {
  4.        applicationId "com.example.victor.miscompaneros"
  5.        minSdkVersion 16
  6.        targetSdkVersion 28
  7.        versionCode 1
  8.        versionName "1.0"
  9.        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
  10. }


este método lo vamos a invocar en la clase EditarContacto.java(Las clases se escriben con mayúsculas) en el onCreate() por ejemplo.
porque desde Marshmallow o superiores el código de solicitud 112 nos da permisos, en tiempo de ejecución

 
Código
  1. private void checkPermisosEnSdCard() {
  2.     //chekea si esta applicacion tienes permisos de lectura/escritura
  3.    int permisosSdCard = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
  4.  
  5.     //Si no posee permisos, los otorga para almacenamiento externo
  6.    if(permisosSdCard != PackageManager.PERMISSION_GRANTED) {
  7.        //Solicita por medio de una notificacion que esta app va a escribir en el la sd
  8.         ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 112);
  9.    }
  10.  
  11. }
  12.  

Pues anteriormente leemos el archivo .txt cuando estaba en el directorio privado de la siguiente manera, bueno yo, tu no podías  :xD

Código
  1. //este metodo no es que no sirva, pero si vamos a leer ahora desde un directorio publico pues
  2. @RequiresApi(api = Build.VERSION_CODES.N)
  3. private String leerFichContactos(List contactos) {
  4.    final StringBuilder sb = new StringBuilder();
  5.    try(final BufferedReader bR = new BufferedReader(new InputStreamReader(openFileInput("contactos.txt")))) {
  6.  
  7.        bR.lines().forEach(texto -> sb.append(texto+"\n"));
  8.  
  9.    } catch (IOException ex) { ex.printStackTrace(); }
  10.    return sb.toString();
  11. }
  12.  

Ahora así, no te dejes intimidar por el lijero cambio es casi lo mismo, en realidad no  me gusta ese InputStreamReader  :xD, y tambien que no necesitamos a openFileInput que retorna un FileInputStream, pero del directorio privado, no es este caso, estamos escribiendo y leyendo desde el public dir dog



No hace falta que le pases la lista como parámetro, porque leeremos desde el directorio
Código
  1. @RequiresApi(api = Build.VERSION_CODES.O)
  2. private String leerFichContactos() {
  3.    final StringBuilder sb = new StringBuilder();
  4.    final Path path = Paths.get(Environment.getExternalStoragePublicDirectory("/Contactos/contactos.txt").toString());
  5.    try (final BufferedReader reader = Files.newBufferedReader(path,StandardCharsets.UTF_8)) {
  6.  
  7.        reader.lines().forEach(texto -> sb.append(texto + "\n"));
  8.  
  9.    } catch (IOException ex) {
  10.         ex.printStackTrace();
  11.    }
  12.        return sb.toString();
  13. }
  14.  

Otras cosas que se me había olvidado, por ejemplo para hacer el trabajo casi completo, bueno hasta que apliques todo lo que te menciono, si por casualidad no encuentras el directorio en el emulador, en archivos, en la esquina superior derecha debes darle mostrar almacenamiento interno.

En la linea 235, tu clase Contacto, tienes un contructor telescópico, cuando tengas una clase con unos 3 parámetros o mas, aplica
patron builder, la hará mas legible, mantenible etc.


yyyyy el método escribirDatosContactos()  :xD

lo primero que te mostré recuerda que en tu clase Contacto debes tener sobrescrito el método toString() si o si para este ejemplo, en el Android Studio oprime alt + insertar, y ahí puedes crear el toString() ya configurado con todas las instancias concatenadas.

« Última modificación: 5 Diciembre 2018, 13:36 pm por rub'n » En línea

rubn0x52.com KNOWLEDGE  SHOULD BE FREE.
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen king
victor96

Desconectado Desconectado

Mensajes: 10


Ver Perfil
Re: Como guardar arraylist en archivo de texto interno android java
« Respuesta #8 en: 23 Noviembre 2018, 19:36 pm »

Ya he conseguido que me guarde el fichero, muchas gracias, pero si quisiera cargar cada dato del   array y cargarlo en mi tablerow como podría hacerlo?
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[Java] - Guardar un ArrayList en una DB en Access?
Java
[GB] 2 5,459 Último mensaje 4 Agosto 2010, 09:47 am
por Debci
Guardar entrada estandar en un archivo de texto
Programación C/C++
gonzaloi 8 4,593 Último mensaje 3 Abril 2011, 00:23 am
por leogtz
Guardar ArrayList en archivo txt
Java
Arkzas 3 21,301 Último mensaje 9 Junio 2017, 06:27 am
por cunian
Cargar y Guardar un arraylist en un .txt JAVA
Java
joseandres04 2 4,602 Último mensaje 21 Noviembre 2017, 03:59 am
por joseandres04
¿Como guardar datos de pila en un archivo de texto? « 1 2 »
Programación C/C++
LuisUvtol 10 6,883 Último mensaje 3 Mayo 2020, 19:39 pm
por K-YreX
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines