1. IO流的分类:
按流向分类:输入流、输出流
按操作对象分类: 字节流、字符流
按功能分类: 节点流、处理流
IO流的设计模式为装饰设计模式;
节点流为最“原生态”的流,实现了流的基本功能,需待操作的数据创建对象,如File(文件)、Byte[](字节数组)、Char[](字符数组)等
处理流包装节点流,增强其功能(如处理编码问题防止乱码、使用缓冲流增强传输效率等),其处理的是节点流,所以需用节点流对象创建处理流对象
IO 流对象继承关系
其他常用与流有关的对象:
2.字节流和字符流:
IO 的体系。所具备的基本功能就有两个:读 和 写。
1,字节流
InputStream(读),OutputStream(写)。
2,字符流:
Reader(读),Writer(写)。
基本的读写操作方式:
因为数据通常都以文件形式存在。
所以就要找到 IO 体系中可以用于操作文件的流对象。
通过名称可以更容易获取该对象。
因为 IO 体系中的子类名后缀绝大部分是父类名称。而前缀都是体现子类功能的名字。
字节流和字符流的区别:
1,字节流读取的时候,读到一个字节就返回一个字节。
字符流使用了字节流读到一个或多个字节(中文对应的字节数是两个,在 UTF-8
码表中是 3 个字节)时。先去查指定的编码表,将查到的字符返回。
2,字节流可以处理所有类型数据,如图片,mp3,avi。
而字符流只能处理字符数据。
结论: 只要是处理纯文本数据,就要优先考虑使用字符流。除此之外都用字节流。
3.常用IO流:
分类
字节流
InputStream
FileInputStream 文件流 能处理二进制文件也能处理文本
BufferedInputStream缓冲流 能处理二进制文件也能处理文本
BufferedInputStream bis=new BufferedInputStream(new FileInputStream(file1))
OutputStream
FileOutputStream 文件流 能处理二进制文件也能处理文本
BufferedOutputStream 缓冲流 能处理二进制文件也能处理文本
BufferedOutputStream bis=new BufferedOutputStream(new FileOutputStream(file2))
PrintStream
字符流
Reader
FileReader文件流 只能处理文本文件
BufferedReader 缓冲流 只能处理文本文件
BufferedReader br=new BufferedReader(new FileReader(name))
readLine()方法
Writer
FileWriter 文件流 只能处理文本文件
BufferedWriter 缓冲流 只能处理文本文件
PrintWriter 只能处理文本文件
PrintWriter pw=new PrintWriter(name)
println()方法
转换流(字节到字符)(构造方法第二个参数编码)
InputStreamReader 将InputStream转化为Reader
OutputStreamWriter OutputStream转化为Writer
二级制处理流
DataInputStream
DataOutputStresam
4.几个代码
1
package cn.filedemo;
import java.io.File;
import java.io.IOException;
public class FileDemo {
//1.创建文件用自己的FileDemo对象方法判断file
public void create(File file){
if (!file.exists()) {
try {
file.createNewFile();
System.out.println("文件已创建");
} catch (IOException e) {
e.printStackTrace();
}
}
}
//2.查看文件相关信息
public void showFileInfo(File file){
if(file.exists()){
//如果文件不存在,则查看其信息
if(file.isFile()){
//是文件
System.out.println("该文件名:"+file.getName());
System.out.println("相对路径:"+file.getPath());
System.out.println("绝对路径:"+file.getAbsolutePath());
System.out.println("文件大小"+file.length()+"字节");
}
if(file.isDirectory()){
System.out.println("次文件是目录");
}
}else {
System.out.println("文件不存在");
}
}
// 输出的信息:
// 该文件名:test.txt
// 相对路径:d:\临时\test.txt
// 绝对路径:d:\临时\test.txt
// 文件大小1字节
// 1.2 默认就是当前Java的地方
/*
* File file=new File("test.txt");
* 该文件名:test.txt
* 相对路径:test.txt
* 绝对路径:D:\java\java\07.IO流\test.txt
* 文件大小0字节
*
*/
// 删除文件
public void delete(File file2){
if (file2.exists()) {
file2.delete();
System.out.println("文件已删除!");
}
}
public static void main(String[] args) {
FileDemo fileDemo= new FileDemo();
File file=new File("d:\\临时\\test.txt");
//fileDemo.create(file);//创建文件
fileDemo.showFileInfo(file);//查看文件相关信息
File file2=new File("D:\\java\\java\\07.IO流\\test.txt");
fileDemo.delete(file2);//删除文件
}
}
2
package cn.InputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
//读取文件D:\临时\test.txt中的内容
public class FileInputStreamDemo {
public static void main(String[] args) {
FileInputStream fis = null;
try {
// 输入流FileIputStream
fis = new FileInputStream("d:\\临时\\test.txt");
try {
//可以读到的字节数
System.out.println(fis.available());
} catch (IOException e1) {
e1.printStackTrace();
}
//(1)借助输入流的read()方法去读
// int data;
// try {
// while ((data=fis.read())!= -1) {
// System.out.print((char)data);
//
// }
// } catch (IOException e) {
// e.printStackTrace();
// }
//(2)借助输入流read(byte[])去读
byte[]b = new byte[1024];//建议放File.available();
int data;
try {
data=fis.read(b);
for (int i = 0; i < data; i++) {
System.out.print((char)b[i]);
}
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
try {
//关闭输入流
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
3
package cn.outputstream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStreamTest {
public static void main(String[] args) {
File file=new File("D:\\临时\\hello.txt");
FileOutputStream fileout=null;
try {
fileout=new FileOutputStream(file);
String str="好好学习Java";
//将字符串打撒成一个字节数组
byte[] words =str.getBytes();
try {
fileout.write(words, 0, words.length);//从0开始写
System.out.println("hello文件已被更新!");
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally{
try {
fileout.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
4
package com.cmy.character;
//字符输入
import java.io.FileReader;
public class ReaderTest {
public static void main(String[] args) throws Exception {
FileReader reader=new FileReader("file/强哥.txt");
StringBuilder sb=new StringBuilder();
char chars[]=new char[1024];//每次缓冲1024个字符
int data=0;
while((data=reader.read(chars))!=-1){
String str=new String(chars);
sb.append(str);
}
System.out.println(sb);
reader.close();
}
}
5
package com.cmy.character;
import java.io.FileWriter;
import java.io.IOException;
public class WriterTest {
public static void main(String[] args) throws IOException {
FileWriter fw=new FileWriter("file/强哥.txt");
String str="我叫上山间的风";
fw.write(str);
fw.close();
}
}
6
package com.cmy.buffered;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
public class ReaderTest {
public static void main(String[] args) throws Exception {
//无需用户手动声明缓冲区数组,在BufferedXXX中自带缓冲区
BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream("file/强哥.txt")));
//按照行的终止符:换行符
String readLine = br.readLine();
System.out.println(readLine);
}
}
7
package com.cmy.buffered;
import java.io.FileOutputStream;
import java.io.PrintWriter;
public class WriterTest {
public static void main(String[] args) throws Exception {
PrintWriter pw=new PrintWriter(new FileOutputStream("file/强哥.txt"));
pw.println("我叫强哥");
pw.println("我叫程程");
pw.flush();//强制刷新缓冲区中的字符或字节
pw.close();
}
}