黑马程序员_IO

来源:互联网 发布:怎么自学英语口语知乎 编辑:程序博客网 时间:2024/05/21 07:15
 

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

IO流用来处理设备之间的数据传输
Java对数据的操作是用过流的方式
Java用于操作流的对象都在IO包中
流按操作数据分为两种:字节流与字符流

流按流向分为:输入流,输出流

字符流和字节流
字节流两个基类:InputStream OutputStream

字符流两个基类:Reader Writer

字符流的特点:

既然IO流是用于操作数据的
那么数据的最常见体现形式是:文件

那么先以操作文件为主来演示
需求:在硬盘上,常见一个文件并写入一些文字数据
找到一个专门用于操作文件的Writer子类对象 FileWriter
后缀名是父类名 前缀名是该流对象的功能

import java.io;

public class IoDemo {
 //
 public static void main(String[] args){
  // TODO Auto-generated method stub
  //创建一个FileWriter对象,该对象一被初始化就必须要明确被操作的文件
  //而且该文件会被创建到指定的目录下,如果该目录下已有同名文件将被覆盖
  //其实该步就是明确数据要存放的目的地
  //FileWriter fw = new FileWriter("demo.txt");
  
  //调用writer将字符串写入到流中
  //fw.write("asdf");
  
  //刷新流对象中的缓冲中的数据
  //将数据刷到目的地中
  //fw.flush();
  
  //关闭流资源,但是关闭之前会刷新一次内部的缓冲中的数据
  //将数据刷新到目的地中
  //和flush区别是,flush刷新后,流还可以继续使用,close刷新后,会将流关闭
  // fw.write("haha");
  //fw.close();
  
  FileWriter fw = null;
  try{
   fw = new FileWriter("demo.tex");
   fw.write("asdf");
  }catch(IOException e){
   System.out.println("catch:"+e.toString());
  }finally{
   try{
   if(fw!=null)
    fw.close();
   }catch(IOException e){
    System.out.println(e.toString());
   }
  }
  
 }

}

下面是用FileReader方法来读取文件

import java.io.*;
public class ReaderDemo {

 public static void main(String[] args) throws IOException {
 
  // TODO Auto-generated method stub
  //创建一个文件读取流对象,和指定名称的文件想关联
  //要保证该文件已经存在,如果不存在,会发生异常FlieNotFoundException
  FileReader fr = new FileReader("demo.txt");
  
  //调用读取流对象的read方法
  //reader()一次读一个字符,而且会自动往下读
  while(true){
  int ch = fr.read();
  if(ch==-1)
   break;
  System.out.print((char)ch);
  }
  fr.close();
 }

}

接下来是FileWriter和FileReader的子类BufferedWriter,BufferedReader字符缓冲区

字符流缓冲区
对应类:BufferedWriter BufferedReader
缓冲区要结合流才可以使用
在流的基础上对流的功能进行了增强

缓冲区的出现是为了提高流的操作效率而出现的
所以在创建缓冲区之前,必须要先有流对象

该缓冲区中提供了一个跨平台的换行符
newLine()

import java.io.*;
public class BufferrdWriter {

 public static void main(String[] args)throws IOException {
  // TODO Auto-generated method stub
  //创建一个字符写入对象
  FileWriter fw = new FileWriter("buf.txt");
  
  //为了提高字符写入流的效率,加入了缓冲技术
  //只要将需要被提高的流对象作为参数传递给缓冲区的构造函数即可
  
  BufferedWriter bufw = new BufferedWriter(fw);
  for(int x=1;x<5;x++){
  bufw.write("asdf");
  bufw.newLine();
  }
  //记住只要中道缓冲区就要记得刷新
  //bufw.flush();
  //其实关闭缓冲区就是在关闭缓冲区中的流对象
  
  bufw.close();
 }

}

字符读取流缓冲区:
该缓冲区提供了一个一次读一行的方法,方便于对文本数据的获取
返回NULL时,表示读到文件末尾
readLine方法返回的时候只返回回车之前的数据内容,并不返回回车符

import java.io.*;
public class BufferedReaderDemo{

 
 public static void main(String[] args)throws IOException {
  // TODO Auto-generated method stub
  //建立一个读取流对象和文件相关联
  FileReader fr = new FileReader("buf.txt");
  
  BufferedReader bufr = new BufferedReader(fr);
  String line = null;
  while((line=bufr.readLine())!=null){ 
  System.out.println(line);
  }
  
  bufr.close();
 }

}

 

 

字符流
FileReader
FileWriter
BufferedReader
BufferedWriter

字节流
FileInputStream
FileOutputStream
BufferedInputStream
BufferedOutputStream

1
源:键盘录入
目的:控制台

2需求
源:键盘
目的:文件

3需求:想要将一个文件的数据打印在控制台上
源:文件
目的:控制台

流对象的基本规律:
通过两个明确来完成

1、明确源和目的
 源:输入流
 InputStream Reader
目的:输出流
OutputStream Writer
2.操作的数据是否是纯文本
 是:字符流
 不是:字节流
3当体系明白后,在明确要使用那个具体的对象
 通过设备来进行区分
 源设备:内存,硬盘,键盘
 目的设备:内存,硬盘,控制台

1,将一个文本文件中的数据存储到另一个文件中,复制文件
分析:
  源:文件 因为是源,所以使用读取流:InputStream Reader
 是不是操作文本文件,是!这时就可以选择Reader
 这样体系就明确了
 
 接下来明确要使用该体系中的那个对象?
 明确设备:硬盘上的一个文件
 Reader体系中可以操作文件的对象是FileReader
 
  目的:OutputStream Writer
  是否是纯文本 ?
  是!Writer
  Writer体系中可以操作文件的对象是FileWriter
 
  FileReader fr = new FileReader(“a.txt”);
  是否需要提高效率: 是!加入Reader体系中的缓冲区BufferedReader
  BufferedReader bufr = new BufferedReader(fr);
 
  FileWriter fw = nwe FileWriter("b.txt");

 

 ---------------------- android培训、java培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net/heima