прочитать из файла, разделить строку и сохранить в массиве JAVA

Хорошо, ребята, прежде всего позвольте мне сказать, что я НОВИЧОК, когда дело доходит до программирования на JAVA. Я учусь сам, поэтому с этим, пожалуйста, потерпите меня, поскольку я делаю все возможное с тем, что у меня есть. С учетом сказанного, вот моя дилемма!!!

У меня есть файл Users.csv, в котором хранятся поля имени пользователя и пароля.

username,password
josh,123456ABC
bman,turtlestew123
etc...

Что я пытаюсь сделать, так это...

  1. Прочитайте строки из этого документа (Users.csv) (который находится в том же каталоге, что и файл класса)
  2. Разделите строки, используя .split(","); на входе
  3. Сохраните разделение 1 в массиве [0] и разделение 2 в том же массиве [1]

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

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class BufferedReaderExample {

    public static void main(String[] args) {

        try (BufferedReader br = new BufferedReader(new FileReader("Users.csv")))
        {

            String sCurrentLine;
            String first = "Username is: ";
            String second = "Password is: ";

            while ((sCurrentLine = br.readLine()) != null) {


                String[] information = sCurrentLine.split(",");
                String username = information[0];
                String password = information[1];
                System.out.println(username);
                System.out.println(password);
            }

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

    }
}

Этот код будет читать строки, разделять их и выводить на экран... но он не сохраняет их в массиве, поэтому я не могу использовать массив для поиска определенных элементов.

Это для входа в систему. простые поля имени пользователя и пароля. Когда человек нажимает кнопку входа в систему, я хочу, чтобы он извлекал информацию из файла, проверял имя пользователя и затем подтверждал свой пароль. Опять же, эта часть представляет собой общую картину, но я просто хочу, чтобы вы знали, для чего она используется.

Кроме того, пожалуйста, помните, что я очень неопытен, и если вы публикуете код, пожалуйста, не используйте что-то похожее, но другое, так как это еще больше меня сбивает с толку.


person user2414384    schedule 23.05.2013    source источник


Ответы (4)


Я думаю, что ваш массив не растет, потому что вы повторно объявляете каждую строку своего файла (это в цикле while). Чтобы исправить это, вы можете инициализировать свой массив перед циклом и использовать System.arraycopy, чтобы увеличить его.

Частью этого быстрого исправления, на мой взгляд, является ряд проблем с вашей идеей:

  • Имена пользователей и пароли не должны храниться в файле csv, а в базе данных.
  • Пароли должны быть хешированы и никогда не должны быть видны из самого приложения.
  • База данных должна быть засолена
  • Массив не является правильной структурой данных для представления пар ключ-значение - для этого следует использовать карту.
  • В этом случае получение всех имен пользователей/паролей в памяти для сравнения их с логином пользователя нецелесообразно. Вы должны хэшировать pwd, предоставленный пользователем, найти имя пользователя в базе данных и сравнить два хэша.

Я немного упрощаю, об этом есть куча литературы.

Удачи!

person Mena    schedule 23.05.2013

Обычно люди используют для этого ArrayList, а не Array. Для массива требуется знать общее количество элементов, в то время как массивист использует массив внизу и при необходимости динамически изменяет размеры (ну, создает массив большего размера и копирует данные).

В конкретном случае вам действительно нужна хэш-карта, которая принимает key и value.

   import java.io.BufferedReader;
    import java.io.FileReader;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;

public class BufferedReaderExample {

public static void main(String[] args) {



           try (BufferedReader br = new BufferedReader(new FileReader("Users.csv")))
            {

                String sCurrentLine;
                String first = "Username is: ";
                String second = "Password is: ";
                java.util.HashMap<String,String> data = new java.util.HashMap<String,String>();


                while ((sCurrentLine = br.readLine()) != null) {       
                    String[] information = sCurrentLine.split(",");
                    String username = information[0];
                    String password = information[1];
                    System.out.println(username);
                    System.out.println(password);
                    data.put(username,password);
                    }

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

        }
    }

Когда приходит логин, вы используете data.get(username); для получения сохраненного пароля и сравниваете с тем, что дал пользователь.

person Menelaos    schedule 23.05.2013

Объявите свой массив вне оператора try/catch:

    String[] information;
    try (BufferedReader br = new BufferedReader(new FileReader("Users.csv")))
    {

        String sCurrentLine;
        String first = "Username is: ";
        String second = "Password is: ";

        while ((sCurrentLine = br.readLine()) != null) {


            information = sCurrentLine.split(",");
            String username = information[0];
            String password = information[1];
            System.out.println(username);
            System.out.println(password);
        }

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

Затем вы сможете использовать сгенерированные данные в другом месте.

person Bob Stout    schedule 23.05.2013

Если вам нужен массив с автоинкрементом, используйте ArrayList. Это специальные структуры данных, которые увеличиваются по мере добавления к ним элементов.

Я бы порекомендовал вам создать User класс POJO, потому что завтра, если в строки CSV, его можно принять, добавив еще одно поле в класс ниже

class User {

   private String userName;
   private String password;
   //getter :setters

}

и используйте ArrayList при разборе файла

List<User> userList = new ArrayList<User>();
try (BufferedReader br = new BufferedReader(new FileReader("Users.csv")))
        {

            String sCurrentLine;
            String first = "Username is: ";
            String second = "Password is: ";

            while ((sCurrentLine = br.readLine()) != null) {


                String[] information = sCurrentLine.split(",");
                String username = information[0];
                String password = information[1];

                User u = new User(); 
                u.setUserName(username);
                u.setPassword(password);
                userList.add(u);
            }

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

ТАКЖЕ: хранение пароля пользователя в CSV-файле представляет собой угрозу безопасности. Попробуйте использовать базу данных и хранить зашифрованные пароли вместо фактического пароля (при извлечении просто расшифруйте пароль и сравните)

person sanbhat    schedule 23.05.2013