我一直在努力解决这个问题几个小时,我不确定如何最好地继续。
代码应该使用caesar密码读取编码文件,将其写入磁盘并附加_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);
答案 0 :(得分:7)
装饰它:
PrintWriter pw = new PrintWriter(new FileWriter("caesar_encoded.txt"), true);
或者这个:
PrintStream ps = new PrintStream(new FileOutputStream("caesar_encoded.txt"), true);
当然,您了解Writer
(字符流)和OutputStream
(字节流)层次结构之间的区别。你通常不会越过这两个。您可以使用OutputStream
从Writer
跳转到OutputStreamWriter
,但不能采用其他方式。
这段代码非常适合我。我接受了你的方法,猜测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();
}
}
这是我的未加密的.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.
答案 1 :(得分: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>
...
*/