【问题标题】:Encode txt file with caesar cipher java用凯撒密码java编码txt文件
【发布时间】:2018-06-04 20:05:22
【问题描述】:

您好,我正在尝试使用凯撒密码在 java 中编码一个 txt 文件。我自己决定转移,我已经编写了下面的代码,但我得到了:

java.util.NoSuchElementException: No line found
    at java.util.Scanner.nextLine(Scanner.java:1540)

有人可以帮我解决吗?谢谢!

public class zevenedesim {
    public static void main(String[] args) throws FileNotFoundException {
        Scanner input = new Scanner(new File("words.txt"));
        PrintStream output = new PrintStream(new File("words.txt"));
        String teksti = input.nextLine();
        zevenedesim(teksti, output);
    }

    public static void zevenedesim(String text, PrintStream output) {
        int i = 0;
        String s;
        Scanner data = new Scanner(text);
        if (data.hasNext()) {
            s = data.next();
            if (s.charAt(i) >= 97 && s.charAt(i) <= 120) {
                int x = s.charAt(i) - 97;
                x = (x + 2) % 26;
                if (x < 0)
                    x += 26;
                // = (char) (x + 32);
            }
            output.print(" " + data.next());
        }
    }
}

【问题讨论】:

  • 你的文件是空的。
  • 你正在读写同一个文件。
  • 我修复了它,但是如果我写“Hello Java”,输出将是“Java”

标签: java


【解决方案1】:

您在您获取输入的同一文件上创建您的输出PrintWriter。在现有文件上初始化PrintWriter 将删除其内容,如the documentation 所述:

如果文件存在,那么它将被截断为零大小。

输入输出使用不同的文件,应该没问题:

Scanner input = new Scanner(new File("words.txt"));
PrintStream output = new PrintStream(new File("encoded_words.txt"));

【讨论】:

  • 是的,我试过了,但是如果我写“Hello Java”,输出会是“Java”
  • @Malvina 这是一个不同的问题 - 你在循环的每次迭代中调用 next() 两次,并且不对你编码的字符做任何事情......
【解决方案2】:

问题有两个方面。首先,您打开同一个文件以同时读取和写入。当您打开一个文件进行写入时,该文件会被清除,因此当您开始读取时,Scanner 会抛出一个NoSuchElementException,因为那里什么都没有。要解决这个问题,请将您的输出保存到不同的文件中。

其次,你的读/写逻辑都是错误的。您使用data.next() 读取一个单词,通过凯撒密码运行每个字符,但不要将结果存储在任何地方,然后使用output.print(" " + data.next()); 读取另一个单词并将第二个单词完全未编码地写入输出,完全丢弃第一个单词。这就是为什么您正在阅读“Hello Java”并只写“Java”而没有编码。我没有尝试解决这个问题,而是逐行重写了整个内容,而不是逐字逐句。

这是我将如何实现程序,修复了两个错误。

import java.io.IOException;
import java.io.PrintStream;
import java.util.Scanner;

public class zevenedesim {
    public static void main(String[] args) throws IOException {
        int shift = 2;
        try (Scanner input = new Scanner(new File("words.txt")); 
                PrintStream output = new PrintStream(new File("encoded_words.txt"))) {
            while (input.hasNextLine()) {
                output.println(caesar(input.nextLine(), shift));
            }
        }
    }

    public static String caesar(String text, int shift) {
        shift %= 26;
        if (shift == 0) return text;
        StringBuilder sb = new StringBuilder(text.length());
        for (int i = 0; i < text.length(); i++) {
            int c = text.charAt(i);

            if (c >= 'A' && c <= 'Z') {
                c += shift;
                if (c > 'Z') c -= 26;
            } else if (c >= 'a' && c <= 'z') {
                c += shift;
                if (c > 'z') c -= 26;
            }

            sb.append((char) c);
        }
        return sb.toString();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    • 2014-02-06
    • 1970-01-01
    相关资源
    最近更新 更多