java-IO流

Java-IO流

1. 什么是IO流

IO包括输入bai和输出流,输入流指的是将数据以字符du或字节形式从外部媒介zhi比如文件、dao数据库等读取到内存中所以也分为字符输入流和字节输入流。

IO流如何分类
操作单位流动方向输入流输出流
字节流InputstreamOutputstream
字符流ReaderWriter

2.字节流

2.1.字节输入流FileInputStream

现在我们需要读取记事本文件中的数据,经过分析需要找到一个输入流来读取文件内容,所以找到了InputStream(字节输入流),但是此类是抽象类,而且读文件的方法(read)是实例方法,
所以我们向下找子类来创建对象并调用方法,InputStream有很多的子类,其中最常用的是文件流FileInputStream了,主要用来操作文件的。

2.1.1.如何读取文件内容
构造方法:

1.FileInputStream(File file) 表示从file指向的文件中读取
2. FileInputStream(String name) name表示文件的路径名(路径+文件名)

读取的方法:

1.int read() 调用一次读到一个数据字节,返回的int值就是读到的数据 如果已到达文件末尾,则返回 -1 2.int
read(byte[] b) 调用一次本方法表示可以读取多个数据 读到的内容保存传入的byte数组b中
返回的是本次调用方法读到的数据字节个数 思考? b数组是有长度,干嘛还要单独返回读到的个数呢? 3. int read(byte[]
b, int off, int len) 和上面的第二个类似,可以指定从b数组什么位置开始装


使用循环读取整个文件内容
int read = 0;//准备一个变量 : 将读取的每一个字节的数据,;零时存入到该变量
while(   (read = fis.read())   != -1     ){//用read保存的结果:跟-1比较
	System.out.println((char)read);//每次保存的结果,强转成字符
}

使用一次读取一个数组的方式
int len;//读取的字节的个数
byte[] arr = new byte[1024];//五个字节的数据,缓存在该数组的
while(   (len = fis.read(arr))  !=  -1  ){
	System.out.println(  new String(arr,0,len) );
}

2.1.2.读取中文产生乱码原因分析
总结(字节输入流读取的流程以及注意事项)
1.搞清楚是需要读文件还是写文件 —> 选择什么流
2.明确读哪个文件
3.创建一个输入流的对象(目的是为了调用其中的read方法)
4.调用读取方法获得数据
5.关闭流资源 通过流对象来调用close方法(流关闭之后是不能够在操作的-读取)

读取的文本内容:Ab中文
FileInputStream fis = new FileInputStream("cc.txt");
		int len;
		byte[] arr = new byte[1];//一次只读取一个字节:但是中文字节数不止一个
		while(   (len = fis.read(arr))  !=  -1  ){
			System.out.print(  new String(arr,0,len) );
		}
		fis.close();
        ab????

注意事项:

中文乱码的问题 ,一个中文是两个数据字节, read()
一次读到的是一个数据字节,期待后面的字符流,定义临时读取的数组的长度问题,适当大小即可,最好不要想一次读完

2.2.字节流输出流(FileOutputStream)

现在我们需要将代码中的数据保存到记事本文件中,经过分析需要找到一个输出流来把数据写入到文件中,所以找到了OutputStream(字节输出流),但是此类是抽象类,而且写文件的方法(write)是实例方法,所以我们向下找子类来创建对象并调用方法,OutputStream有很多的子类,其中最常用的算是文件流FileOutputStream了,主要用来操作文件的。

2.2.1.如何把数据写入文件中
构造方法:

FileOutputStream(File file) FileOutputStream(String name)
FileOutputStream(File file, boolean append) FileOutputStream(String
name, boolean append)

方法:

void write(int b) 调用一次写入一个数据字节 void write(byte[] b)
调用一次,可以把一个byte数组中的数据写入 void write(byte[] b, int off, int len)
调用一次,把b数组中的一部分数据写入

注意: FileOutputStream 会自动创建一个文件(如果文件不存在,并且文件的路径存在的)

1.写单个数据字节
OutputStream os = new FileOutputStream("D:/123.avi");
		os.write(65);
os.close();

2.写一个字符串
OutputStream os = new FileOutputStream("D:/123.txt",true);
os.write("66666".getBytes());
os.close();

2.3.读写乱码问题-字符编码
1.乱码怎么产生的
i.编码和解码规则不一致
ii.本身这个字符编码不支持某种语言(中文)
2.代码提现-尽可能避免乱码的产生
编码 :

String —> byte[] String中有对应的方法: byte[] getBytes() 使用平台的默认字符集将此
String 编码为 byte 序列 byte[] getBytes(Charset charset) 使用指定的字符编码来编码字符串
byte[] getBytes(String charsetName) 使用指定的字符编码来编码字符串

解码 :

byte[] —> String String中有对应的构造方法: String(byte[] bytes)
通过使用平台的默认字符集解码指定的 byte 数组 String(byte[] bytes, Charset charset)
使用指定的字符集来解码指定的byte数组 String(byte[] bytes, String charsetName)
使用指定的字符集来解码指定的byte数组

3.字符编码
什么是字符编码
例如有一个字 : 好 ----> 存储到磁盘
常见的字符编码

ASCII编码:用来表示英文,它使用1个字节表示,其中第一位规定为0,其他7位存储数据,一共可以表示128个字符。
拓展ASCII编码:用于表示更多的欧洲文字,用8个位存储数据,一共可以表示256个字符
GBK/GB2312/GB18030:简称国标,表示汉字。GB2312表示简体中文,GBK/GB18030表示繁体中文,其实就是几个不同的版本而已。
Unicode编码:包含世界上所有的字符,是一个字符集。
UTF-8:是Unicode字符的实现方式之一,它使用1-4个字符表示一个符号,根据不同的符号而变化字节长度
ISO8859-1:是单字节编码,向下兼容ASCII,不支持中文! 友情提醒 实际web开发 前台网页 后台Java程序 数据库
多个地方都会涉及到字符编码-> 一定要一致

3.字符流
3.1.为什么需要学习字符流

使用字节流来操作中文的时候非常不方便,容易产生乱码,他不管你是哪种编码方式都按照一个字符一个字符的方式读取数据

3.2.字符流-文件输入流(FileReader)
其中的构造方法和方法和字节流输入流FileInputStream非常类似,

差别就是单位是char
Reader r = new FileReader("D:/123.txt");
char[] cbuf = new char[3];
int len;
while((len = r.read(cbuf))!=-1){
	System.out.println(new String(cbuf,0,len));
}
r.close();

3.3.字符流-文件输出流(FileWriter)
特有的方法: 可以直接写字符串

void write(String str) 写入字符串。 void write(String str, int off, int
len) 写入字符串的一部分

4.字节流和字符流的区别

1.操作的单位不一样,一个是字节,一个是字符
2.操作中文的时候使用字符流更方便, 字节流更广泛:文本,视频,音频,图片…
3.字符流中有可以直接写字符串的方法
4.字节输出流 : 程序 —> 磁盘文件 如果不关闭流也会写入 字符输出流 : 程序 —> 缓冲 —> 磁盘文件 如果不关闭流或者刷新缓冲区,不会写入文件
字符输出流,关闭的时候会先刷新,关闭之后不能够在操作,刷新之后可以继续操作 什么时候会用到刷新 :
写入的数据,比较多,可以在中途手动调用刷新的方法提交数据

5.转换流
5.1.为什么需要转换流

例如实现一个方法内部的代码,但是方法的结构式写好了的,如果我们需要覆写方法内部需要处理文本,那么覆写的方法,方法参数改不了。所以可以在覆写的时候方法体将字节流参数,转换成字符流使用
public static void print(InputStream is){ }

5.2.字节流转字符流 InputStreamReader

1.InputStreamReader 拓展至 Reader;当成一个特殊的Reader使用就OK了
2.怎么转? 在创建此类的对象时候,构造方法中的数据来源是一个InputStream(字节输入流) 构造方法摘要:

InputStreamReader(InputStream in) InputStreamReader(InputStream in,
Charset cs) InputStreamReader(InputStream in, String charsetName)

第一个使用的是平台默认的字符集,后面的两个我们可以自己指定字符集
InputStream is = new FileInputStream("D:/111.txt");
InputStreamReader r = new InputStreamReader (is);
char[] cbuf = new char[10];
int len;
while((len = r.read(cbuf))!=-1){
	System.out.println(new String(cbuf,0,len));
}
r.close();

5.3.字符流转字节流 OutputStreamWriter

1.OutputStreamWriter拓展至 Writer;当成一个特殊的Writer使用就OK了
2.怎么转? 在创建此类的对象时候,构造方法中的数据输出是一个OutputStream(字节输出流)

构造方法摘要:

OutputStreamWriter(OutputStream out) OutputStreamWriter(OutputStream
out, Charset cs) OutputStreamWriter(OutputStream out, String
charsetName)

OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:/333.txt"));
osw.write("爱上快乐到家");
osw.close();

6.缓冲流
6.1.什么是缓冲流

之前循环独写数据,操作磁盘的次数非常多,影响性能,通过缓存流,可以先缓存大量读写数据,等到比较多了之后,在连接磁盘一次从磁盘读取或者写。避免多次连接磁盘影响性能,缓冲流的使用[缓冲,达到高效读写操作]有如下四种
BufferedInputStream [ 1024 * 8] BufferedOutputStream BufferedReader
BufferedWriter

6.2.缓冲流示例

1.通过测试普通流读写速度与缓冲流独写速度理解缓冲流优势
long start = System.currentTimeMillis();//毫秒值
FileInputStream fis = new FileInputStream("F:/b/aa.jpg");
BufferedInputStream bis = new BufferedInputStream(fis);//先缓冲,再读取
int len;
byte[] b = new byte[1024];
while((len = bis.read(b))!=-1){
	System.out.println(new String(b,0,len));
}
bis.close();
fis.close();
long end = System.currentTimeMillis();//毫秒值
System.out.println(end-start);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值