使用Scanner读取UTF-8字符

时间:2012-08-15 02:59:09

标签: java utf-8 io

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){

        }
    } 

3 个答案:

答案 0 :(得分:7)

这是一种简单的方法:

map[string]interface{}

答案 1 :(得分:0)

来自FileReader Javadoc:

  

读取字符文件的便捷类。此类的构造函数假定默认字符编码和默认字节缓冲区大小是适当的。要自己指定这些值,请在FileInputStream上构造一个InputStreamReader。

所以也许像new InputStreamReader(new FileInputStream(file), "UTF-8"))

答案 2 :(得分:0)

使用DataOutput.writeUTF / DataInput.readUTF时,前2个字节构成一个无符号的16位大端整数,表示字符串的大小。

  

首先,读取两个字节并用于构造无符号的16位整数,其方式与readUnsignedShort方法完全相同。此整数值称为 UTF长度,并指定要读取的其他字节数。然后通过将它们分组考虑将这些字节转换为字符。每个组的长度是从组的第一个字节的值计算的。组后面的字节(如果有)是下一组的第一个字节。

这些可能是导致您的问题的原因。您需要跳过前2个字节然后指定Scanner使用UTF-8才能正确读取。

话虽如此,我认为没有理由在这里使用DataOutput / DataInput。您只能使用FileReaderFileWriter代替。这些将使用默认的系统编码。