什么是IO流
IO:(input output stream):输入输出流。 针对文件中的内容进行的操作。读取文件中的内容和向文件中写入内容。
IO的分类
- 按照方向: 输入流和输出流
- 按照内容:字节流和字符流。
- 按照处理:处理流和节点流
常见流类有那些
字节输出流。
OutputStream它是所有字节输出流类的父类,而且它是一个抽象类,这里的实现使用比较多的是FileOutputStream. 所以后期如果想使用OutputStream流中功能,那么我们必须创建该抽象类的子类对象。
官网描述:
public abstract class OutputStream
extends Object
implements Closeable, Flushable
这个抽象类是表示字节输出流的所有类的超类。 输出流接收输出字节并将其发送到某个接收器。
需要定义OutputStream子类的应用OutputStream必须至少提供一个写入一个字节输出的方法。
创建OutputStream流的对象
@Test
public void test01() {//字节输出流
OutputStream os = null;
try {
//如果知道的文件名不存在,则自动创建。如果存在则不创建
File file = new File("a.txt");
//该流作用在的文件对象。 是否允许追加内容到文件中
os = new FileOutputStream(file, true);//多态,第二个参数添是否追加,默认为覆盖
String str = "想睡觉!!!";
os.write(str.getBytes());//把知道的字节数组写入到文件中。 str.getBytes():把字符串转换为字节数组
} catch (Exception o) {
o.printStackTrace();
} finally {
try {
if (!(os == null))
os.close();//关闭资源
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
字节输入流
InputStream它是字节输入流的父类,它也是一个抽象类,她下面的子类有FileInputStream.
官网描述:
public abstract class InputStream
extends Object
implements Closeable
这个抽象类是表示输入字节流的所有类的超类。
需要定义InputStream子类的应用InputStream必须始终提供一种返回输入的下一个字节的方法。
@Test
public void test02() throws IOException {//字节输入流。
InputStream is= null;//字节输入流对象: 作用 读取文件中的内容到程序端。
try {
File file=new File("a.txt");
is = new FileInputStream(file);
//InputStream流类中read方法。
int c;
while ((c=is.read())!=-1){//is.read()读取文件中内容,每次读取一个字节,把读取的内容返回。如果结尾返回-1
char ch=(char) c;
System.out.print(ch);
}
} catch (IOException e) {
throw new RuntimeException(e);
}finally {
is.close();
}
}
上述字节输入输出的综合案例
把某个目录下的文件复制到另一个目录下。
@Test
public void test03() throws IOException {//综合案例
OutputStream os= null;
InputStream is= null;
try {
os = new FileOutputStream(new File("c.txt"));
is = new FileInputStream(new File("a.txt"));
int c;
while ((c=is.read())!=-1){
os.write(c);
}
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
os.close();
is.close();
}
}
适合读取字节类型的文件:比如视频 音频 图片 等。
字符输出流
每次读取的单位是一个字符。Writer它是所有字符输出流的父类,它也是一个抽象类。它的子类常见的有FileWriter
官网描述
public abstract class Writer
extends Object
implements Appendable, Closeable, Flushable
用于写入字符流的抽象类。 子类必须实现的唯一方法是write(char [],int,int),flush()和close()。 然而,大多数子类将覆盖这里定义的一些方法,以便提供更高的效率,附加的功能或两者。
@Test
public void test04() throws IOException {//字符输出流
Writer w= null;//创建一个字符输出流对象。 参数:往哪个文件中写入字符内容。
try {
w = new FileWriter(new File("c.txt"));
w.write("hello");//把hello写入到c.txt中。
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
w.close();//关闭资源 必须关闭。
}
}
字符输入流
它操作流的单位为字符, Reader这个它是所有字符输入流的父类,它也是一个抽象类,它的常用子类FileReader
官网描述
public abstract class Reader
extends Object
implements Readable, Closeable用于读取字符流的抽象类。 子类必须实现的唯一方法是read(char [],int,int)和close()。 然而,大多数子类将覆盖这里定义的一些方法,以便提供更高的效率,附加的功能或两者。
@Test
public void test05() throws IOException {
Reader r= null;
try {
r = new FileReader(new File("c.txt"));//创建一个字符输入流对象, 参数:读取哪个文件中内容。
int c;
while ((c=r.read())!=-1){//返回读取到的一个字符。如果返回为-1 表示到尾部。
System.out.print((char) c);
}
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
r.close();
}
}
上述字符输入输出的综合案例
完成文件的复制功能。
@Test
public void test06() throws IOException {
Reader r= null;//字符输入流
Writer w= null; //字符输出流
try {
r = new FileReader(new File("c.txt"));
w = new FileWriter(new File("a.txt"));
int c;
while ((c=r.read())!=-1){
w.write(c);
}
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
r.close();
w.close();//后者先关
}
}
适合读取文本内容,不是字节类型的【视频 音频 图片 压缩文件等】。
字节输出缓存流
提高字节输出流的效率。BufferedOutputStream它是字节输出缓存流对象,它的作用在字节输出流上。
官网描述
public class BufferedOutputStream
extends FilterOutputStream该类实现缓冲输出流。 通过设置这样的输出流,应用程序可以向底层输出流写入字节,而不必为写入的每个字节导致底层系统的调用。
@Test
public void test07() throws IOException {
OutputStream os= null;
BufferedOutputStream bos= null;
try {
os = new FileOutputStream(new File("a.txt"));
bos = new BufferedOutputStream(os);//缓存流:作用在节点流上。理解为对节点流做了一层包装
os.write("zhangsan".getBytes());
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
bos.close();
os.close();//必须先关缓存流
}
}
字节输入缓存流
提高字节输入流的效率,作用在字节输入流对象上。BufferedInputStream它是字节输入缓存流对象
官网描述
public class BufferedInputStream
extends FilterInputStreamA BufferedInputStream为另一个输入流添加了功能,即缓冲输入和支持mark和reset方法的功能。 当创建BufferedInputStream时,将创建一个内部缓冲区数组。 当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次有多个字节。 mark操作会记住输入流中的一点,并且reset操作会导致从最近的mark操作之后读取的所有字节在从包含的输入流中取出新的字节之前重新读取。
@Test
public void test08() throws IOException {
InputStream is= null;
BufferedInputStream bis=null;
try {
is = new FileInputStream(new File("a.txt"));
bis= new BufferedInputStream(is);
int c;
while ((c=bis.read())!=-1){
char ch=(char) c;
System.out.print(ch);
}
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
bis.close();
is.close();
}
}
字节输入输出缓存流的综合案例
@Test
public void test09() throws IOException {
InputStream is= null;
BufferedInputStream bis= null;
OutputStream os= null;
BufferedOutputStream bos= null;
try {
is = new FileInputStream(new File("D:\\project\\day07\\src\\lx01.java"));
bis = new BufferedInputStream(is);
os = new FileOutputStream(new File("D:\\java\\java\\la.java"));
bos = new BufferedOutputStream(os);
int c;
while ((c=bis.read())!=-1){
bos.write((char)c);
}
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
bos.close();
os.close();
bis.close();
is.close();
}
}
缓存流比对普通流的效率
缓存流可以提高效率。
@Test
public void test09(){
long start = System.currentTimeMillis();
InputStream is= null;
BufferedInputStream bis= null;
OutputStream os= null;
BufferedOutputStream bos= null;
try {
//字节缓存输入流
File file = new File("D:\\rabbitmq视频\\13.rabbit工作模式-路由模式.mp4");
is = new FileInputStream(file);
bis = new BufferedInputStream(is);
//创建字节缓存输出流
File file1=new File("D:\\qy174.mp4");
os = new FileOutputStream(file1);
bos = new BufferedOutputStream(os);
int c;
while ((c=bis.read())!=-1){
bos.write(c);
}
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
try {
bos.close();
bis.close();
os.close();
is.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
long end = System.currentTimeMillis();
System.out.println("耗时:"+(end-start));
}
//1333
//204689
@Test
public void test03() {
long start = System.currentTimeMillis();
InputStream is = null;
OutputStream os = null;
try {
//输入流
File file = new File("D:\\rabbitmq视频\\13.rabbit工作模式-路由模式.mp4");
is = new FileInputStream(file);
//输出流
File file2 = new File("D:\\qy178.mp4");
os = new FileOutputStream(file2);
int c;
while ((c = is.read()) != -1) {
os.write(c);
}
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
try {
is.close();
os.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
long end = System.currentTimeMillis();
System.out.println("耗时:"+(end-start));
}
对象流
该流用来操作Java中的类对象的。把创建的java类对象以字节码的形式保存到文件中,或从文件中把字节码的对象读取到java内存中。
把内存中的java对象写入到磁盘文件|网盘的过程---序列化
把磁盘文件中的对象读取到java内存的过程--反序列化。
如何使用序列化
使用ObjectOutputStream对象字节输出流。调用writeObject(o);