利用 【字节流】文件输入流与文件输出流
字节流主要处理字节和字节数组或二进制对象
写入字节数据的三种方式
*void write(int b) 将指定字节写入此文件输出流,一次只能写入一个字节数据
*void write(byte[] b) 将b.length字节从指定字节数组写入此文件输出流(一次写一个字节数组)
*void write(byte[] b,int off ,int len); 将len字节从指定的字节数组开始,从偏移量off开始写入到此文件输出流(一次写一个字节数组的部分数据)
读取字节数据的三种方式
*int read(byte[] b) 从该输出流读取最多b.length个字节的数据到一个字节数组
*int read(byte[] b, int off, int len) 从偏移量off开始将最多len字节的数据读入到一个字节数组。
*int read() 从该输出流获取一个字节的数据,如果达到文件末尾则返回-1
1.一次读写一个字节
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Copytxt {
public static void main(String[] args) throws IOException {
//复制文件,其实就是把文本文件的内容从一个文件中读取出来(InputStream),然后写入到另一个文件中(OutputStream)
FileInputStream f1=new FileInputStream("D:\\FILE\\java.txt");//创建文件输入流读取文件,即被复制的文件
FileOutputStream f2=new FileOutputStream("D:\\FILE\\复制\\javaa.txt");//创建文件输出流写入新文件
int i;
if(f1!=null) {
while((i=f1.read(b))!=-1) {
//while((int i=f1.read())!=-1){//标记“int”上有语法错误,删除此标记
//不能直接在while的条件模块中创建变量
f2.write(i);
}
}
f1.close();
f2.close();
}
}
2.一次读写一个字节数组
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Copytxt {
public static void main(String[] args) throws IOException {
//复制文件,其实就是把文本文件的内容从一个文件中读取出来(InputStream),然后写入到另一个文件中(OutputStream)
FileInputStream f1=new FileInputStream("D:\\FILE\\java.txt");//创建文件输入流读取文件,即被复制的文件
FileOutputStream f2=new FileOutputStream("D:\\FILE\\复制\\javaa.txt");//创建文件输出流写入新文件
byte[] b=new byte[1000];//相当于一个指定大小的缓冲区
if(f1!=null) {
while(f1.read(b)!=-1) {
f2.write(b);
}
}
//释放资源
f1.close();
f2.close();
}
}
利用【字节缓冲流】
1. 一次读写一个字节
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Copytxt {
public static void main(String[] args) throws IOException {
BufferedInputStream b1=new BufferedInputStream(new FileInputStream("D:\\FILE\\java.txt"));//创建文件输入流读取文件,即被复制的文件
BufferedOutputStream b2=new BufferedOutputStream(new FileOutputStream("D:\\FILE\\复制\\javaa.txt"));//创建文件输出流写入新文件
int i;
if(b1!=null) {
while((i=b1.read())!=-1) {
b2.write(i);
}
}
b1.close();
b2.close();
}
}
2. 一次读写一个字节数组
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Copytxt {
public static void main(String[] args) throws IOException {
BufferedInputStream b1=new BufferedInputStream(new FileInputStream("D:\\FILE\\java.txt"));//创建文件输入流读取文件,即被复制的文件
BufferedOutputStream b2=new BufferedOutputStream(new FileOutputStream("D:\\FILE\\复制\\javaa.txt"));//创建文件输出流写入新文件
byte[] b=new byte[1000];
if(b1!=null) {
while(b1.read(b)!=-1) {
b2.write(b);
}
}
b1.close();
b2.close();
}
}
利用【字符流】
字符流主要用于处理字符、字符数组或字符串。
与字节流的差别在于字符流操作时使用了缓冲区,而字符流是直接对文件进行操作
字节流在操作文件时,即使不关闭资源,文件也能输出,但是字符流不关闭资源则不会输出任何内容,说明字符流用的是缓冲区,并且可以使用flush()方法刷新缓冲区,这时可以在不close()的情况下输出内容
字符流写数据的五种方式
* void write(int c) 写一个字符
* void write(char[] cbuf) 写入一个字符数组
* void write(char[]cbuf,int off,int len) 写入字符数组的一部分
* void write(String str) 写入一个字符串
* void write(String str,int off,int len) 写入一个字符串的一部分
字符流读数据的两种方式
* int read() 一次读一个字符数据
* int read(char[] cbuf) 一次读一个字符数组数据
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Ooutputstreamwrite {
public static void main(String[] args) throws IOException {
OutputStreamWriter o= new OutputStreamWriter(new FileOutputStream("D:\\FILE\\a.txt"),"UTF-8");
/* 构造方法
* OutputStreamWriter(OutputStream out)
* OutputStreamWriter(OutputStream out,String charsetName) */
InputStreamReader i= new InputStreamReader(new FileInputStream("D:\\FILE\\java.txt"),"UTF-8");
char[] b=new char[100];
while(i.read(b)!=-1) {
o.write(b);
}
o.close();
i.close();
}
}
也可以使用一次读写一个字符数组或一次读写一个字符的方法,这里不再另外举例,参考字节流
利用【字符缓冲流】
使用其特有方法readLine()不能读取换行符,所以用write()写数据时,写完要加换行符,使用特有方法newLine()
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Bbufferread {
public static void main(String[] args) throws IOException {
BufferedReader r=new BufferedReader(new InputStreamReader(new FileInputStream("D:\\FILE\\java.txt"),"UTF-8"));
BufferedWriter w=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("D:\\FILE\\a.txt"),"UTF-8"));
String i="";
while((i=r.readLine())!=null) {
w.write(i);
}
r.close();
w.close();
}
}
掌握这些基本上就掌握了io流的文件读写操作,要构建一个io流体系,在read()和write()方法上大致没有多大区别,还有字符缓冲流的特有方法,主要注意括号内的变量类型要求或括号内不需要添加变量,以及new一个对象时要求括号内的流类型,很容易搞混,要搞清楚字节流与字符流,缓冲流的使用环境
io流主要是里面的类比较多,但是一一学下来其实有很多共同点,因为大部分是继承关系,从字节缓冲流我们可以学到字节流与缓冲流的特点,其实就是二者的结合,类似的我们也可以想象一下字符缓冲流会怎么样,而且字符缓冲流还具有其特有方法。多思考多总结,动手写代码中才能真正理解io流,我们需要考虑类型的不同,以及不同构造方法,特有的方法,每个类有区别却又相似