---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! -------------------------
一.字节流
OutputStream和 InputStream
二.FileOutputStream 和 FileInputStream
类 FileInputStream
常用构造方法摘要
FileInputStream(File file)
通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定。
FileInputStream(String name)
通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定。
常用方法摘要
int available( ) :获取文件大小
void close( ) :关闭流资源
int read( ) 从此输入流中读取一个数据字节。结束int为-1;
int read(byte[] b)
从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。结束int为-1;
int read(byte[] b, int off, int len)
从此输入流中将最多 len 个字节的数据读入一个 byte 数组中。
类 FileOutputStream
常用构造方法摘要
FileOutputStream(File file)
创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
FileOutputStream(String name)
创建一个向具有指定名称的文件中写入数据的输出文件流。
常用方法摘要
void close() 关闭此文件输出流并释放与此流有关的所有系统资源。
void write(byte[] b)
将 b.length 个字节从指定 byte 数组写入此文件输出流中。
void write(byte[]b, int off, int len)
将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流。
void write(int b)
将指定字节写入此文件输出流。
代码示例:
编写一个复制图片的程序
思路:
1.用字符读取流对象和图片关联
2.用字节写入流对象创建一个图片文件,用于存储获取到的图片的数据
3.通过循环续写,完成数据的存储
4.关闭资源
public static void copyPic_2() {
FileInputStreamfis = null;
FileOutputStreamfos = null;
byte[] buf = new byte[1024];//定义一个缓冲区
intnum = 0;
try{
fis = newFileInputStream("E:\\caoyun.jpg");//定义输入流
fos= new FileOutputStream("E:\\Copy_caoyun.jpg");//定义输出流
while ((num = fis.read(buf))!=-1){//读出文件
fos.write(buf,0,num);//写入文件
}
}
catch(IOException e){
thrownew RuntimeException("复制文件失败!");
}
finally{
try{
if(fis!= null)
fis.close();
}catch(IOException e){
throw new RuntimeException("复制文件失败!");
}
try{
if(fos!= null)
fos.close();
}catch(IOException e){
thrownew RuntimeException("复制文件失败!");
}
}
}
三、字节流的缓冲区
BufferedInputStream
在创建 BufferedInputStream
时,会创建一个内部缓冲区数组
常用构造方法摘要
BufferedInputStream(InputStream in)
创建一个 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。
BufferedOutputStream
常用构造方法摘要
BufferedOutputStream(OutputStream out) 创建一个新的缓冲输出流,以将数据写入指定的底层输出流
【字节流缓冲区的原理】
例如BufferesOutputStream这个缓冲区,其内部封装了一个数组,而数据是通过传入的OutputStream的子类对象的read方法一个一个读取,并将数据保存在这个数组中的,而缓冲区的read方法,则将这个数组中数据一个一个的读入,就类似与一个杯子先接好一杯水,在传递给人,人再一次性的喝掉。
在返回数据的时候要要注意与上255,保留给数据的有效八位。当数据数据读取完了之后就直接返回-1
四.转换流
InputStreamReader和 OutputStreamWriter
是字节流通向字符流的桥梁
通过键盘录入一行数据并打印其大写,发现其实就是读一行数据的原理,也就是readLine方法。能不能直接使用readLine方法来完成键盘录入的一行数据的读取呢?
readLine方法是字符流BufferedReader类中方法,而键盘录入的read的方法是字节流InputStream的方法。那么能不能将字节流?
代码示例:
public static void show_1()throws IOException{
//获取键盘录入对象
//InputStreamin = System.in;
//字节流转化为字节流
//InputStreamReaderisr = new InputStreamReader(in);
//为了提高效率,将字符串进行缓冲区技术高效操作
//BufferedReaderbufr = new BufferedReader(isr);
//【键盘录入最常见写法】
BufferedReader bufr =
new BufferedReader(newInputStreamReader(System.in));
//【读取字节流转换为字符流】
BufferedWriterbufw =
new BufferedWriter(newOutputStreamWriter(System.out));
//【输出字节流转换为字符流】
String line = null;
while((line= bufr.readLine())!=null)
{
if("over".equalsIgnoreCase(line))
break;
bufw.write(line.toUpperCase());
bufw.newLine();
bufw.flush();
}
bufr.close();
bufw.close();
}
五.流操作规律
(1)源和目的的明确
1.需求:将键盘输入的信息,显示在控制台上
源:键盘录入
目的:控制台
2.需求:想把键盘录入的数据存储在一个文件中
源:键盘
目的:一个文件
3.需求:想要将一个文件的数据打印在控制台上
源:文件
目的:控制台
(2)流操作的基本规律:通过三个明确来完成
1.明确源和目的
源:输入流:InputStream Reader
目的:输出流:OutputStream Writer
2.操作的数据是否是纯文本
是:字符流
否:字节流
3.当体系明确后,在明确使用那个具体的对象
通过设备来进行区分
源设备:内存,硬盘,键盘(System.in)
目的设备:内存,硬盘,控制台(System.out)
扩展一下,可以把录入的数据按照指定的编码表,存在硬盘上。
记住,转换流什么时候使用,字符和字节之间的桥梁,通常,涉及到字符编码转换时,需用到转换流
示例:
需求:要将键盘录入的信息在控制台上显示。
1.明确源和目的:
源:键盘; 目的:控制台
2.使用操作文本,但是,源和目的的流对象已经确定一个是System.in,一个是System.out
他们都是字节流对象。所以,就需要转换流,将其转换为字符流
3.是不是要提高效率,简化书写,要!则需要使用缓冲区技术
可得:
BufferedReader bufr = newBufferedReader(InputStreamReader(System.in));
BufferedWriter bufw = newBufferedWriter(OutputStreamWriter(System.out));
六.改变标准输入输出设备
System.setIn( InputStream in );
System.setOut( PrintStream out );
------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------详细请查看:www.itheima.com