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

9

这是一个简单的方法:

File words = new File(path);
Scanner s = new Scanner(words,"utf-8");
于 2016-05-03T04:06:17.160 回答
0

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

首先,两个字节被读取并用于构造一个无符号的 16 位整数,完全按照方法的readUnsignedShort方式。这个整数值称为UTF 长度,并指定要读取的附加字节数。然后通过分组考虑将这些字节转换为字符。每个组的长度是根据组的第一个字节的值计算的。组后面的字节(如果有的话)是下一组的第一个字节。

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

话虽如此,我看不出有任何理由在这里使用DataOutput/ DataInput。您只能使用FileReaderandFileWriter代替。这些将使用默认的系统编码。

于 2012-08-15T03:35:09.010 回答
0

来自FileReaderJavadoc:

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

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

于 2012-08-15T03:07:53.017 回答