import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;public class TestIO {
public static void main(String[] args) {
String fileName="E://test.txt";
String otherFileName="E://target.text";
testOutputStream(fileName, otherFileName);
testInputStream(fileName);
}

public static void testInputStream(String fileName){
File file=new File(fileName);
try {
InputStream is=new FileInputStream(file);
int temp;
while((temp=is.read())!=-1){
System.out.print((char)temp);
}

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

public static void testOutputStream(String fileName,String otherFileName){
File source=new File(fileName);
File target=new File(otherFileName);
try {
InputStream is=new FileInputStream(source);
OutputStream os=new FileOutputStream(target);

int b;
while((b=is.read())!=-1){
os.write(b);
}
} catch (Exception e) {
e.printStackTrace();
}

}
}疑问:读文件操作testInputStream(fileName) 文件中包含中文字符,控制台输出为乱码.
     而testOutputStream(fileName, otherFileName);输出到另外一个文件中时,却不是乱码.
为什么 一者是输出到控制台,另者是输出到另一个文件.结果怎么 相去甚远
望点化

解决方案 »

  1.   

    read() 方法读取的是一个字节。而不是一个字符。
    假如你在文件中没有中文,只有 ASCII 字符。且如果你的文件保存格式为 GBK。那么一个  ASCII 字符,就占一个字节。所以此时 read() 方法获取的字节可以转成 char 并且不出现乱码。
    但如如果你的文件中有中文。就会出现乱码,给你个形象的例子:如果你的文件格式是 GBK ,且文件中有 “中”这个字。(文件中实质上保存的都是字节--这个应该不用多说吧,呵呵)那么。实际上“中”在文件中是以 -42, -48 这两个字节保存着。这时你使用 read() 读取时,因为一次只读一个字节。那么当它读了 -42 这个字节后会将其转成 0-255 之间的数然后将转换后的值返回(应该是 214)。你把 214强转成 char 当然会乱码。至于将读取后的 int 又通过 write(int) 方法写入另外一个文件后没有乱码也给你个过程:
    还是以“中”为例: write(int) 方法将会把一个 int 值,在转成 byte 然后将这个 byte 保存在目标文件中。也就是说 214 被转成了 -42 ,208 被转成了 -48 然后将 -42,-48 保存在目标文件中。当你使用记事本等工具将这个文件打开时。这些工具会更具文件编码又将 -42, -48 两个字节解释成为 “中”这个字符显示出来。OK?
      

  2.   

     System.out.print((char)temp);
    这个是字符,当然乱码
    os.write(b);这个就不知道了
      

  3.   

    java里面用的编码和你文件保存时用的编码不一样,假如文件用的是gbk,而java默认编码为unicode,所以直接读取不经过转换的话就错误了,而文件之间不存在这个问题