2

ファイルの内容をファイルにcopy(File src, File dest)コピーするだけのメソッドをテストする JUnit テストをセットアップしました。スキャナーを使用して各ファイルを同時に反復処理し(もちろん2つの異なるスキャナー)、各スキャナーを.srcdestnext().equals()

このテストは失敗し、ファイルが等しくないことがわかります。しかし、これはどうしてですか?hex dump呼び出しの直後にファイルを実行したことは言うまでもなく、文字列を印刷すると同じようにcopy()見えますが、それらも同じように見えます。ただし、各値をnext()バイト単位で出力すると、実際には異なるバイト パターンが得られます。なぜこれが起こっているのか、そしてこれを説明するためにコードにどのような変更を加えることができるのかについて混乱していますか?

私の考えでは、ファイルのエンコーディングと関係があると思います。おそらく、ファイルの作成に使用されるエンコーディング方法はcopy()、プログラムの他の場所で使用されるものとは異なりますか? 本当によくわかりませんが、どんな助けでも大歓迎です! テストユニットのために私が取り組んでいるものは次のとおりです。

// The @Rule and @Before blocks are used as set up helper methods for @Test.
    @Rule
    public TemporaryFolder tmp = new TemporaryFolder();

    private File f1, f2;

    @Before
    public void createTestData() throws IOException {
        f1 = tmp.newFile("src.txt");
        f2 = tmp.newFile("dest.txt");

        BufferedWriter out = new BufferedWriter(new FileWriter(f1));
        out.write("This should generate some " +
                "test data that will be used in " +
                "the following method.");
        out.close();
    }

    @Test
    public void copyFileTest() throws FileNotFoundException, 
    Exception {
        try {
            copyFile(f1, f2);
        } catch (IOException e) {
            e.getMessage();
            e.printStackTrace();
        }

        Scanner s1 = new Scanner(f1);
        Scanner s2 = new Scanner(f2);

        // FileReader is only used for debugging, to make sure the character
        // encoding is the same for both files.
        FileReader file1 = new FileReader(f1);
        FileReader file2 = new FileReader(f2);
        out.println("file 1 encoding: " +file1.getEncoding());
        out.println("file 2 encoding: " +file2.getEncoding());

        while (s1.hasNext() && s2.hasNext()) {
            String original = s1.next();
            String copy = s2.next();

            // These print out to be the same ...
            out.println("\ns1: " +original);
            out.println("s2: " +copy);

            // Nevertheless, this comparison fails!
            // These calls to getBytes() return different values.
            if (!(s1.equals(s2))) {
                out.println("\nComparison failed!! \ns1 in bytes: " +original.getBytes()+ 
                        "\ns2 in bytes: " +copy.getBytes());
                fail("The files are not equal.");
            }
        }
    }

そして、ここに私の出力があります:

file 1 encoding: UTF8
file 2 encoding: UTF8

s1: This
s2: This

Comparison failed!! 
s1 in bytes: [B@16f5b392
s2 in bytes: [B@5ce04204
4

1 に答える 1

4

Scannerをオーバーライドしないため、参照を比較していますが、2 つの個別のオブジェクトObject.equals()があるため、この場合は等しくありません。Scanner

于 2012-09-06T18:58:53.340 に答える