今天整理和回顾了java中的流模型的使用方法,针对一些练习题,编辑了针对性的代码,解决问题,加深了对流模型的理解和记忆
流模型
主要目的:屏蔽具体实现的区别,使用统一的方法进行编程
- 输入和输出
- 字节和字符
- 节点和过滤 装饰模式
- BIO NIO AIO
字节流
父类InputStream和OutputStream
一次一字节的操作方式,一般用于声音、图像、视频之类的二进制文件
InputStream
方法: - read():int -1 - read(byte[]):int -1 - close():void - FileInputStream主要用于操作文件 - System.in 主要用于接收用户输入
OutputStream
方法: - write(int):void - write(byte[],int,int):void - close():void - FileOutputStream主要用于操作文件 - newFileOutputStream(“文件名称”)采用文件覆盖的方式操作 - new FileOutputStream(“文件名称”,boolean是否采用追加操作) - System.out和System.err 用于输出到标准输出设备
样例
文件的拷贝
public class Test1 {
public static void main(String[] args) throws IOException {
//try/resource的写法,会自动执行关闭操作,但是要求实现closeable接口
try (OutputStream os = new FileOutputStream("data.txt",true);
InputStream is = new FileInputStream("Test1.java");) {
int kk;
while ((kk = is.read()) > -1) {
os.write(kk);
}
}
}
//由于是一次读取一字节的操作,所以在操作输出时会有问题,但是文件拷贝不会有任何问题
}
上面的方法采用的是一次一字节的操作方法,效率较低,可以考虑引入byte[]缓存的方式提高执行效率
public class Test01 {
public static void main(String[] args) throws IOException {
try (OutputStream os = new FileOutputStream("text.txt");
InputStream is = new FileInputStream("Test01.java")) {
int kk;
byte[] a =new byte[8192];
while ((kk = is.read(a)) > -1) {
String ss = new String(a,0,kk);
System.out.println(ss);
os.close();
}
}
}
}
复杂样例
- 实现文件夹的拷贝和移动
- 文件夹的深度无法提前预知,所以这里采用递归调用的方式进行操作
public class Test02 {
private static String source;
private static String target;
public static void main(String[] args) {
source = "G:/Users/52255/Desktop/PS";
target = "G:/";
}
public static void copy(File file) throws IOException {
if (file != null && file.exists()) {
if (file.isDirectory()) {
String path = file.getAbsolutePath();
String newpath = path.replace(source, target);
File tmp = new File(newpath);
if (!tmp.exists())
tmp.mkdirs();
File[] fs = file.listFiles();
if (fs != null && fs.length > 0)
for (File temp : fs)
copy(temp);
}else if(file.isFile()){
String path = file.getAbsolutePath();
String newpath = path.replace(source, target);
try(
InputStream is = new FileInputStream(file);
OutputStream os = new FileOutputStream(newpath)
){
byte[] buffer = new byte