今天讲解的是字节流InputStream和OutputStream的操作,还有转换流InputStreamReader和OutputStreamWriter。和它们之间的关系。还有讲解了标准输入流System.in 。
一、 字节流:主要对于图片,声音,视频等文件的操作。字节可以操作任何数据。
a) FileInputStream 构造方法接受文件名。与前面讲解相同 。特有的方法 abavilable()获取关联的文件的字节数 使用Byte字节的来操作。这有一个弊端,就是文件过大,大小超出jvm的内容空间时,会内存溢出。
完成图片的复制操作
BufferedInputStreambufis = new BufferedInputStream(new FileInputStream("1.jpg"));//有缓冲区,实例化以个图片
BufferedOutputStreambufos = new BufferedOutputStream(new FileOutputStream("2.jpg"));
int by = 0;
while((by=bufis.read())!=-1){ 读取字节
bufos.write(by); 将字节写入第二个文件里
}
B)FileOutputStream与输入流差不多,同理。
二、标准输入流 System.in
标准的输入,对象是键盘。它与FileInputStream的对象差不多。可以用缓冲区接受。也可以读取。但是读取的是字节。需要用到转换流来转换才能读取到。
二、 转换流的操作。字节流----字符流相互转换的中间类
a) OutputStreamWriter:是Writer的子类,将输出的字符流变为字节流,即:将一个字符流的输出对象变为字节流的输出对象。字符到字节的桥梁
b) InputStreamReader:是Reader的子类,将输入的字节流变为字符流,即:将一个字节流的输入对象变为字符流的输入对象。字节到字符的桥梁
c) 它们的构造方法参数为两个,是与FileWriter的不用:如OutputStreamWriter(OutputStream out,String charseName);后一个参数为编码方式
FileWriter与FileReader对象使用的是默认的编码表。如果要使用指定编码表时,必须使用转换流。
public static void main(String[] args) throwsIOException {
//TODO Auto-generated method stub
OutputStreamWriterosw=new OutputStreamWriter(newFileOutputStream("demo.txt"),"utf-8"); //输出转换流实例化对象以字节输入流对象为参数。编码方式为UTF-8
osw.write("你好,世界!"); /写入
osw.flush(); //刷新
osw.close(); //关闭
InputStreamReaderisr=new InputStreamReader(newFileInputStream("demo.txt"),"utf-8");// 读取转换流对象 编码方式如果不同则会出现乱码
intch=0;
while((ch=isr.read())!=-1){ //读取
System.out.print((char)ch);
}
System.out.println();
char[]arr=new char[1024];
intlen=isr.read(arr);
System.out.println(newString(arr,0,len)); //输出读取到的数据(已转换为字符)