黑马程序员技术交流社区
标题:
IO总结 part2
[打印本页]
作者:
fmi110
时间:
2015-8-9 23:45
标题:
IO总结 part2
IO
InputStream 常用方法:
int available(); 返回此输入流(关联的文件)的字节数
void close();
int read(); 读取一个字节。返回 0 到 255 范围内的 int 字节值。
读到末尾时返回 -1
int read(byte[] b);读取字节数组长度的字节数
int read(byte[] b,int offset,int len);
long skip(long n);
装饰设计模式增强后的类:
BufferedInputStream(InputStream in)
BufferedOutputStream(OutputStream out)
练习:复制一张图片
class StreamDemo
{
public static void main(String[] s) throws IOException
{
//读取流
BufferedInputStream bufin = new BufferedInputStream(new InputStream("1.jpg"));
//输出流
BufferedOutputStream bufout = new BufferedOutputStream(new OutputStream("copy.jpg"));
int by;//注意是 int 型
while((by=bufin.read())!=-1)
{
bufout.write(by);
}
bufout.close();
bufin.close();
}
}
字节流的 read() 方法读取一个字节,但是返回的并不是byte类型,而是int类型的原因:
因为read方法读到文件末尾时,返回 -1 作为结束的标志。
而数据流中很容易出现多个连续1的情况,而连续8个1,就是-1,
此时将导致读取提前结束。
所以将读到的一个字节提升为int类型,但是只保留原字节,并将高位的字节填0
具体操作: by&255 或 by&&0xff
对于write()方法,虽然返回的是一个int型,但是实际它只写入低8位的一个字节,其余的丢弃。
简单的说,read()对读到的数据进行了提升,而write对操作的数据进行转换。
转换流:
特点:
1、是字节流和字符流之间的桥梁
2、该流对象中可以对读取到的字节数据进行指定编码表的编码转换
什么时候使用?
1、字节和字符之间有转换动作时
2、流操作的数据需要进行指定编码类型的编码时
具体的类:
InputStreamReader:字节到字符的桥梁
OutputStreamWriter:字符到字节的桥梁
这两个流的对象是字符流体系的成员。
它们有转换作用,同时本身又时字符流,所以在构造的时候,需要传递字节流对象
InputStreamReader 构造函数
InputStreamReader(InputStream in)
使用默认的字符集
InputStreamReader(InputStream in, Charset cs)
创建使用给定字符集的 InputStreamReader
InputStreamReader(InputStream in, CharsetDecoder dec)
创建使用给定字符集解码器的 InputStreamReader
InputStreamReader(InputStream in, String charsetName)
创建使用指定字符集的 InputStreamReader。
String getEncoding();返回流使用的字符编码的名称
操作文本的字符流对象是转换流的子类
Reader
|--InputStreamReader
|--FileReader //构造函数中,并不能指定编码类型
Writer
|--OutputStreamWriter
|--FileWriter
转换流中的read 方法,已经融入了编码表,
在底层调用字节流的read方法时将获取一个或者多个字节数据进行临时存储,
并去对照指定的编码表,如果编码表没有指定,
则去查询默认的编码表。这样转换流的read方法就返回对应的字符。
转换流已经完成了编码转换的动作,对于直接操作文本文件的FileReader而言,就不
用在重新定义了,
只要继承该转换流,获取其方法,就可以直接操作文本文件中的字符数据了
注意:
在使用FileReader操作文本数据时,该对象使用的是默认的编码表
如果要指定编码表时,必须使用转换流。
FileReader fr = new FileReader("1.txt");//使用默认的编码表 GBK
InputStreamReader ins = new InputStreamReader(new FileInputStream("1.txt"),"GBK");
指定使用utf-8编码表
InputStreamReader ins = new InputStreamReader(new FileInputStream("1.txt"),"utf-8");
复制代码
作者:
谭威威威威
时间:
2015-8-10 00:04
作者:
fmi110
时间:
2015-8-10 09:02
自己看一下 复习
作者:
黑进制
时间:
2015-8-10 11:25
还长好长
作者:
宋亚楠
时间:
2015-8-10 11:39
棒棒哒!!!
作者:
噜啦啦噜啦啦
时间:
2015-8-10 13:00
赞一个 赞一个
作者:
keviner
时间:
2015-8-10 14:57
赞一个。总结的不错
作者:
yongaidongbing
时间:
2015-8-10 23:57
。。。。。。。。。。。。。。。。
作者:
jackchen_crg
时间:
2015-8-11 01:06
好详细,加油,不错
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2