2
public boolean isValid(String username, String password)  {
        boolean valid = false;
        DataInputStream file = null;

        try{
            Scanner files = new Scanner(new BufferedReader(new FileReader("files/students.txt")));

            while(files.hasNext()){
                System.out.println(files.next());
            }

        }catch(Exception e){
            e.printStackTrace();
        }
        return valid;
    }

UTF-8 (別の Java プログラムによって) で記述されたファイルを読んでいるときに、奇妙な記号の後に文字列名が表示されるのはなぜですか?

I wrote it using this

    private static void  addAccount(String username,String password){
        File file = new File(file_name);
        try{
            DataOutputStream dos = new DataOutputStream(new FileOutputStream(file,true));
            dos.writeUTF((username+"::"+password+"\n"));
        }catch(Exception e){

        }
    } 
4

3 に答える 3

0

DataOutput.writeUTF/を使用する場合DataInput.readUTF、最初の 2 バイトは、文字列のサイズを示す符号なし 16 ビット ビッグ エンディアン整数を形成します。

最初に、2 バイトが読み取られ、メソッド とまったく同じ方法で符号なし 16 ビット整数を構築するために使用されますreadUnsignedShort。この整数値はUTF 長と呼ばれ、読み取る追加のバイト数を指定します。これらのバイトは、グループで考慮して文字に変換されます。各グループの長さは、グループの最初のバイトの値から計算されます。グループに続くバイトがある場合は、次のグループの最初のバイトです。

これらが問題の原因である可能性があります。最初の 2 バイトをスキップしてから、ScannerUTF-8 を使用して正しく読み取るように指定する必要があります。

DataOutputそうは言っても、ここで/を使用する理由は見当たりませんDataInputFileReader代わりにandを使用できますFileWriter。これらは、デフォルトのシステム エンコーディングを使用します。

于 2012-08-15T03:35:09.010 に答える
0

FileReaderJavadocから:

文字ファイルを読み取るための便利なクラス。このクラスのコンストラクターは、既定の文字エンコーディングと既定のバイト バッファー サイズが適切であることを前提としています。これらの値を自分で指定するには、FileInputStream で InputStreamReader を作成します。

だから、おそらく次のようなものnew InputStreamReader(new FileInputStream(file), "UTF-8"))

于 2012-08-15T03:07:53.017 に答える