I/O框架

1、流的概念:内存与存储设备之间传输数据的通道

2、流的分类:

(1)方向(重点):

                                 输入流:将存储设备中的内容读入到内存中。

                                 输出流:将内存中的内容读入到存储设备中。

(2)单位:

                                 字节流:以字节为单位,可以读写所有数据。

                                 字符流:以字符为单位,只能读写文本数据。

(3)功能:

                                  节点流:具有实际传输数据的读写功能。

                                  过滤流:在节点流的基础上增强功能。

3、字节流:

字节流的父类

(1)InputStream(抽象类)

(2)OutputStream(抽象类)

字节节点流

(1)FileInputStream

(2)FileOutputStream

package com.t1.bytes;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class TestFileOutputStream {
	public static void main(String[] args) throws IOException {
		//1.输出字节流  OutputStream
		//2.输出字节节点流  具有实际传输数据的功能   (文件路径,boolean append)  true代表追加,不覆盖
		//路径正确,但是文件不存在,则会自动创建一个文件
		//绝对路径:"D:\\work\\target.txt"  必须存在!
		//相对路径:"Files\\target.txt" 与上一种形式 等价。。 相对于当前项目的路径下,寻找该路径和文件
		FileOutputStream fos = new FileOutputStream("Files\\target.txt");
		
//		String s = "你";
//		
//		byte[] bs = s.getBytes();
//		System.out.println(bs[0]+"\t"+bs[1]);
//		
//		fos.write(bs);
		
//		fos.write(65);  输出单个字节
//		
//		fos.write(66);
//		
//		fos.write(67);
//		
//		fos.write('D');
		
//		byte[] bytes = new byte[] {65,66,67,68,69,70,'G'};
		
//		fos.write(bytes);//一次输出一组字节!
		//字节数组   起始下标   长度
//		fos.write(bytes, 1, 3);
		
	}
}

字节过滤流

(1)BufferedOutputStream

(2)BufferedInputStream

(3)提供了IO效率,减少访问磁盘的次数。数据存放在缓冲区中。flush刷新缓冲区,提交数据

package com.qf.day31.t2.buff;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class TestBufferedOutput {
	public static void main(String[] args)throws IOException {
		//有参构造需要一个字节输出节点流
		//先创建字节输出节点流
		FileOutputStream fos = new FileOutputStream("Files\\buff.txt");
		//增强节点流
		BufferedOutputStream bos = new BufferedOutputStream(fos);
		//过滤流的write方法,是先写入到缓冲区数组里!
		bos.write('A');
		bos.write('B');
		
		bos.flush();//刷新缓冲区(将缓冲区的数据,一次性写入到文件中,并清空当前缓冲区)
		
		bos.write('E');
		bos.write('F');
//		bos.flush();
		bos.close();//级联的执行了flush(); 释放资源的同时,将缓冲器的数据一次性写入到文件里
		
		//---------------------------------------------------------
		FileInputStream fis = new FileInputStream("Files\\buff.txt");
//		BufferedInputStream bis = new BufferedInputStream(fis);
		byte[] bytes = new byte[100];
		fis.read(bytes);
		for (int i = 0; i < bytes.length; i++) {
			System.out.println((char)bytes[i]);
		}	
	}
}

4、字符编码

GBK  简体中文、扩展

UTF-8 针对Unicode的可变长度字符编码

GB2312 简体中文

当编码和解码方式不一致时,会出现乱码

5、字符流

字符流的父类

(1)Reader

(2)Writer

字符节点流

(1)FileWriter

(2)FileReader

字符过滤流

(1)BufferedWriter/PrintWriter

(2)BufferedReader

(3)支持写一行、读一行

6、字符节点流

桥转换流

(1)InputStreamReader

(2)OutputStreamWriter

(3)可将字节流转换为字符流,可设置编码方式(编码与解码要一致)

使用步骤

(1)创建节点流

(2)[创建过滤流,设置字符编码集]

(3)封装过滤流

(4)读写数据

(5)关闭流

package com.t2.chars;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;

public class TestConvertStream {
	public static void main(String[] args) throws Exception{
		//1.字节输出流
		OutputStream os = new FileOutputStream("Files\\convert.txt");//字节输出流
		
		//编码  2.转换为字符输出流
		OutputStreamWriter osw = new OutputStreamWriter(os,"UTF-8");//指定输出的数据 编码格式
		
		//3.包装字符过滤流
		PrintWriter pw = new PrintWriter(osw);

		pw.println("你好世界");
		
		pw.println("你好Java");
		
		pw.println("你好Web");
		
		pw.flush();
		
		pw.close();
		
		//--------------------------------
		//1.字节输入流
		InputStream is = new FileInputStream("Files\\convert.txt");
		//解码  2.转换为字符输入流
		InputStreamReader isr = new InputStreamReader(is,"UTF-8");
	
		//3.包装字符过滤流
		BufferedReader br = new BufferedReader(isr);
		
		while(true) {
			String s = br.readLine();
			if(s == null) {
				break;
			}
			System.out.println(s);
		}	
		br.close();	
	}
}

7、File

FileFilter接口

package com.t3.files;

import java.io.File;
import java.io.FileFilter;

public class TestListFiles {
	public static void main(String[] args) {
		File file = new File("D:\\BaiduNetdiskDownload");
		
//		String[] fileNames = file.list();//获取文件夹中的所有文件(包含文件夹)的名字  String类型
//		
//		for(String fname:fileNames) {
//			System.out.println(fname);
//		}
		
		File[] files = file.listFiles(new MyFilter());//获取文件夹中的所有文件(包含文件夹)的对象  File类型
		
		System.out.println(files.length);
		for(File f : files) {
					System.out.println(f.getName());
		}	
	}
}
class MyFilter implements FileFilter{

	@Override
	public boolean accept(File pathname) {//true就保存,false就过滤
		if(pathname.isFile()) {
			if(pathname.getName().endsWith(".doc")) {
				return true;//保存
			}
		}
		return false;//过滤
	}
}

 

 

 

你可能感兴趣的:(I/O框架)