Чтобы полностью ответить на ваш вопрос:
- Вы на самом деле неправильно используете сканер. Вот очень хороший ответ, который показывает несколько способов , как преобразовать 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();
}
- Существует также несколько возможностей для создания и записи содержимого в файл. Взгляните на: Как сохранить строку в текстовом файле с помощью 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);
}
}