IO详解
IO流简单来说就是Input和Output流 ,IO流主要是处理设备之间的数据传输,java对于数据的操作都是通过流来实现的,而java对于操作流的对象都是在IO包中
按照操作数据划分:
字节流和字符流 InputStream和Reader OutputStream和Writer
按流划分:
输入流和输出流 InputStream和OutputStream Writer和Reader
一 字符流:
字符流只是用来处理文本数据的,数据最常见的表现形式是文件,字符流用于操作文件的子类一般是FileReader和FileWriter
注意:
- 写入文件后必须要用flush()刷新
- 用完流要记得关闭流
- 使用流对象要处理IO异常
- 定义文件路径可以使用"/"或者"\\"
- 在创建一个文件时,如果目录下有同名文件讲被覆盖
- 读取文件时,要保证该文件存在,否则会出现异常
创建一个文件,并存入数据:
FileWriter fw = null;
try {
fw = new FileWriter("D:\\IOreview.txt");//明确文件存放的位置
fw.write("谢晓飞");//写入数据
fw.flush();//刷新,不刷新没有数据
fw.write("真帅");//flush刷完还能继续写数据
}catch(IOException e) {
e.printStackTrace();
}finally {
try {
if(fw!=null)fw.close();//close()关闭流资源,关闭之前还会刷新一次,所以不用继续刷
}catch(IOException e) {
e.printStackTrace();
}
}
效果就是这样的(笑的请厚道一点^_^)
其中close()和flush()的区别:flush()在刷新之后还能继续输入,但是close()不能在输入
FileReader中的read()方法 对单个字符和数组进行读取
字符数组的读取:
FileReader fr = null;
try {
fr = new FileReader("D:\\IOreview.txt");//读取具体的文件内容
char []ch = new char[1024];//创建一个字符数组
int num = -1;//定义一个整形数据用来判断有没有带数据的末尾
while((num=fr.read(ch))!=-1) {//当读取到文件的末尾,num的值就会等于-1,并且把内容都存放在ch数组中
System.out.println(new String(ch,0,num));
}
}catch(IOException e) {
e.printStackTrace();
}catch(Exception e) {
e.printStackTrace();
}finally {
try {
if(fr!=null)fr.close();
}catch(IOException e) {
e.printStackTrace();
}
}
(承让了啊)
单个字符的读取:
FileReader fr = null;
try {
fr = new FileReader("D:\\IOreview.txt");
int ch = 0;
while((ch=fr.read())!=-1) {
System.out.print((char)ch);
}
}catch(IOException e) {
e.printStackTrace();
}finally {
try {
if(fr!=null)
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
效果同样,就不展示了
二 字节流
字节流和字符流的操作基本相同,但是想要操作媒体文件(媒体文件是用字节存储的)
读写字节流:InputStream(读)输入流 和OutputStream(写)输出流 ps:初学IO这一块我也是懵逼,但是记得他这个是相较于计算机的就好了
字节流可以不用刷新操作
操作图片-----复制图片
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream("D:\\zy.jpg");
fos = new FileOutputStream("D:\\xf.jpg");
byte[] b = new byte[1024];
int num = -1;
while((num = fis.read(b))!=-1) {
fos.write(b);
}
}catch(IOException e) {
e.printStackTrace();
}finally {
try {
if(fis!=null)fis.close();
if(fos!=null)fos.close();
}catch(IOException e) {
e.printStackTrace();
}
}
阔以的
三 缓冲区
为了提高效率,因为出现了缓冲区
字符流缓冲区:BufferedWriter和BufferedReader
将需要提高效率的流作为参数存放到缓冲区的构造函数中,早缓冲区中封装一个数组,存入数据后一次性取出来
BufferedReader:
读取缓冲区提供了一次读一行的方法readLine(),方便对文本数据的获取
readLine()只返回回车字符前的字符,不返回回车字符,如果是复制的话,必须加上newLine(),进行换行
newLine(),是java提供多平台换行符写入操作
// TODO Auto-generated method stub
FileReader fr = null;
BufferedReader bufr = null;
try {
fr = new FileReader("D:\\IOreview.txt");
bufr = new BufferedReader(fr);
String str = null;
while((str=bufr.readLine())!=null) {
System.out.println(str);
}
}catch(IOException e) {
e.printStackTrace();
}finally {
try {
if(bufr!=null)bufr.close();
}catch(IOException e) {
e.printStackTrace();
}
}
hiahiahiaO(∩_∩)O哈哈~
FileReader fr = null;
FileWriter fw = null;
BufferedWriter bufw = null;
BufferedReader bufr = null;
try {
fr = new FileReader("D:\\IOreview.txt");
fw = new FileWriter("D:\\IOreview1.txt");
bufw = new BufferedWriter(fw);
bufr = new BufferedReader(fr);
String str = null;
while((str = bufr.readLine())!=null) {
bufw.write(str);
bufw.newLine();
}
}catch(IOException e) {
e.printStackTrace();
}finally {
try {
if(bufw!=null)bufw.close();
if(bufr!=null)bufr.close();
}catch(IOException e) {
e.printStackTrace();
}
}
为了体现换行,所以在IOreview文件中添加了几条语句,所以时间是新的
字节流缓冲区:
字节流缓冲区字符流缓冲区操作基本是一样的
BufferedInputStream bufi = null;
BufferedOutputStream bufo = null;
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream("D:\\zy.jpg");
fos = new FileOutputStream("D:\\xf1.jpg");
bufi = new BufferedInputStream(fis);
bufo = new BufferedOutputStream(fos);
int num = -1;
byte []b = new byte[1024];
while((num = bufi.read(b))!=-1) {
bufo.write(b,0,num);
}
}catch(IOException e) {
e.printStackTrace();
}finally {
try {
if(bufi!=null)bufi.close();
if(bufo!=null)bufo.close();
}catch(IOException e) {
e.printStackTrace();
}
}
因为xf.jpg和zy.jpg是复制过来的,所以看xf1.jpg和xf.jpg是一样的就行
师从毕向东老师,个人认为毕向东老师教的真的挺好的,只是视频可能有些年头了,由于马上准备找工作了,所以吧笔记在博客园写一下,加深一下印象
那些地方写的不好请指出来,小白再次拜谢了
共同努力共同进步
谢谢大家了