IO流
IO流
1,I是指Input(输入),O是指Output(输出)。
2,在Java中,文件的输入和输出是通过流(Stream)来实现的,流的概念源于Unix中管道(pipe)的概念。在Unix系统中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备、外部文件等。
3,一个流,必有源端和目的端,它们可以是计算机内存的某些区域,也可以是磁盘文件,甚至可以是Internet上的某个URL。对于流而言,我们不用关心数据是如何传输的,只需要向源端输入数据,向目的端获取数据即可。
4,流按照处理数据的单位,可以分为字节流和字符流;按照流向分为输入流和输出流(注意:输入流和输出流都是站在程序的角度参照的)。
字节流
字节流用于处理以字节为单位的二进制文件(如音乐、图片等)
1,InputStream抽象类是所有输入字节流类的直接或间接父类,FileInputStream是其重要子类:
FileInputStream
FileInputStream常用构造方法:
FileInputStream(File file) :通过File对象创建FileInputStream对象。
FileInputStream(String name) :通过文件(非“目录”)路径创建FileInputStream对象。
FileInputStream常用方法:
int read():从输入流中读取单个字节的数据;如果已到达文件末尾,则返回 -1。
int read(byte[] b):从输入流中将最多b.length个字节的数据读入一个byte数组中,以整数形式返回存入数组中的实际字节个数;如果已到达文件末尾,则返回 -1。
void close():关闭此文件输入流并释放与此流有关的所有系统资源。
2,OutputStream抽象类是所有输出字节流类的直接或间接父类,FileOutputStream是其重要子类:
FileOutputStream
FileOutputStream常用构造方法:
FileOutputStream(File file) :通过File对象创建FileOutputStream对象。
FileOutputStream(String name) :通过文件(非“目录”)路径创建FileOutputStream对象。
FileOutputStream(File file, boolean append):通过File对象创建FileOutputStream对象;第二个参数如果为true ,则字节将被写入文件的末尾而不是开头。
FileOutputStream常用方法:
void write(int b):将指定的单个字节数据写入此文件输出流。
void write(byte[] b, int off, int len):将byte数组中从off开始的len个字节写入此文件输出流。
void flush():刷新字节输出流并强制写出缓冲内所有字节数据。
void close():关闭此文件输出流并释放与此流有关的所有系统资源。
用如下例子说明上述字节流中方法的使用:
追踪传输过程:
为了提高传输速度,使用如下代码
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Text {
public static void main(String[] args) {
FileInputStream input=null;//提升变量
FileOutputStream output=null;
try {
input=new FileInputStream("D://1.mp4");//输入流
output=new FileOutputStream("D://3.mp4");//输出流,文件为空,创建。
byte [] car=new byte[1024]; //载货工具
int validLength=0;
while((validLength=input.read(car))!=-1) {//以1024字节为单位传输。-1表示传输完成。传输过快,也容易出错
output.write(car, 0, validLength);
}
output.flush();
} catch (Exception e) {
e.printStackTrace();
}finally {//释放资源,先关闭输出流。
if(input!=null) {
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(output!=null) {
try {
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
特别注意:FileOutputStream(File file) 、 FileOutputStream(String name) 或FileOutputStream(File file, false)创建FileOutputStream对象时会创建一个新的空文件;如果使用FileOutputStream(File file, true)创建FileOutputStream对象,则只在第一次执行时创建一个新的空文件。
字符流
Java虚拟机将字节转化为2个字节的Unicode字符就形成了字符流,字符流用于处理以Unicode字符为单位的文本文件(如记事本文件等)。
1,Reader抽象类是所有输入字符流类的直接或间接父类, FileReader是其重要子类:
FileReader
FileReader常用构造方法:
FileReader(File file) :通过File对象创建FileReader对象。
FileReader(String fileName) :通过文件(非“目录”)路径创建FileReader对象。
FileReader常用方法:
int read():从输入流中读取单个字符的数据,如果已到达流的末尾,则返回 -1 。
int read(char[] cbuf):从输入流中将最多cbuf.length个字符的数据读入一个char数组中,以整数形式返回存入数组中的实际字节个数,如果已到达流的末尾,则返回 -1 。
void close():关闭此文件输入流并释放与此流有关的所有系统资源。
2,Writer抽象类是所有输出字符流类的直接或间接父类,FileWriter是其重要子类:
FileWriter
FileWriter常用构造方法:
FileWriter(File file) :通过File对象创建FileWriter对象。
FileWriter(String fileName) :通过文件(非“目录”)路径创建FileWriter对象。
FileWriter(File file, boolean append):通过File对象创建FileWriter对象;第二个参数如果为true ,则字节将被写入文件的末尾而不是开头。
FileWriter常用方法:
void write(int c):将指定的单个字符数据写入此文件输出流。
void write(char[] cbuf, int off, int len):将char数组中从off开始的len个字符写入此文件输出流。
void flush():刷新字符输出流缓冲。
void close():关闭此文件输出流并释放与此流有关的所有系统资源。
用如下例子说明上述字符流中方法的使用:
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Text {
public static void main(String[] args) {
try {
FileReader reader=new FileReader("D://5.java");
FileWriter writer=new FileWriter("D://51.java");
int data=0;
while((data=reader.read())!=-1) {//data=reader.read()是从文件中读出来。
writer.write(data);//将data写在新的文件中。由于文件太小,所以在缓存中。用output.flush();
}
writer.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
}
提高传输速度用如下代码:
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Text {
public static void main(String[] args) {
FileReader reader=null;
FileWriter writer=null;
try {
reader=new FileReader("D://5.java");
writer=new FileWriter("D://52.java");
char [] str=new char[1024];
int data=0;
while((data=reader.read(str))!=-1) {//data=reader.read()是从文件中读出来。
writer.write(str, 0, data);;//将data写在新的文件中。由于文件太小,所以在缓存中。用output.flush();
}
writer.flush();//任何输出流都有flush
} catch (Exception e) {
e.printStackTrace();
}finally {
if(writer!=null) {
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(reader!=null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
特别注意: FileWriter (File file) 、 FileWriter (String fileName) 或FileWriter (File file, false)创建FileWriter对象时会创建一个新的空文件;如果使用FileWriter (File file, true)创建FileWriter对象,则只在第一次执行时创建一个新的空文件。
转换流
由于文件自身编码方式和程序运行时使用的默认编码方式不一致,致使程序读取或输出字符文件时可能会出现乱码,这时可以使用字节流操作文件,然后再将字节流转换成字符流,这一转换过程可以借助转换流实现。
InputStreamReader
InputStreamReader(字节输入流——>字符输入流):
InputStreamReader(InputStream in) :
InputStreamReader(InputStream in, String charsetName):
OutputStreamWriter
OutputStreamWriter(字节输出——>字符输出流):
OutputStreamWriter(OutputStream out) :
OutputStreamWriter(OutputStream out, String charsetName) :
看如下例子:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Text {
public static void main(String[] args) {
InputStreamReader reader=null;
OutputStreamWriter writer=null;
try {
reader=new InputStreamReader(new FileInputStream("D://5.java"),"GBK");
writer=new OutputStreamWriter(new FileOutputStream("D://53.java"),"GBK");
char [] car=new char[1024];
int validLength=0;
while((validLength=reader.read(car))!=-1) {//从car里读取字节的有效长度
writer.write(car, 0, validLength);
}
writer.flush();
} catch (Exception e) {
e.printStackTrace();
}finally {
if(writer!=null) {
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(reader!=null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
根据前面所学知识,可以通过字符流或者缓冲字符流实现文本文件的复制,但是这种复制方法有可能会出现乱码,为了解决该问题可以通过字节流+转换流实现文本文件的复制。
缓冲流
缓冲流是一种装饰器类,目的是让原字节流、字符流新增缓冲的功能以提高读取或写入。
缓冲字节输入流:
BufferedInputStream(InputStream in):
缓冲字节输出流:
BufferedOutputStream(OutputStream out):
缓冲流实现二进制文件拷贝
缓冲字符输入流:
BufferedReader(Reader in):
缓冲字符输出流:
BufferedWriter(Writer out):
缓冲流实现文本文件拷贝