1.I/O操作的目标
从数据源当中读取数据(I)以及将数据写入到数据目的地当中(O)
2.I/O的分类方法
第一种分法:
1.输入流
2.输出流
第二种分法:
1.字节流(把字符转换为ASCII码,然后以字节的方式读取出来)
2.字符流(读写文件时,以字符为基础)
第三种分法:
1.节点流(真正处理数据的IO流)
2.处理流(在节点流的基础上对数据进行再加工.类似于装饰者(Decorator)模式)
3.读取文件写入文件的方法
a.字节流的操作
(1).文件内容较少的情况
from.txt 文件的内容为 abcd
to.txt的内容为空
(2).文件内容比较多(采用循环的方式读取,难道下一次读取都是在上一次读取完后的内容后面进行读取吗???)
import java.io.*;
class Test
{
public static void main(String arg[])
{
//生成输入流的引用
FileInputStream fis=null;
//生成输出流的引用
FileOutputStream fos=null;
try{
//生成代表输入流的对象
fis=new FileInputStream("D:/src/from.txt");
//生成代表输入流的对象
fos=new FileOutputStream("D:/src/to.txt");
//生成一个字节数组
byte[] buffer=new byte[100];
//buffer:读取数据放在里面,off:表示偏移量,len:表示读取的长度
fis.read(buffer,0,100);
for(int i=0;i<buffer.length;i++)
{
//输出的结果为96,97,98,99,0,0.....
//如果把上面的偏移量改为4,后面的长度必须改为96,否则出现下标越界的异常,输出的几位为:0,0,0,0,96,97,98,99,0,0......
System.out.println(buffer[i]);
}
//将字节还原为字符
String str=new String(buffer);
System.out.println(str.trim());
//写入
fos.write(buffer,0,100);
}
catch(Exception e)
{
System.out.println(e);
}
finally
{
try{
fis.close();
fos.close();
}catch(Exception e){
System.out.println(e);
}
}
}
}
import java.io.*;
class Test
{
public static void main(String arg[])
{
FileInputStream fis=null;
FileOutputStream fos=null;
try{
fis=new FileInputStream("D:/src/from.txt");
fos=new FileOutputStream("D:/src/to.txt");
byte[] buffer=new byte[1024];
while(true)
{
//当read()方法返回-1时,表示文件内容已经全部读完
int iLen=fis.read(buffer,0,1024);
if(iLen==-1)break;
fos.write(buffer,0,1024);
}
}
catch(Exception e)
{
System.out.println(e);
}
finally
{
try{
fis.close();
fos.close();
}catch(Exception e)
{
System.out.println(e);
}
}
}
}
b.字符流的操作
(1).文件内容较少的情况
from.txt 文件的内容为 abcd
to.txt的内容为空
import java.io.*;
class Test
{
public static void main(String arg[])
{
FileReader fr=null;
FileWriter fw=null;
try
{
fr=new FileReader("d:/src/from.txt");
fw=new FileWriter("d:/src/to.txt");
//注意:这里是使用char[],而在字节流中使用 的是byte[]
char[] buffer=new char[100];
fr.read(buffer,0,100);
for(int i=0;i<buffer.length;i++)
{
//输出结果为a,b,c,d,空,空......
System.out.println(buffer[i]);
}
//写入
fw.write(buffer,0,100); }
catch(Exception e)
{
System.out.println(e);
}
finally
{
try{fr.close();fw.close();}
catch(Exception e){System.out.println(e);}
}
}
}
c.处理流的使用实例
(1).创建一个文件user.txt 内容如下:
2.声明一个类Test.java,代码如下:
import java.io.*;
class Test
{
public static void main(String arg[])
{
FileReader fr=null;
BufferedReader bufferedReader=null;
try
{
fr=new FileReader("d:/src/users.txt");
//生成BufferedReader对象(参数为FileReader类的对象,用到了设计模式中的"装饰者(Decorator)模式")
bufferedReader=new BufferedReader(fr);
String line=null;
while(true){
//读一行
line=bufferedReader.readLine();
if(line==null)
{
break;
}
System.out.println(line);
}
}
catch(Exception e)
{
System.out.println(e);
}
finally
{
try{fr.close();bufferedReader.close();}
catch(Exception e){System.out.println(e);}
}
}
}
3.执行结果:
总结:
I/O当中的核心类FileInputStream 继承自 InputStream,FileOutputStream 继承自OutputStream.
FileReader 继承自Reader,FileWriter继承自Writer
I/O核心类的核心方法: InputStream
int read(byte[] b,int off,int len) //返回读取的数据长度,读取的数据都放在参数b中,off参数表示偏移量(在第几个位置输出),len参数表示读取的长度
OutputStream
void write(byte[],int off,int len)