文章目录
1、IO概述
1.1 什么是IO?
- i:input输入
- o: output 输出
1.2 为什么会有IO?
- 需要长久保存的数据都是以文件的形式存储的,存储在外边设备当中
- 内存有限,需要把数据读取到内存才行,需要io交互
1.3 java中如何实现IO功能?
- 通过流
- java流模型
1.4 流的分类
- 按照流向分(前提条件,以内存为参照)
①输入流 input
②输出流output - 按照数据类型分类
①字节流 : 一连串的01二进制数据 按字节传输 1B=8bit 0000 0000
②字符流: 一连串的字符序列,把它当做一种文化符号 , “你” “abc” ,“の”
1.5 抽象基类
- 字节输出流 OutputStream
- 字节输入流: InputStream
- 字符输出流:Writer
- 字符输入流:Reader
注意:
由这4个基类派生出的子类,其子类名都是以父类名作为后缀的
FileOutputStream 文件字节输出流
FileInputStream 文件字节输入流
1.6 什么时候该用什么流
- 不知道用啥的时候就用字节流 字节流是万能的
- 对于文本文件 我们选择用字符流
2、字节流
2.1 字节输出流
2.2 字节输出流具体子类
2.2.1FileOutputStream
例子:
package com.cskaoyan.bytestream.out;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* @description: 构造方法
* @author: songtao@cskaoyan.onaliyun.com
**/
public class Demo1 {
public static void main(String[] args) throws IOException {
// 方式一
File file = new File("a.txt");
FileOutputStream out = new FileOutputStream(file);
// 方式二
FileOutputStream fileOutputStream = new FileOutputStream("a.txt");
FileOutputStream outputStream = new FileOutputStream(new File("a.txt"));
}
}
3个write方法:
package com.cskaoyan.bytestream.out;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* @description: write方法
* @author: songtao@cskaoyan.onaliyun.com
**/
public class Demo2 {
public static void main(String[] args) throws IOException {
// 创建文件字节输出流对象
FileOutputStream out = new FileOutputStream("../day16_io01/a.txt");
// 第一种write方法 write(int b)
// writeSingle(out);
// 第二种write方法 write(byte[] b)
String s = "abc";
//writeMuti(out, s);
// 第三种write方法 write(byte[] b ,int off,int len)
byte[] bytes = s.getBytes();
out.write(bytes,0,bytes.length);
// 写数据
// 关闭资源 close
out.close();
}
private static void writeMuti(FileOutputStream out, String s) throws IOException {
byte[] bytes = s.getBytes();
out.write(bytes);
}
private static void writeSingle(FileOutputStream out) throws IOException {
out.write(97);
out.write(98);
}
}
package com.cskaoyan.bytestream.out;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* @description: 文件追加写入
* @author: songtao@cskaoyan.onaliyun.com
**/
public class Demo3 {
public static void main(String[] args) throws IOException {
FileOutputStream outputStream =
new FileOutputStream("../day16_io01/a.txt",true);
outputStream.write("def".getBytes());
outputStream.close();
}
}
package com.cskaoyan.bytestream.out;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* @description: 换行
* @author: songtao@cskaoyan.onaliyun.com
**/
public class Demo4 {
public static void main(String[] args) throws IOException {
FileOutputStream outputStream =
new FileOutputStream("../day16_io01/a.txt",true);
//outputStream.write("\n".getBytes());
//outputStream.write(System.lineSeparator().getBytes());
outputStream.write("\r".getBytes());
outputStream.write("def".getBytes());
outputStream.close(); }
}
package com.cskaoyan.bytestream.out;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* @description: 异常处理方式一
* @author: songtao@cskaoyan.onaliyun.com
**/
public class Demo5 {
public static void main(String[] args) {
FileOutputStream out = null;
try {
out = new FileOutputStream("../day16_io01/a.txt");
out.write(97);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if (out != null) {
out.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
package com.cskaoyan.bytestream.out;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* @description: 异常处理方式二
* @author: songtao@cskaoyan.onaliyun.com
**/
public class Demo6 {
public static void main(String[] args) {
try(FileOutputStream out = new FileOutputStream("../day16_io01/a.txt")) {
// 写数据
out.write("abc".getBytes());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
例子:
package com.cskaoyan.bytestream.out;
/**
* @description: AutoCloseable例子
* @author: songtao@cskaoyan.onaliyun.com
**/
public class Demo7 {
public static void main(String[] args) {
try(A a = new A()) {
a.test();
} catch (Exception e) {
e.printStackTrace();
}
}
}
class A implements AutoCloseable {
@Override
public void close() throws Exception {
System.out.println("close 方法执行了!!");
}
public void test(){
System.out.println("test 执行了!!");
}
}
2.2.2 BufferedOutputStream
package com.cskaoyan.bytestream.buff;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* @description:
* @author: songtao@cskaoyan.onaliyun.com
**/
public class Demo {
public static void main(String[] args) throws IOException {
//FileOutputStream out = new FileOutputStream("a.txt");
//BufferedOutputStream bo = new BufferedOutputStream(out);
BufferedOutputStream bufferedOutputStream =
new BufferedOutputStream(new FileOutputStream(new File("a.txt")));
bufferedOutputStream.write(97);
//bufferedOutputStream.flush();
// 对于包装流 我们只需关闭最外层的流
// close方法会执行flush方法
bufferedOutputStream.close();
}
}
注意:
①close方法会执行flush方法
②对于包装流 我们只需关闭最外层的流
2.2.3 装饰设计模式
不改变原有类的基础上去扩展新的功能
package com.cskaoyan.bytestream.decorator;
/**
* @description: 装饰设计模式例子
* @author: songtao@cskaoyan.onaliyun.com
**/
public class Demo {
public static void main(String[] args) {
MilkTea milkTea = new MilkTea();
milkTea.add();
System.out.println("-------------");
DecoratorA decoratorA = new DecoratorA();
decoratorA.setBeverage(milkTea);
decoratorA.add();
System.out.println("---------------");
DecoratorB decoratorB = new DecoratorB();
decoratorB.setBeverage(decoratorA);
decoratorB.add();
System.out.println("---------------");
DecoratorC decoratorC = new DecoratorC();
decoratorC.setBeverage(decoratorB);
decoratorC.add();
}
}
/*表示饮料 基类*/
abstract class Beverage {
// 添加小料
abstract void add();
}
/*奶茶类*/
class MilkTea extends Beverage {
@Override
void add() {
System.out.println("老板,来杯奶茶,加冰! ");
}
}
/*装饰器类*/
class Decorator extends Beverage {
public Beverage beverage;
public void setBeverage(Beverage beverage) {
this.beverage = beverage;
}
@Override
void add() {
beverage.add();
}
}
/*加珍珠*/
class DecoratorA extends Decorator {
@Override
void add() {
super.add();
addZz();
}
private void addZz() {
System.out.println("再加点珍珠!");
}
}
/*加椰果*/
class DecoratorB extends Decorator {
@Override
void add() {
super.add();
addYg();
}
private void addYg() {
System.out.println("再加点椰果!");
}
}
class DecoratorC extends Decorator {
@Override
void add() {
super.add();
addHd();
}
private void addHd() {
System.out.println("再加点红豆");
}
}
2.3 字节输入流
2.4 字节输入流具体子类
2.4.1 FileInputStream
例子:
public class Demo1 {
public static void main(String[] args) throws IOException {
// 创建字节输入流对象
FileInputStream fileInputStream = new FileInputStream(new File("a.txt"));
FileInputStream fileInputStream1 = new FileInputStream("a.txt");
}
}
package com.cskaoyan.bytestream.in;
import java.io.FileInputStream;
import java.io.IOException;
/**
* @description:
* @author: songtao@cskaoyan.onaliyun.com
**/
// workspace
public class Demo2 {
public static void main(String[] args) throws IOException {
// 创建字节输入流对象
FileInputStream in = new FileInputStream("../day16_io01/a.txt");
// 读取数据
//readSingle(in);
//readMuti(in);
byte[] bytes = new byte[1024];
int readCount = in.read(bytes, 0, bytes.length);
System.out.println(new String(bytes,0,readCount));
// close
in.close();
}
private static void readMuti(FileInputStream in) throws IOException {
byte[] bytes = new byte[1024];
int readCount = in.read(bytes);
// 字节数组转化成字符串
String s = new String(bytes, 0, readCount);
System.out.println(s);
}
private static void readSingle(FileInputStream in) throws IOException {
// read() 返回的是读取到的一个字节值
int readData = in.read();
System.out.println(((char) readData));
int readData2 = in.read();
System.out.println(((char) readData2));
int readData3 = in.read();
System.out.println(((char) readData3));
int readData4 = in.read();
System.out.println(((char) readData4));
int readData5 = in.read();
System.out.println((readData5));
}
}
package com.cskaoyan.bytestream.in;
import java.io.FileInputStream;
import java.io.IOException;
/**
* @description:
* @author: songtao@cskaoyan.onaliyun.com
**/
public class Demo3 {
public static void main(String[] args) throws IOException {
FileInputStream in = new FileInputStream("../day16_io01/a.txt");
byte[] bytes = new byte[4];
int readCount = in.read(bytes);
System.out.println(readCount);
System.out.println(new String(bytes));
int readCount2 = in.read(bytes);
System.out.println(readCount2);
System.out.println(new String(bytes,0,readCount2));
}
}
循环读
package com.cskaoyan.bytestream.in;
import java.io.FileInputStream;
import java.io.IOException;
/**
* @description: 循环读
* @author: songtao@cskaoyan.onaliyun.com
**/
public class Demo4 {
public static void main(String[] args) throws IOException {
FileInputStream in = new FileInputStream("../day16_io01/a.txt");
// 第一种方式
//readWhile(in);
// 单字节
//readWhile2(in);
// 字节数组的方式
int readCount;
byte[] bytes = new byte[1024];
while ((readCount = in.read(bytes)) != -1) {
System.out.println(new String(bytes,0,readCount));
}
// 关闭资源
in.close();
}
private static void readWhile2(FileInputStream in) throws IOException {
int readData;
while ((readData=in.read()) != -1) {
System.out.println(readData);
}
}
private static void readWhile(FileInputStream in) throws IOException {
while (true) {
int readData = in.read();
System.out.println(readData);
if (readData == -1) {
break;
}
}
}
}
2.4.2 BufferedInputStream
package com.cskaoyan.bytestream.buff;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
/**
* @description:
* @author: songtao@cskaoyan.onaliyun.com
**/
public class Demo2 {
public static void main(String[] args) throws IOException {
BufferedInputStream br =
new BufferedInputStream(new FileInputStream("a.txt"));
// 读数据
int readData = br.read();
System.out.println(((char) readData));
// close
br.close();
}
}
2.5 复制文件练习
package com.cskaoyan.bytestream.ex;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* @description: 复制文本文件
* @author: songtao@cskaoyan.onaliyun.com
**/
public class Demo1 {
public static void main(String[] args) throws IOException {
// 创建字节输入流对象
FileInputStream in = new FileInputStream("aa.txt");
// 创建字节输出流对象
FileOutputStream out = new FileOutputStream("bb.txt");
// 边读边写
// 按照单字节的方式去复制文件 耗时:18ms
//copy1(in, out);
// 字节数组的方式
copy2(in, out);
// close
in.close();
out.close();
}
private static void copy2(FileInputStream in, FileOutputStream out) throws IOException {
int readCount;
byte[] bytes = new byte[1024];
long start = System.currentTimeMillis();
while ((readCount = in.read(bytes)) != -1) {
out.write(bytes,0,readCount);
}
long end = System.currentTimeMillis();
System.out.println("耗时:" + (end - start) + "ms");
}
private static void copy1(FileInputStream in, FileOutputStream out) throws IOException {
long start = System.currentTimeMillis();
int readData;
while ((readData = in.read()) != -1) {
out.write(readData);
}
long end = System.currentTimeMillis();
System.out.println("耗时:" + (end - start) + "ms");
}
}
package com.cskaoyan.bytestream.ex;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* @description: 复制文本文件
* @author: songtao@cskaoyan.onaliyun.com
**/
public class Demo1 {
public static void main(String[] args) throws IOException {
// 创建字节输入流对象
FileInputStream in = new FileInputStream("D:\\mm.jpg");
// 创建字节输出流对象
FileOutputStream out = new FileOutputStream("mm.jpg");
// 边读边写
// 按照单字节的方式去复制文件 耗时:110ms
copy1(in, out);
// 字节数组的方式 耗时:1ms
//copy2(in, out);
// close
in.close();
out.close();
}
private static void copy2(FileInputStream in, FileOutputStream out) throws IOException {
int readCount;
byte[] bytes = new byte[1024];
long start = System.currentTimeMillis();
while ((readCount = in.read(bytes)) != -1) {
out.write(bytes,0,readCount);
}
long end = System.currentTimeMillis();
System.out.println("耗时:" + (end - start) + "ms");
}
private static void copy1(FileInputStream in, FileOutputStream out) throws IOException {
long start = System.currentTimeMillis();
int readData;
while ((readData = in.read()) != -1) {
out.write(readData);
}
long end = System.currentTimeMillis();
System.out.println("耗时:" + (end - start) + "ms");
}
}
package com.cskaoyan.bytestream.ex;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* @description: 复制文本文件
* @author: songtao@cskaoyan.onaliyun.com
**/
public class Demo1 {
public static void main(String[] args) throws IOException {
// 创建字节输入流对象
FileInputStream in = new FileInputStream("D:\\aa.mp4");
// 创建字节输出流对象
FileOutputStream out = new FileOutputStream("aa.mp4");
// 边读边写
// 按照单字节的方式去复制文件 耗时:8758ms
//copy1(in, out);
// 字节数组的方式 耗时:19ms
copy2(in, out);
// close
in.close();
out.close();
}
private static void copy2(FileInputStream in, FileOutputStream out) throws IOException {
int readCount;
byte[] bytes = new byte[1024];
long start = System.currentTimeMillis();
while ((readCount = in.read(bytes)) != -1) {
out.write(bytes,0,readCount);
}
long end = System.currentTimeMillis();
System.out.println("耗时:" + (end - start) + "ms");
}
private static void copy1(FileInputStream in, FileOutputStream out) throws IOException {
long start = System.currentTimeMillis();
int readData;
while ((readData = in.read()) != -1) {
out.write(readData);
}
long end = System.currentTimeMillis();
System.out.println("耗时:" + (end - start) + "ms");
}
}
得出结论
字节数组的方式效率更高 |