今天测试了下,想复制一张图片,可为什么只能用FileInputStream与FileOutputStream复制才能成功.
而改用再在此基础上包装一层InputStreamReader与OutputStreamWriter反而就不行了.不太理解,一个一个字节读出来
为什么一次性改用一次性读出二个字节即按字符读反而不行.以前一直认为只要FileInputStream能搞定的,FileReader就能搞定,
原来我错了.还请大家帮忙解释下,小弟实在不不理解
代码如下:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class TestInputStream {
/**
* @param args
*/
public static void main(String[] args) {
File file=new File("d:\\test.jpg");
try{
FileInputStream in=new FileInputStream(file);
InputStreamReader re=new InputStreamReader(in);
FileOutputStream out=new FileOutputStream("d:\\a.jpg");
OutputStreamWriter wr=new OutputStreamWriter(out);
int i=0;
char[]ch=new char[10];
while((i=re.read(ch))!=-1){
System.out.println(ch);
wr.write(ch);
ch=new char[10];
}
re.close();
wr.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
[b]问题补充:[/b]
还是有点模糊,那假如我想读取一种文件,我在读之前并不知道它是二进制,还是字符型的,即不知道他是音频文件,图型文件,还是文件,那我应该用什么样的方法呢.
估计我是对java读取文件的时候怎样编码,怎样解码,其过程不是很清楚.所以才会对上面的理解有些模糊.还请大家详细帮我解释下上面二个问题(1,不知道文件类型怎样读取文件,2:java编码与解码的过程是什么样的)
我想读取一种文件,我在读之前并不知道它是二进制,还是字符型的
几乎任何文件都是属于二进制的文件,懂么,所以只要用读取二进制的文件流读取文件就一定不会有问题,
因为计算机本身存储文件就是以二进制的,
字符型只是在二进制之上的一层封装
因为图片文件是属于二进制格式的文件,
InputStream是字节流,一个字节的读,能正确处理二进制格式的文件
Reader是属于字符流,两个字节的读,不能正确处理二进制格式的文件
Java中提供了专用于输入输出功能的包Java.io,其中包括:
InputStream,OutputStream,Reader,Writer
InputStream 和OutputStream,两个是为字节流设计的,主要用来处理字节或二进制对象,
Reader和 Writer.两个是为字符流(一个字符占两个字节)设计的,主要用来处理字符或字符串.
字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好!如果是音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点
所有文件的储存是都是字节(byte)的储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘。在读取文件(特别是文本文件)时,也是一个字节一个字节地读取以形成字节序列
字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串; 2. 字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以
字节流是最基本的,所有的InputStrem和OutputStream的子类都是,主要用在处理二进制数据,它是按字节来处理的但实际中很多的数据是文本,又提出了字符流的概念,它是按虚拟机的encode来处理,也就是要进行字符集的转化 这两个之间通过 InputStreamReader,OutputStreamWriter来关联,实际上是通过byte[]和String来关联在实际开发中出现的汉字问题实际上都是在字符流和字节流之间转化不统一而造成的
==================我们还可以看到:============
Reader类的read()方法返回类型为int :作为整数读取的字符(占两个字节共16位),范围在 0 到 65535 之间 (0x00-0xffff),如果已到达流的末尾,则返回 -1
inputStream的read()虽然也返回int,但由于此类是面向字节流的,一个字节占8个位,所以返回 0 到 255 范围内的 int 字节值。如果因为已经到达流末尾而没有可用的字节,则返回值 -1。因此对于不能用0-255来表示的值就得用字符流来读取!比如说汉字...至此,有些人可能就会产生一个问题:既然返回结果只能在0-255之间的值,那何返回byte型的呢? 这个问题提得很好,我先顶你一下~~~也就是说一个int占4个字节,而返回结果只是在0-255(2的8次方-1)之间,只占1个字节,这就说明返回结果只占掉int的低8位!其实是这样的:
read()有个约定,就是达到流的结尾时返回-1 ,而byte型的范围是0-255(没有负数)。因此-1会被表示成255!这样,如果返回类型是byte,那么255究竟是代表 结束 还是代表 读到的byte值 呢? 显然无法区分!