Программа CaesarCipher, которая выводит текстовый файл в Java

Я знаю, что это старый пост, но я провел некоторое время в Интернете и на моем сервере, чтобы найти ответ.

Если вы создали файл .htaccess с постоянным перенаправлением, сервер скопирует это перенаправление в следующем файле: "/var/.htaccess".

Вы должны отредактировать этот файл, чтобы удалить перенаправление перед очисткой кеша вашего браузера.

Он работал на моем Debian Jessie.

1
задан Fady E 18 March 2019 в 01:29
поделиться

2 ответа

Чтобы полностью ответить на ваш вопрос:

  1. Вы на самом деле неправильно используете сканер. Вот очень хороший ответ, который показывает несколько способов , как преобразовать InputStream в String . Единственное, что вам нужно знать, - это как получить InputStream для файла (проверьте код ниже). Как примечание, вы всегда должны помнить, чтобы закрыть свои ресурсы. Поэтому закройте ваш FileInputStream, если он больше не используется ( подробнее здесь ).
    File file = new File("your/file/path/file.ending");
    try (FileInputStream fis = new FileInputStream(file)) {
        // your code here
    } catch (FileNotFoundException e){
        e.printStackTrace();
    }

  1. Существует также несколько возможностей для создания и записи содержимого в файл. Посмотрите: Как сохранить строку в текстовом файле с помощью Java?

И чтобы подвести итог, я создал рабочий пример, использующий немного другой способ реализации шифрования цезаря и использующий Files.lines (... ) для чтения содержимого файлов и Files.write (...) для записи зашифрованного содержимого в новый файл:

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.Scanner;
import java.util.stream.Stream;

public class CaesarCipher {

    public static void main(String[] args) throws IOException {
        Scanner scanner = new Scanner(System.in);

        System.out.print("What is the input file name? ");
        Path filePath = Paths.get(scanner.nextLine());

        System.out.print("What is the output file name? ");
        Path encodedFilePath = Paths.get(scanner.nextLine());

        System.out.print("Caesar cipher offset? ");
        final int offset = Integer.parseInt(scanner.nextLine());

        // Retrieve a a stream of the input file, where each line is mapped using the encrypt function
        Stream<String> mappedFileStream = Files.lines(filePath).map(msg -> CaesarCipher.encrypt(msg, offset));

        // Write encrypted content to a new file using our mapped stream as an iterable
        Files.write(
                encodedFilePath,
                (Iterable<String>) mappedFileStream::iterator,
                StandardCharsets.UTF_8,
                StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);

        // Decrypt the encoded file content and print it
        Files.lines(encodedFilePath)
                .map((fileLine) -> CaesarCipher.decrypt(fileLine, offset))
                .forEach(System.out::println);
    }

    public static String encrypt(String msg, int offset) {
        offset = offset % 26 + 26;
        StringBuilder encoded = new StringBuilder(msg.length());
        for (char i : msg.toCharArray()) {
            if (Character.isLetter(i)) {
                char base = Character.isUpperCase(i) ? 'A' : 'a';
                encoded.append((char) (base + (i - base + offset) % 26));
            } else {
                encoded.append(i);
            }
        }
        return encoded.toString();
    }

    public static String decrypt(String enc, int offset) {
        return encrypt(enc, 26 - offset);
    }
}
0
ответ дан FlorianDe 18 March 2019 в 01:29
поделиться

Ваш существующий код не фактически читает входной файл в String. Вы можете сделать это с помощью ряда методов, одним из которых является Files.readAllLines(Path) , который возвращает List<String> строк файла. Поток это, и собрать его с разделителями строк. Например,

String inputFileString = Files.readAllLines(new File(fileName).toPath()).stream()
            .collect(Collectors.joining(System.lineSeparator()));

Что касается записи в файл, взгляните на конструктор PrintStream(File) .

0
ответ дан Elliott Frisch 18 March 2019 в 01:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: