IO流的理解。
I/O操作目标 从数据源当中读取数据,以及将数据写入到数据目的地当中,如图:
IO的分类方法 第一种分法:输入流、输出流 第二种分法:字节流、字符流 第三种分法:节点流、处理流
数据的流向以程序为参考,数据进来——输入流,数据从程序出去——输出流 输入流:只能从中读取数据,而不能向其写出数据 输出流:只能向其写出数据,而不能从中读取数据
输入流的基类,抽象类:InputStream(输入字节流)和Reader(输入字符流) 分别有一个用于读取文件的输入流:FileInputStream和FileReader //都是节点流,和指定文件关联
输出流的基类,抽象类:OutputStream和Write 执行输出的类:FileOutputStream和FileWriter
核心类的核心方法: InputStream: int read(byte[ ] b , int off , int len) 三个参数:
第一个参数是一个byte类型的数组,read读取的数据放在这个byte类型的数据中
第二个参数是是偏移量offset的缩写,读进去来的数据从第几位开始放:比如读取的是10个字节,int off 是0,意思就是把读取的来的字节,从0开始,一个个放进去;如果int off 是5,则byte数组的第五位开始读
第三个参数是length,意思是read一词读取数据,最多读多少次数据
返回值是这次调用这个方法总共读取了多少个字节的数据,读取的是10,则返回的就是10
一般来讲,int off 是0,int len就是数组的长度 OutputStream: void write(byte[ ] b , int off , int len )
第一个参数是一个byte类型的数组,将需求斜入的文件放在这个数组中
第二个参数是是偏移量offset的缩写,数组中的数据从第几位开始写:比如10个字节,int off 是0,意思就是从0开始写;如果int off 是5,则byte数组的第五位开始写
第三个参数是length,意思是总共最多写入多少字节的数据
一般来讲,int off 是0,int len就是数组的长度
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 输入demo: import java.io.*;class Test { FileInputStream fis = null ; try { fis = new FileInputStream("d:/work/src/from.txt" ) byte [] buffer = new byte [100 ]; fis.read(buffer , 0 ,buffer.length); String s= new String(buffer); s = s.trim(); for (int i = 0 , i < buffer.length , i++){ System.out.println(buffer[i]); } } catch (Exception e){ System.out.println(e) } finally { try { fis.close; } catch (Exception e){ System.out.println(e) } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 输出流demo(先要读取到,再写入): import java.io.*;class Test {FileInputStream fis = null ; FileOutputStream fos = null ; try { fis = new FileInputStream("d:/work/src/from.txt" ) fos = new FileOutputStream(d:/work/src/to.txt); byte [] buffer =new byte [100 ]; int temp = fis.read(buffer , 0 , buffer.length) fos.write(buffer , 0 , temp); } catch (Exception e){ System.out.println(e); } finally (Exception e){ System.out.println(e); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 输出流demo(先要读取到,再写入): import java.io.*;class Test {FileInputStream fis = null ; FileOutputStream fos = null ; try { fis = new FileInputStream("d:/work/src/from.txt" ) fos = new FileOutputStream(d:/work/src/to.txt); byte [] buffer =new byte [1024 ]; while (true ){ int temp = fis.read(buffer , 0 , buffer.length) if (temp == -1 ){ break ; } fos.write(buffer , 0 , temp); } } catch (Exception e){ System.out.println(e); } finally (Exception e){ fis.close; fos.close; System.out.println(e); } }
字符流的使用方法 读写文件时,以字符为基础 字节输入流:都是reader(父类,抽象类)子类 经常用的子类:FileReader 核心方法:int read(char [] c , int off , int len) //返回值整型 int 参数char类型的数组 字节输出流:都是Writer类(父类,抽象类)的子类 经常用的子类:FileWriter 核心方法:void write(char[ ] c , int off ,int len) //返回为空
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 import .java.io.*;public static void main (String args[]) FileReader fr = null ;FileWriter fw = null ; try {fr = new FileReader("d:/work/src/from.txt" ); fw = new FileWriter("d:/work/src/to.txt" ); char [] buffer = new char [100 ];int temp = fr.read(buffer , 0 , buffer,length);fw.write(buffer, 0 , temp); } catch (Exception e){ System.out.println(e); } finally { try { fr.close; fw.close; } catch (Exception e){ System.out.println(e) } } }
处理流使用实例 处理流常用类: BufferedReadeer(父类Reader(输入类),字符流),所以这个类是字符输入处理流 常用方法: public String readLind() //一次性读入一行的数据,返回字符串 生成BufferedReadeer对象的方法: BufferedReadeer in = new BufferedReader(new FileReader(“foo.in”)) //构造函数中,接收的是一个Reader类型的对象,传入源路径
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 import .java.io.*;class Test { public static void main (String args[]) { FileReader fileReadr = null ; BufferedReader bufferedReader = null ; try { fileReader = new FileReader(d:/work/src/from.txt); bufferReader = new BufferReader(fileReader); String line = null ; while (true ){ line = buffer.readLine(); if (line = null ){ break ; } System.out.println(line) } catch (Exception e){ System.out.println(e); } } } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 demo: interface Worker { public void doSomeWork(); } class Plumber implements Worker { public void doSomeWork(){ System.out.println("修水管" ); } } class Carpenter implements Worker { public void doSomeWork(){ System.out.println("修门窗" ); } } class Aworker implements Worker { private Worker worker; public AWork (Work work) { this .worker = worker; } public void doSomeWork(){ System.out.println("你好" ); worker.doSomeWorker; } } 主函数: class Test {public static void main (String args[]) { Plumber plumber = new Plumber(); AWorker aWoker = new Aworker(plumber); aWorker.doSomeWork(); } } 输出: 你好 修水管