2

私はこの問題に数時間苦労してきましたが、どのように進めるのが最善かわかりません。

コードは、シーザー暗号を使用してファイルをエンコードして読み取り、_encodedが追加された新しいファイルにディスクに書き込む必要があります。

確かにファイルを作成しますが、毎回空白になります。ドキュメントを見ると、必ずプリントライターをフラッシュして閉じるように指示されています。私はそれをしました。

また、それはおそらく私が回り道で問題に取り組んでいたためだと思いました。FileOutputstreamを使用したのではないかと思いました。

        Scanner sc=new Scanner(inFile);
        //File outFile=new File("caesar_encoded.txt");

        //FileOutputStream outFileStream=new FileOutputStream(outFile);
        PrintWriter outStream=new PrintWriter("caesar_encoded.txt");

        while(sc.hasNext())
        {
            String phrase = sc.nextLine().toUpperCase();
    for (int i = 0; i < phrase.length(); i++) {
        if (Character.isLetter(phrase.charAt(i))) {
            for (int j = 0; j < alpha.length; j++) {
                if (phrase.charAt(i) == alpha[j]) {
                    if (j == alpha.length - 1) {
                        outStream.print(alpha[0]);
                    } else {
                        outStream.print(alpha[j + 1]);
                    }
                }
            }
        } else {
            outStream.print(phrase.charAt(i));
        }
    }
    outStream.println();
        }
        outStream.flush();
        outStream.close();

        sc.close();

私はこれを試してみましたが、同じ結果になりました:

Scanner sc=new Scanner(inFile);
 File outFile=new File("caesar_encoded.txt");
 FileOutputStream outFileStream=new FileOutputStream(outFile);
 PrintWriter outStream=new PrintWriter(outFileStream);
4

2 に答える 2

7

それを飾る:

PrintWriter pw = new PrintWriter(new FileWriter("caesar_encoded.txt"), true);

またはこれ:

PrintStream ps = new PrintStream(new FileOutputStream("caesar_encoded.txt"), true);

もちろん、Writer(文字ストリーム)階層とOutputStream(バイトストリーム)階層の違いは理解できます。通常、2つを交差させることはありません。OutputStreamでからにジャンプすることはできますWriterOutputStreamWriter、その逆はできません。

このコードは私にとって完璧に実行されます。私はあなたの方法をその言葉でとらえ、SHIFTED配列について推測しました。いずれにせよ、私はencrypted.txtファイルに出力を取得します。問題はスキャナーだと思います。

package io;

import java.io.*;

/**
 * PrintWriterDemo
 * @author Michael
 * @link http://stackoverflow.com/questions/12849855/why-doesnt-printwriter-actually-write-to-the-file/12849867#comment17389040_12849867
 * @link http://en.wikipedia.org/wiki/Caesar_cipher
 * @since 10/11/12 7:17 PM
 */
public class PrintWriterDemo {

    public static void main(String[] args) {
        try {
            File unencrypted = new File((args.length > 0) ? args[0] : "resources/unencrypted.txt");
            File encrypted = new File((args.length > 1) ? args[1] : "resources/encrypted.txt");
            caesar(unencrypted, encrypted);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static final char [] SHIFTED = { 
            'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 
            'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'A', 'B', 'C' };

    public static void caesar(File unencrypted, File encrypted) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader(unencrypted));
        PrintWriter pw = new PrintWriter(encrypted);
        String line = "";
        while ((line = br.readLine()) != null) {
            String phrase =line.toUpperCase();
            for (int i = 0; i < phrase.length(); i++) {
                if (Character.isLetter(phrase.charAt(i))) {
                    for (int j = 0; j < SHIFTED.length; j++) {
                        if (phrase.charAt(i) == SHIFTED[j]) {
                            if (j == SHIFTED.length-1) {
                                pw.print(SHIFTED[0]);
                            } else {
                                pw.print(SHIFTED[j+1]);
                            }
                        }
                    }
                } else {
                    pw.print(phrase.charAt(i));
                }
            }
            pw.println();
        }
        pw.flush();
        pw.close();
        br.close();
    }
}

これが私のunencrypted.txt入力です:

This should work out fine.
I have no idea what the problem is with the original code.
But I do know that this writes just fine.

そして、これが私のencrypted.txt出力です:

UIJT TIPVME XPSL PVU GJOF.
J IBWF OP JEFB XIBU UIF QSPCMFN JT XJUI UIF PSJHJOBM DPEF.
CVU J EP LOPX UIBU UIJT XSJUFT KVTU GJOF.
于 2012-10-11T23:00:06.867 に答える
1

あなたのコードは私にとってはうまくいきました。機能に影響を与えない変更を貼り付けました。おそらくchar[] alpha、(投稿したコードではなく)正しく初期化されていないか、私が行ったように完全なファイル名を使用する必要があります。

File inFile = new File("C:\\Users\\name\\Documents\\workspace\\Testing\\src\\receiver.txt");
Scanner sc=new Scanner(inFile);//unchanged
char[] alpha =  {'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K'}; 
PrintWriter outStream=new PrintWriter("C:\\Users\\name\\Documents\\workspace\\Testing\\src\\caesar.txt");
//rest of code is identical
/*
receiver.txt (input file):
<?xml version="1.0" encoding="UTF-8"?>
<tradeevent>
   <event>
      <eventId>612</eventId>
      <relatedId>0</relatedId>
      <operationalEventIndicator></operationalEventIndicator>
      <effectiveDate>2012-08-07T11:20:47.09</effectiveDate>
      <id>612</id>
      <createdOnDate>0</createdOnDate>
   </event>
   <trade>
...
caesar.txt (created output file):
<? FJ="1.0" FDEJH="G-8"?>
<EFFF>
   <FF>
      <FFJE>612</FFJE>
      <FFEJE>0</FFEJE>
      <FJFFJEJD></FJFFJEJD>
      <FGGFDJFEF>2012-08-0711:20:47.09</FGGFDJFEF>
      <JE>612</JE>
      <DFFEEF>0</DFFEEF>
   </FF>
   <EF>
...
*/
于 2012-10-12T00:02:31.810 に答える