一:IO流
1.基本原理:
数据流(Stream)是指数据通信的通道。
2.分类:
按流向分:
输入流:程序从数据源读取数据的流
输出流:程序向数据源写入数据的流
按数据传输单位分:
字节流:以字节为单位传输数据的流
字符流:以字符为单位传输数据的流
按功能分:
节点流:用于直接操作目标设备的流
处理流:是对一个已存在的流的连接和封装,通过对数据的处理为程序提供更为强大、灵活的读写功能。
| 字节流 | 字符流 |
输入流 | InputStream | Reader |
输出流 | OutputStream | Writer |
3.IO流四个抽象类的重要方法:
InputStream: read(xx)读取字节系列方法
OutputStream: write(xx) 写入字节系列方法
Reader: read(xx)读取字符系列方法
Writer:write(xx)写入字符系列方法
4.文件字节流与文件字符流
文件字节流:FileInputStream和FileOutputStream
文件字符流:FileReader和FileWriter
1) FileInputStream类
构造方法
FileInputStream(File file)
FileInputStream(String name)
read() 从输入流读取下一个数据字节。
read(byte[] b) 读取一定数量的字节从输入流并存入缓冲区阵列 b。
read(byte[] b, int off, int len) 读到 len字节从输入流读入字节数组数据。
close() 关闭此输入流并释放与流关联的任何系统资源。
例题:字节流读取文件内容
package stream;
import java.io.*;
public class FileInputStreamDemo {
public static void main(String[] args) {
File f=new File("c:"+File.separator+"test.txt");
InputStream input=null;
try {
input=new FileInputStream(f);
/**
* 每次读取一个字节数据
int data=0;
while((data=input.read())!=-1){
byte b=(byte)data;
byte[] array=new byte[1];
array[0]=b;
String str=new String(array);
System.out.print(str);
}**/
byte[] b=new byte[1024]; // 自定义缓冲区(“卡车”)
int len=input.read(b); // 读取数据到byte[]数组中,返回读入到byte[]数组中的字节数
System.out.println("读取的内容是:"+new String(b,0,len));
}catch(Exception e) {
e.printStackTrace();
}finally{
try {
input.close(); // 关闭流
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
运行结果:
2) FileOutputStream类
构造方法
FileOutputStream (File file)
FileOutputStream(String name)
FileOutputStream(String name,boolean append)
1、前两种构造方法在向文件写数据时将覆盖文件中原有的内容
2、创建FileOutputStream实例时,如果相应的文件并不存在,则会自动创建一个空的文件
close() 关闭此输出流并释放与此流关联的任何系统资源。
flush() 刷新输出流,使缓存数据被写出来。
write(byte[] b) 写 b.length字节从指定的字节数组的输出流。
write(byte[] b, int off, int len) 写 len字节指定字节数组中的偏移 off开始到输出流。write(int b) 将指定的字节写入该输出流中。
例题:字节流向文件中写入内容
package stream;
import java.io.*;
public class FileOutputStreamDemo {
public static void main(String[] args) {
File f=new File("c:"+File.separator+"test.txt");
OutputStream out=null;
try {
out=new FileOutputStream(f,true); // 开启追加模式
out.write("中华人民共和国".getBytes()); // 直接写入一个字节数组
String data="大宋王朝";
byte[] b=data.getBytes();
out.write(b,0,4); // 使用三参的write(xxx)方法进行写入
System.out.println(f.length());
System.out.println("写入成功!");
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
运行结果:
3) FileReader类
构造方法
FileReader(File file)
在给定从中读取数据的 File 的情况下创建一个新FileReader
FileReader(String fileName)
在给定从中读取数据的文件名的情况下创建一个新 FileReader。
例题:字符流读取文件内容
package stream;
import java.io.*;
public class FileReaderDemo {
public static void main(String[] args) {
Reader r=null;
try {
r=new FileReader("c:"+File.separator+"test.txt");
int data=r.read(); // 读取一个字符
char c=(char)data; // 转换成字符
System.out.println("第一次读取:"+c);
char[] cbuf=new char[1024]; // 自定义缓冲区
int len=r.read(cbuf); // 读取数据放入缓冲区中,返回存入缓冲区中的字符个数
System.out.println("第二次读取:"+new String(cbuf,0,len));
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
r.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
运行结果:
4) FileWriter类
FileWriter(File file)
根据给定的 File 对象构造一个 FileWriter 对
FileWriter(File file, boolean append)
根据给定的 File 对象构造一个 FileWriter 对象。
FileWriter(String fileName)
根据给定的文件名构造一个 FileWriter 对象。
FileWriter(String fileName, boolean append)
根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。
例题:字符流向文件中写入内容
package stream;
import java.io.*;
public class FileWriterDemo {
public static void main(String[] args) {
Writer w=null;
try {
w=new FileWriter("c:\\test.txt");
w.write("你好,Java".toCharArray()); // 写入字符数组
w.write("ABCDEFG"); // 写入字符串
w.write('a'); // 写入单个字符
w.flush(); // 将缓冲区中的写入内容,刷到磁盘上
System.out.println("写入成功!");
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
w.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
运行结果: