在java.io包里面File类是惟一一个与文件自己有关的程序处理类,可是File只可以操做文件自己而不能操做文件的内容,或者说在实际的开发之中IO操做的核心意义在于:输入与输出操做。输入和输出实质上传递的就是一种数据流的处理形式,数据流指的是字节数据 。而对于这种流的处理形式在java.io包里面提供有两类支持。java
流操做的统一处理步骤(以文件处理流程为例):数组
字节的数据是以byte类型为主实现的操做,在进行字节内容的输出的时候可使用OutputStream类完成app
类的基本定义:spa
三个内容输出的方法:code
注意:对象
OutputSream是一个抽象类,若是想要得到实例化对象应该经过对子类实例的向上转型完成,若是说如今要进行的是文件处理操做,则可使用FileOutputStream子类blog
FileOutputStream构造方法:资源
范例:使用OutputStream类实现内容输出(符合上述的流操做的统一处理步骤)开发
import java.io.*; public class OutputStreamDemo { public static void main(String[] args) throws IOException { // TODO Auto-generated method stub File file = new File("D:"+File.separator+"hello" +File.separator+"demo.txt"); //1.指定要操做的文件路径 if(!file.getParentFile().exists()) { //文件不存在 file.getParentFile().mkdirs(); //建立父目录 } try (OutputStream output = new FileOutputStream(file,true)) {//2.经过子类实例化 String str = "hello world\r\n"; //要输出的文件内容 output.write(str.getBytes());//3.将字符串变为字节数组并输出 } catch (IOException e) { e.printStackTrace(); }//4.AutoCloseable 自动关闭 //执行后会自动帮助用户建立文件 } }
类的基本定义:字符串
核心方法:
InputoutStream和OutputStream同样都属于抽象类,要依靠子类来实例化对象
FileInputStream构造方法:
范例:读取数据
import java.io.*; public class InputStreamDemo { public static void main(String[] args) throws IOException { // TODO Auto-generated method stub File file = new File("D:"+File.separator+"hello" +File.separator+"demo.txt");//读取的文件路径 InputStream input = new FileInputStream(file); byte[] data = new byte[1024];//用于存放读取出的内容的缓冲区 int len = input.read(data);//读取的内容长度 System.out.println("【"+new String(data,0,len)+"】");//输出缓冲区读取的内容 input.close(); } }
OutputStream数据输出的时候使用的是字节,而不少时候字符串的输出是比较方便的,因此在JDK1.1时推出字符输出流
类的基本定义:
两个主要的输出方法:
范例:使用Writer输出
import java.io.*; public class WriterDemo { public static void main(String[] args) throws IOException { // TODO Auto-generated method stub File file = new File("D:"+File.separator+"hello" +File.separator+"demo.txt"); //1.指定要操做的文件路径 if(!file.getParentFile().exists()) { //文件不存在 file.getParentFile().mkdirs(); //建立父目录 } Writer out = new FileWriter(file,true); String str = "goodbye world\r\n"; out.write(str); out.append("hahahaha");//追加输出内容 out.close(); } }
类的基本定义:
输入方法:
字符流读取的时候只可以按照数组的形式来实现处理操做,不可以直接按照字符串的形式
范例:实现数据读取
import java.io.*; public class ReaderDemo { public static void main(String[] args) throws IOException { // TODO Auto-generated method stub File file = new File("D:"+File.separator+"hello" +File.separator+"demo.txt"); if(file.exists()) { Reader in = new FileReader(file); char[] data = new char[1024]; int len = in.read(data); System.out.println(new String(data,0,len)); in.close(); } } }
在使用OutputStream类输出的时候若是没有使用close()方法关闭输出流发现内容依然能够实现正常的输出
可是若是在使用Writer的时候没有使用close()方法关闭输出流,那么这个内容将没法进行输出,由于Writer使
用到缓冲区,当使用了close()方法的时候实际上会出现有强制刷新缓冲区的状况,因此这个时候会将内容进行
输出操做,因此此时若是在不关闭的状况下想要将所有内容输出可使用flush()方法强制状况缓冲区
字符流的优点在于处理中文数据上
转换流就是能够实现字节流与字符流操做的功能转换,例如:进行输出的时候OutputStream须要将内容变
为字节数组后才能够输出,而Writer能够直接输出字符串,这一点是方便的,因此不少人就认为须要提供一种
转换的机制,来实现不一样的流类型的转换操做,为此在java.io包里面提供有两个类:InputStreamReader
OutputStreamWriter。
类: OutputStreamWriter InputStreamReader
定义: public class OutputStreamWriter extends Writer public class InputStreamReader extends Reader
构造方法:public OutputStreamWriter(OutputStream out) public InputStreamReader(InputStream in)
从构造方法能够看出,所谓的转换处理,就是将接收到的字节流对象向上转型变为字符流对象
范例:转换流
import java.io.*; public class OutputStreamWriterDemo { public static void main(String[] args) throws Exception { // TODO Auto-generated method stub File file = new File("D:"+File.separator+"hello" +File.separator+"demo.txt"); if(!file.getParentFile().exists()) { //文件不存在 file.getParentFile().mkdirs(); //建立父目录 } OutputStream output = new FileOutputStream(file,true); Writer out = new OutputStreamWriter(output); out.write("i am back"); out.close(); } }