黑马程序员 IO流

来源:互联网 发布:shinee 知乎 综艺 编辑:程序博客网 时间:2024/04/30 01:35

------- android培训、java培训、期待与您交流! ----------------

IO流
 四大基类
   字节流两个基类:OutputStream 和 IntputStream
   字节流两个基类:Reader 和 Writer
1.字符流
    1.1字符流的特点
IO流是用来操作数据
        数据的最常见体现形式是:文件
一个专门用来操作文件的Writer子类对象是FileWriter
A.构造方法,传递String型文件名
B.读取的方法,单个字符,字符数组 
    1.2方法
FileReader 读取字符、
1.每次读一个字符read()  返回值 int 每次读取的字符的个数
2.每次读一个字符数组read(char[] chars) 返回值 int 每次读取的字符的个数
3.每次读一行readLine() 返回值为所读的那一行的数据
注意:每次读取的时候,以\r\n 结束,当读到\r\n 的时候则表示一行读取结束
FileWriter 写字符
1.每次写一个字符write()
2.每次写一个字符数组或者字符数组的一部分  write(char[] chars,int startIndex ,int endIndex) 
chars代表了所读取的的数据
startIndex代表了将要写入的数据在数组中的起始位置
endIndex代表了将要写入的数据在数组中的结束位置

3.每次写一行write(String line) 
line代表了每次读取到的数据
注意:每次读的时候不会将\r\n 读取进来, 因此需要手动换行, 方法:newLine()

       注意:每次写入结束都需要刷新,flush()
刷新目的:将缓存的数据保存到文件中。
为了节省内存资源,每次程序结束是需要关闭资源close()
2.字节流
InputStream 读取字节
1.每次读取一个字节 read()      返回值是int型 代表每次读取字节的个数
2.每次读取一个字节数组  read(byte[] bytes) 返回值是int型 每次读取的字节的个数

OutputStream  写字节
1.每次写一个字节 write()   
2.每次写一个字节数组,或者字节数组的一部分 write(byte[] bytes,int startIndex,int endIndex)
bytes 代表每次读取的数据
startIndex 代表每次写入的数据在数组中的起始位置
endIndex   代表每次写入的数据在数组中的结束位置 
3.字节流的缓冲区对象 -- 纯字节,字节数组
 BufferedInputStream
    构造方法,传递字节输入流
  BufferedOutputStream
    构造方法,传递字节输出流
  利用缓冲区复制,不如数组缓冲速度快
  字节流复制,字符流复制
  推荐使用数组缓冲,提高效率
  字符流,读写行的时候  

import java.io.*;
public class CopyDemo2 {

public static void main(String[] args)throws IOException {
//1.创建流对象
InputStream is = null;
OutputStream os = null;
//2.数据目的
is = new FileInputStream("D:\\a.exe");
os = new FileOutputStream("E:\\a.exe");
//规定每次最多读取字节数,存入字节数组,为1024字节
byte[] bt = new byte[1024];
int len = 0;
while ((len = is.read(bt))!=-1) {
//写入
os.write(bt,0,len);
//刷新
os.flush();
}
//3.关闭数据源
is.close();
}
}
4.
转换流
使用了字符流的概念,操作了字节流,简单方便,实现了字节流的行操作

InputSreamReader     
读入字节,返回值是字符  实现字节变字符
OutputStreamWriter
将输入的字符变成字节


两个转换流,构造方法中,传递的参数都是字节流


 InputStreamReader  传递字节输入流
 OutputStrreamWriter传递的是字节输出流

 Buffered进行包装
 BufferedReader包装字节转成字符的流,InputStreamReader,读取一行

    下面请看一个实例

从键盘输入字母,将字母转换成大写输出在控制台

/*
 *    读取键盘输入,将读取到的所有内容,转成大写,打印回控制台(System.out.println)
 System.out 标准输出流  --  OutputStream

 数据源,键盘输入 System.in  InputStream
 用转换流将数据源转成字符,读取一行

 用转换流,将字符转成字节,输出到控制台
 数据目的,是控制台System.out  OutputStream
 */

import java.io.*;

public class TranseDemo2 {
public static void main(String[] args) throws IOException {
// 创建流对象,数据键盘输入
InputStream in = System.in;
// 将in转成字符流,读取一行,存入字符流的缓冲区
BufferedReader bfr = new BufferedReader(new InputStreamReader(in));


// 数据源变成字符流,将字符数据输出到自节流的控制台
// 将字符流转成字节流,
// 既然OutputStreamWriter是字符流,可以用字符输出流的缓冲区
BufferedWriter bfw = new BufferedWriter(new OutputStreamWriter(
System.out));
String line = null;
while ((line = bfr.readLine()) != null) {
if ("over".equals(line)) 
break;
bfw.write(line.toUpperCase());
bfw.newLine();
bfw.flush();
}
}
}
 

 规律:
  A. 构造方法都是字节流
   B. 都是在用字符流的缓冲区,操作字节数据
 
 如果你确定,字节流中的数据也是文本数据,推荐使用转换流操作,方便简单
 数据源,和数据集目的,可以随时发生变化

---------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ---------------------- 详细请查看:www.itheima.com

0 0
原创粉丝点击