Неправильно возвращать массив, перезаписывая все последним элементом - PullRequest
3 голосов
/ 08 апреля 2020

Я видел похожий пост, но у меня не та проблема. Я пытаюсь вызвать функцию, которая показывает имена файлов, пронумерованных как

1- File1.txt,
2- File2.txt
..

. Это работает, как и ожидалось. Проблема в том, что мне нужно вернуть путь к этим файлам в другом массиве. Когда я System.out.print(arrayRutasFicheros[j]) внутри for, он показывает все пути правильно. Но когда я пытаюсь получить доступ к arrayRutasFicheros[j] из других функций. Он просто переписывает все пути и показывает только последний.

public static String[] listarArchivos() throws IOException{

    File[] listadoDeFiles = documento.listFiles();
    File[] arrayFicheros = null;
    String[] arrayRutasFicheros = null;

    if(documento.exists() ) {

        for (int k=0; k< listadoDeFiles.length ;k++) {

            File ficheroRuta = listadoDeFiles[k];

            File fichero = new File(documento.getPath() + sep+ ficheroRuta.getName());

            if(fichero.isFile()==true) {

                arrayFicheros =new File[] {fichero};

                System.out.println( k + " - " + ficheroRuta.getName());

                for(int j= 0; j<arrayFicheros.length; j++) {

                    arrayRutasFicheros =  new String[] {arrayFicheros[j].getPath()};

                    //here it works and it display all the path
                    System.out.println(arrayRutasFicheros[j]);
                }   

            }   
        }       
    }

    return arrayRutasFicheros;
}

public static muestraUnArchivo() throws IOException {

    String [] Fichero =listarArchivos();

    for(int k=0; k<Fichero.length; k++) {

    //here just the last one
    System.out.print(Fichero[k]);       
    }
}

Ожидается:

-E:\Eclipse\Files\File1.txt   
-E:\Eclipse\Files\File2.txt  
-E:\Eclipse\Files\File3.txt   

Вывод:

-E:\Eclipse\Files\File3.txt

Ответы [ 3 ]

1 голос
/ 08 апреля 2020

Следующие строки не только не нужны, но и вызывают проблему, с которой вы столкнулись. Строка arrayRutasFicheros = new String[] {arrayFicheros[j].getPath()}; сбрасывает arrayRutasFicheros для каждого значения k, и поэтому вы получите только значение, присвоенное ему в последнем значении k.

if(fichero.isFile()==true) {

    arrayFicheros =new File[] {fichero};

    System.out.println( k + " - " + ficheroRuta.getName());

    for(int j= 0; j<arrayFicheros.length; j++) {

        arrayRutasFicheros =  new String[] {arrayFicheros[j].getPath()};

        //here it works and it display all the path
        System.out.println(arrayRutasFicheros[j]);
    }   

}  

Замените вышеуказанные строки следующим кодом:

if(fichero.isFile()) {
    arrayRutasFicheros[k] =  fichero.getPath();
} 

Не стесняйтесь комментировать в случае каких-либо сомнений / проблем.

1 голос
/ 08 апреля 2020

Ваш массив воссоздается на каждой итерации l oop, который также находится в массиве длиной 1. Вам нужна структура Dynami c для хранения путей к строкам, потому что вы не знаете заранее, сколько их. Кроме того, вам не нужно продолжать создавать одноэлементные массивы; используйте List<String>. Что-то вроде

public static String[] listarArchivos() throws IOException {
    List<String> al = new ArrayList<>();
    if (documento.exists()) {
        File[] listadoDeFiles = documento.listFiles();
        for (File ficheroRuta : listadoDeFiles) {
            File fichero = new File(documento.getPath() 
                    + sep + ficheroRuta.getName());
            if (fichero.isFile()) {
                al.add(fichero.getPath());
            }
        }
    }

    return al.toArray(new String[0]);
}
0 голосов
/ 08 апреля 2020

Следующая строка устанавливает последнее значение, когда for завершает итерацию.

Надеюсь, вы поймете логи c.

arrayRutasFicheros =  new String[] {arrayFicheros[j].getPath()};

Пожалуйста, дайте мне знать, если у вас есть какие-либо путаница.

Счастливое кодирование.

...