请帮我解决这个问题。
A有一个输入文件'Trial.txt',内容为“Thanh Le”。
以下是我尝试从文件中读取时使用的函数:
public char[] importSeq(){
File file = new File("G:\\trial.txt");
char temp_seq[] = new char[100];
try{
FileInputStream fis = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(fis);
DataInputStream dis = new DataInputStream(bis);
int i = 0;
//Try to read all character till the end of file
while(dis.available() != 0){
temp_seq[i]=dis.readChar();
i++;
}
System.out.println(" imported");
} catch (FileNotFoundException e){
e.printStackTrace();
} catch (IOException e){
e.printStackTrace();
}
return temp_seq;
}
主要功能:
public static void main(String[] args) {
Sequence s1 = new Sequence();
char result[];
result = s1.importSeq();
int i = 0;
while(result[i] != 0){
System.out.println(result[i]);
i++;
}
}
这是输出。
运行:
imported
瑨
慮
栠
汥
BUILD SUCCESSFUL (total time: 0 seconds)
答案 0 :(得分:3)
因为在Java中,char是由2个字节组成的,因此,当您使用readChar
时,它将读取字母对并将它们组合成unicode字符。
您可以使用readByte(..)
代替..
答案 1 :(得分:3)
老实说,这是一种将文本文件读入char[]
的非常笨拙的方法。
这是一个更好的例子,假设文本文件只包含ASCII字符。
File file = new File("G:/trial.txt");
char[] content = new char[(int) file.length()];
Reader reader = null;
try {
reader = new FileReader(file);
reader.read(content);
} finally {
if (reader != null) try { reader.close(); } catch (IOException ignore) {}
}
return content;
然后打印char[]
,只需执行:
System.out.println(content);
请注意,InputStream#available()
并不一定符合您的预期。
答案 2 :(得分:1)
一些代码用于演示,究竟发生了什么。 Java中的char
由两个字节组成,表示一个字符,即您在屏幕上看到的字形(像素)。 Java中的默认编码是UTF-16,这是使用两个字节来表示所有字形之一的一种特殊方式。您的文件有一个字节来表示一个字符,可能是ASCII。当您读取一个UTF-16字符时,读取两个字节,从而读取文件中的两个ASCII字符。
以下代码尝试解释单个ASCII字节't'和'h'如何成为一个中文UTF-16字符。
public class Main {
public static void main(String[] args) {
System.out.println((int)'t'); // 116 == x74 (116 is 74 in Hex)
System.out.println((int)'h'); // 104 == x68
System.out.println((int)'瑨'); // 29800 == x7468
// System.out.println('\u0074'); // t
// System.out.println('\u0068'); // h
// System.out.println('\u7468'); // 瑨
char th = (('t' << 8) + 'h'); //x74 x68
System.out.println(th); //瑨 == 29800 == '\u7468'
}
}