чтение текста (пользователь: проход) из текстового файла символ за символом - PullRequest
3 голосов
/ 11 марта 2019

Я пытаюсь прочитать имя пользователя и пароль из файла .txt на Java. Формат файла следующий:

user1:pass1
user2:pass2
user3:pass3

Мой код не может правильно читать пароли, какие-либо подсказки? РЕДАКТИРОВАТЬ: также отсутствует последний пароль, потому что отсутствует последний \n, есть ли способ восстановить его, вместо добавления дополнительной новой строки в текстовый файл?

try {
    FileReader fileReader = new FileReader(filename);
    BufferedReader bufferedReader = new BufferedReader(fileReader);

    int c;
    String user = "";
    String pass = "";
    char helper = 0;

    while(( c = bufferedReader.read()) != -1 ) {
        System.out.println((char)c);
        if((char)c == '\n') {
            ftpServer.addUser(user, pass);
            //System.out.printf("%s", pass);
            user = "";
            pass = "";
            helper = 0;
        } else {
            if ((char) c == ':') {
                helper = ':';
            }
            if (helper == 0) {
                user += (char) c;
            }
            if (helper == ':') {
                if ((char) c != ':')
                    pass += (char) c;
            }
        }
    }
    bufferedReader.close();
}

Ответы [ 4 ]

3 голосов
/ 12 марта 2019

Если вы используете JAVA: 8 и 8+, вы можете использовать поток для файлов - java.nio.files

Path path = Paths.get(filename);
    try (Stream<String> lines = Files.lines(path)) {
        lines.forEach(s -> {
            if (s.contains(":")) {
                String[] line = s.split(":");
                String userName = line[0];
                String pass = line[1];
                System.out.println("User name: " + userName + " password: " + pass);
            }
        });
    } catch (IOException ex) {
        // do something or re-throw...
    }

Или используйте BufferedReader

BufferedReader reader;
    try {
        reader = new BufferedReader(new FileReader("/Users/kants/test.txt"));
        String lineInFile = reader.readLine();
        while (lineInFile != null) {
            if (lineInFile.contains(":")) {
                String[] line = lineInFile.split(":");
                String userName = line[0];
                String pass = line[1];
                System.out.println("User name: " + userName + " password: " + pass);
            }
            lineInFile = reader.readLine();
        }
        reader.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

ПРИМЕЧАНИЕ: Вы должны добавить дополнительные null проверки и try-catch обработки.Выше код просто показать вам логику.

1 голос
/ 12 марта 2019

Не думаю, что вам нужен дополнительный цикл

public static void main(String[] args) throws IOException {
        BufferedReader reader;
        try {
            reader = new BufferedReader(new FileReader(
                    "path/to/file"));
            String line = reader.readLine();
            while (line != null) {
                System.out.println(line);
                // read next line
                line = reader.readLine();
                if (line.contains(":")) {
                    String user = line.split(":")[0];
                    String pass = line.split(":")[1];
                    System.out.println("User is " + user + "Password is " + pass);
                }            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

печать

user1:pass1
User is user2Password is pass2
user2:pass2
User is user3Password is pass3
user3:pass3
0 голосов
/ 12 марта 2019

Пожалуйста, измените ваш код следующим образом:

Используйте метод split, чтобы упростить вашу работу:)

public class Example {

    public static void main(String[] args) {
        BufferedReader reader;
        try {
            reader = new BufferedReader(new FileReader("F://test.txt"));
            String line = reader.readLine();
            while (line != null) {
                String[] lineParts = line.split(":");
                System.out.println("user : " + lineParts[0]);
                System.out.println("password : " + lineParts[1]);
                line = reader.readLine();
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

В test.txt:

user1:pass1
user2:pass2
user3:pass3

Вывод:

user : user1
password : pass1
user : user2
password : pass2
user : user3
password : pass3
0 голосов
/ 12 марта 2019

Вот сложная реализация -

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Stream;

public class ReadFileAsStream {

    public static void main(String... arguments) {
        CredentialsParser parser;
        try {
            parser = new CredentialsParser("c:/temp/credtest.txt");
            Credential[] credentials = parser.getCredentials();
            for (Credential credential : credentials) {
                System.out.println(String.format("%s : %s", credential.getUsername(), credential.getPassword()));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

//Parser for the credentials file format
class CredentialsParser {
    private Set<Credential> credentials = new HashSet<>();
    String filename = null;

    public CredentialsParser() {
        super();
    }

    public CredentialsParser(String filename) throws IOException {
        super();
        setFilename(filename);

        if (getFilename() != null) {
            parseCredentialsFile();
        }
    }

    public Credential[] getCredentials() {
        return credentials.toArray(new Credential[credentials.size()]);
    }

    // method to add credentials
    public void addCredential(String entry) {
        if (entry.indexOf(':') > -1) {
            String[] values = entry.split(":");
            credentials.add(new Credential(values[0], values[1]));
        }
    }

    public String getFilename() {
        return filename;
    }

    public void setFilename(String filename) {
        this.filename = filename;
    }

    protected void parseCredentialsFile() throws IOException {
        // read file into stream, try-with-resources
        try (Stream<String> stream = Files.lines(Paths.get(filename))) {
            stream.forEach(this::addCredential);
        }
    }
}

// Value holder for each credential entry
class Credential {
    private String username = null;
    private String password = null;

    public Credential() {
        super();
    }

    public Credential(String username, String password) {
        super();
        this.username = username;
        this.password = password;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...