簡體   English   中英

在Java中將一行文本從文本文件轉換為密文

[英]making a line of text from a text file into a cipher text in java

我有一行文本需要解密為密文。

假設我的文字是abc def ghijklm n opq rstu vwx yz

我想要這樣的輸出: aei qu ck rvzdhmptxbfjn y glosm

可以說我輸入的“鍵”為5。然后代碼將輸入文本文件中文本字符串數組的第5個元素。

這是我想出的代碼,我碰壁了。

import java.io.*;
import java.util.*;

public class Files1 {


public static void main(String[] args) {
    // TODO Auto-generated method stub
    Scanner input = new Scanner(System.in);
    int key;

    System.out.print("Enter file: ");
    String fileName = input.nextLine();
    System.out.print("Please enter your Cipher Key: ");
    key = input.nextInt();

    Scanner inputStream = null;
    System.out.println("File name is: " + fileName);

    try {
        inputStream = new Scanner(new File(fileName));
    } catch (FileNotFoundException e) {
        System.out.println("Error opening the file" + fileName);
        System.exit(0);
    }

    while (inputStream.hasNextLine()) {
        String text = inputStream.nextLine();
        System.out.println(text);

        char arrayText[] = text.toCharArray();
        for (int i = 0; i < arrayText.length; i += key) {
            System.out.print("\n" + arrayText[i]);
        }

    }
}

}

這是控制台中發生的事情:

Enter file: abc.txt

File name is: abc.txt
abc def ghijklm n opq rstu vwx yz

a

e

i



q

u

您需要的是一份循環清單。

這是使用數組的循環列表的非常簡單粗略的實現。

import java.util.Iterator;
import java.util.List;

public class CircularList implements Iterator<String> {

    private String[] list;

    private int pointerIndex;

    private int key;

    public CircularList(String[] list, int key) {
        this.list = list;
        pointerIndex = 1 - key;
        this.key = key;
    }

    @Override
    public boolean hasNext() {
        if(list.length == 0){
            return false;
        }
        return true;
    }

    @Override
    public String next() {
        if(pointerIndex + key > list.length) {
            int diff = (list.length-1) - pointerIndex;
            pointerIndex = key - diff;
            return  list[pointerIndex];
        }else {
            pointerIndex = pointerIndex + key;
            return list[pointerIndex];
        }
    }

    @Override
    public void remove() {
        //Do Nothing
    }

}

有了可以循環循環訪問的列表后,您可以將現有實現更改為此-

import java.io.*;
import java.util.*;

public class Files1 {

    public static void main(String[] args) {

        System.out.print("Enter file: ");
        Scanner input = new Scanner(System.in);
        String fileName = input.nextLine();
        Scanner inputStream = null;
        System.out.println("" + fileName);

        try {
            inputStream = new Scanner(new File(fileName));
        } catch (FileNotFoundException e) {
            System.out.println("Error opening the file: " + fileName);
            System.exit(0);
        }

        while (inputStream.hasNextLine()) {
            String text = inputStream.nextLine();
            System.out.println(text);

            String[] splits = text.split("");
            CircularList clist = new CircularList(splits, 5);

            for (int i = 0; i < splits.length -1; i += 1) {
                System.out.print("" + clist.next());
            }

        }
    }

}

輸出-

Enter file: resources\abc.txt
resources\abc.txt
abc def ghijklm n opq rstu vwx yz
aei qu c k rvzdhmptxbfjn  y glosw

密碼中的最后一個字符應該是“ w”而不是“ m”。

您沒有指定空間應該發生什么,也沒有指定需要環繞時發生的情況,但是假設空間很大並且環繞自然發生:

for (int i = 0; i < text.length(); i++)
{
    System.out.print(text.charAt((i*5) % text.length()));
}

打印aei qu ck rvzdhmptxbfjn y glosw ,這強烈表明預期輸出中有錯誤。

導入java.io。 ; 導入java.util。 ;

公共類Files1 {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    Scanner input = new Scanner(System.in);
    int key;

    System.out.print("Enter file: ");
    String fileName = input.nextLine();
    System.out.print("Please enter your Cipher Key: ");
    key = input.nextInt();

    Scanner inputStream = null;
    System.out.println("File name is: " + fileName);

    try {
        inputStream = new Scanner(new File(fileName));
    } catch (FileNotFoundException e) {
        System.out.println("Error opening the file" + fileName);
        System.exit(0);
    }

    while (inputStream.hasNextLine()) {
        String text = inputStream.nextLine();
        System.out.println(text);
        for (int i = 0; i < text.length(); i++) {
            System.out.print(text.charAt((i * key) % text.length()));
        }

    }
}

}

非常感謝EJP和Pai!

我學到了很多!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM