IO(Input
Output)流
IO流用来处理设备之间的数据传输
Java对数据的操作是通过流的方式
Java用于操作流的对象都在IO包中
流按操作数据分为两种:字节流与字符流。
流按流向分为:输入流,输出流。
IO流常用基类
★字节流的抽象基类:
InputStream ,OutputStream。
★字符流的抽象基类:
Reader , Writer。
注:由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀。
如:InputStream的子类FileInputStream。
如:Reader的子类FileReader。
输入字节流InputStream
InputStream的作用是标志那些从不同输入源产生的类。InputStream是所有输入字节流的抽象父类,因此不能够直接构造InputStream的实例,必须通过它的子类来进行构造。由于它是抽象类,因此提供了一些抽象接口和固有的函数实现。
abstract int read(); //从输入流中读取数据的下一个字节
int read(byte[] b); //从输入流中读取字节数组,并将其存储在缓冲区数组b中
int read(byte[] b,int off,intlen);//将输入流中最多len个数据字节读入byte数组
int available(); //返回此输入流可以读取(或跳过)的估计字节数
long skip(long n); //跳过和丢弃此输入流中数据的n个字节
void close(); //关闭此输入流并释放与该流关联的所有的系统资源
根据输入源的不同,共分为如下几种类型
★ByteArrayInputStream:把内存中的一个缓冲区作为InputStream使用。
★FileInputStream:把一个文件作为InputStream,实现对文件的读取操作。
★ObjectInputStream:把一个对象作为InputStream,实现对文件的读取操作。
★StringBufferInputStream:把一个String对象作为InputStream
并且它还有三个特殊的实现。
★PipeInputStream:实现了管道(Pipe)的概念,主要在线程中使用。
★SequenceInputstream:把多个Inputstream合并为一个InputStream。
★FilterInputStream:对输入流进行各种过滤操作
FilterInputStream还有一组过滤器的具体实现
★BufferedInputstream:缓存过滤器
★DataInputstream:数据过滤器
★LineNumberInputStream:行号过滤器
输出字节流OutputStream
OutputStream的作用就是输出字节,并将这些字节发送到某个接收器。OutputStream表示字节流的所有类的抽象父类,因此不能够直接构造OutputStream的实例,必须通过它的子类来进行构造。由于它是抽象类,因此提供了一些抽象接口和固有的函数实现。
abstract int write(int b); //将指定的字节写入此输出流
void write(byte[] b); //将b.length个字节从指定的byte数组写入此输出流
void write(byte[] b,int off,intlen);//将数组中从off开始的len个字节写入此输出流
void flush(); //刷新此输出流并强制写出所有的缓存的输出字节
void close(); //关闭此输入流并释放与该流关联的所有的系统资源
根据输出源的不同,共分为如下几种类型
★ByteArray
OutputStream:把信息存入内存中的一个缓冲区中。
★File
OutputStream:把信息存入文件中。
★Object
OutputStream:把一个对象作为
OutputStream,实现对对象的写入操作。
并且它还有三个特殊的实现。
★Pipe
OutputStream:实现了管道(Pipe)的概念,主要在线程中使用。
★Filter
OutputStream:对输入流进行各种过滤操作
FilterInputStream还有一组过滤器的具体实现
★Buffered
Outputstream:缓存过滤器
★Data
Outputstream:数据过滤器
★PrintStream:格式化过滤器
看一下复制一个图片的代码
import java.io.*;
class CopyPic {
public static void main(String[] args) {
FileOutputStream fos = null;
FileInputStream fis = null;
try {
fos = new FileOutputStream("c:\\2.bmp");
fis = new FileInputStream("c:\\1.bmp");
byte[] buf = new byte[1024];// 定义一个数组
int len = 0;
while ((len = fis.read(buf)) != -1)// 将读取的字节存入到数组中
{
fos.write(buf, 0, len);
}
} catch (IOException e) {
throw new RuntimeException("复制文件失败");
} finally {
try {
if (fis != null)
fis.close();
} catch (IOException e) {
throw new RuntimeException("读取关闭失败");
}
try {
if (fos != null)
fos.close();
} catch (IOException e) {
throw new RuntimeException("写入关闭失败");
}
}
}
}
输入字符流Reader
Reader是用来输入字符数据,它所提供的方法跟Inputstream基本一样。Reader表示字符流的所有类的抽象父类,因此不能够直接构造Reader的实例,必须通过它的子类来进行构造。由于它是抽象类,因此提供了一些抽象接口和固有的函数实现。
abstract int read(char[] cbuf,int off,intlen);//将字符读入数组某一部分
abstract void close(); //关闭该流并释放与之关联的所有资源
int read(); //都去单个字符
int read(char[] cbuf); //将字符读入数组
void reset(); //重置该流
long skip(long n); //跳过字符
根据输入源的不同,共包括如下几种类型,分别与InputStream额实现类想对应。
★CharArrayReader:与ByteArrayInputStream对应,用于读入内存中的字符数组
★FileReader:与FileInputStream对应,用于读取文件的内容
★StringReader:与StringBufferInputStream对应,用于读取字符串
它还有3个特殊的实现
★PipeReader:与PipeInputStream对应
★BufferedReader:与BufferedInputStream对应。
★FilterReader:与FilterInputStream对应
BufferedReader还有一个行号的实现类
★LineNumberReader:与LineNumberInputStream对应,行号读取类
输出字符流Writer
输出字符流Writer
Writer的作用就是输出字节,并将这些字符发送到某个接收器。Writer表示字符流的所有类的抽象父类,因此不能够直接构造Writer的实例,必须通过它的子类来进行构造。由于它是抽象类,因此提供了一些抽象接口和固有的函数实现。
abstract int write(char[] cbuf,intoff,int len); //写入字符数组的某一部分
void write(char[] cbuf); //写入字符数组
void write(int c); //写入单个字节
void write(String str) //写入单个字符串
void (String str,int off,int len) //写入字符串的某一部分
void flush(); //刷新该流的缓存
void close(); //关闭该流,但要先刷新它
根据输出源的不同,共包括如下几种类型,分别与OutputStream的实现类相对应。
★CharArray
Writer:与ByteArray
Out
putstream对应,用于写入内存中的字符数组
★File
Writer:与File
Out
putstream对应,用于写入文件的内容
★String
Writer:无与之对应的以字节为导向的Stream,用于写入内存中的字符串
它还有3个特殊的实现
★Pipe
Writer:与Pipe
Out
putstream对应
★Buffered
Writer:与Buffered
Out
putstream对应。
★Filter
Writer:与Filter
Out
putstream对应
★PrintWriter:格式化过滤器
看一下代码
<div>//将C盘一个文本文件复制到D盘。</div><div></div>import java.io.*;
class CopyText {
public static void main(String[] args) throws IOException {
copy_2();
}
public static void copy_2() {
FileWriter fw = null;
FileReader fr = null;
try {
fw = new FileWriter("SystemDemo_copy.txt");
fr = new FileReader("SystemDemo.java");
char[] buf = new char[1024];
int len = 0;
while ((len = fr.read(buf)) != -1) {
fw.write(buf, 0, len);
}
} catch (IOException e) {
throw new RuntimeException("读写失败");
} finally {
if (fr != null)
try {
fr.close();
} catch (IOException e) {
}
if (fw != null)
try {
fw.close();
} catch (IOException e) {
}
}
}
<pre name="code" class="java">//从C盘读一个字符,就往D盘写一个字符。
public static void copy_1() throws IOException {
// 创建目的地。
FileWriter fw = new FileWriter("RuntimeDemo_copy.txt");
// 与已有文件关联。
FileReader fr = new FileReader("RuntimeDemo.java");
int ch = 0;
while ((ch = fr.read()) != -1) {
fw.write(ch);
}
fw.close();
fr.close();
}
}
字节流与字符流的转换
字节流输入流转换为字符输入流
InputStreamReader是字节流通向字符流的桥梁,它使用了指定的charset读取字节并将其解码字符
构造方法摘要
OutputStreamWriter是字符流通向字节流的桥梁,可使用指定的charset将要写入流中的字符编码成字节。它使用的字符集可以有名称指定或显示给定,否则将接受平台默认的字符集
构造方法摘要
File类用于实现对目录的创建、删除,对文件的创建、重命名、删除。因此,File类操作的对象分为两类:目录和文件。
File有4个构造函数来创建一个文件对象
isDirectory();是否是目录
isFile();是否是文件
exists() 文件是否存在
mkdir();创建一个目录
mkdirs();创建所有目录
creatNewFile();创建一个文件
delete();删除文件或目录
总结:流操作的基本规律,通过三个明确来完成
1.明确源和目的
源:Inputstream Reader
目的:OutputStream Writer
2.操作的数据是否是纯文本
是:字符流
不是:字节流
3.当体系明确后,就要明确要使用的是哪个对象,通过设备来区分
源设备:内存,硬盘,键盘
目的设备:内存,硬盘,控制台