字节流:
主要有InputStream和OutputStream作为基类
字符流:
主要有Reader和Writer作为基类
字节流跟字符流的用法几乎一样,区别在两者操作数据单元不同,字节流操作数据单元是8位的字节,字符流操作16位的字符。
Java的IO流设计40多类,基本都是从以上4个抽象基类派生的。
开发步骤:
1创建字节文件输入流对象
2读数据
3释放资源
文件的字节输入流(InputStream)public FileInputStream(String name)
方法:
1public int read():从输入流中读取一个字节
2public int read(byte[] b):一次读取一个字节数组,最多读取b.length个字节的数据并存储在字节数组b中
3public int read(byte[] b, int off, int len):从输入流中最多读取len个字节的数据,并存储在数组b中。每次的存储都是从off位置开始的,返回实际读取的字节长度
文件的字节输出流(OutputStream)public FileOutputStream(String name)
方法:
1public void write():写入一个字节到输出流中
2public void write(byte[] b/char[] buf):一次写入一个字节数组,最多写入b.length个字节的数据输出到输出流中
3)public void write(byte[] b/char[] buf, int off, int len):从off位置开始的,实际读取的字节长度的字节数组或者字符数组,最多输出len个字节的数据到输出流中。
字符输入流(Reader)
方法:
1public int read():从输入流中读取一个字节
2public int read(char[] cbuf):一次读取一个字节数组,最多读取b.length个字节的数据并存储在字符数组cbuf中
3public int read(char[] cbuf, int off, int len):从输入流中最多读取len个字节的数据,并存储在字符数组cbuf中。每次的存储都是从off位置开始的,返回实际读取的字节长度
字符输出流(write)
方法:
1public void write():写入一个字节到输出流中
2public void write(byte[] b/char[] buf):一次写入一个字节数组,最多写入b.length个字节的数据输出到输出流中
3public void write(byte[] b/char[] buf, int off, int len):从off位置开始的,实际读取的字节长度的字节数组或者字符数组,最多输出len个字节的数据到输出流中。
便捷类:
字符转换输入:FileReader(String Filename)
字符转化输出:FileWriter(String Filename)
字节输出流
代码示例:
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class OutPutDemo {
public static void main(String[] args) throws IOException {
//创建输出流对象fos,参数可以是String或者是File对象
OutputStream fos = new FileOutputStream("day11_exercise\\aaa.txt");
byte[] bt = {97,98,99,100,101,102,103,104};
int a = 97;
//写数据的三种方法
//file.write(a);
//file.write(bt);
fos.write(bt, 0, 5);
//释放资源
fos.close();
}
}
字节输出流写数据实现换行和不覆盖写入:
import java.io.FileOutputStream;
import java.io.IOException;
public class OutputStreamDemo {
public static void main(String[] args) throws IOException {
//创建字节输出流对象,第二个参数传入true可以实现数据追加输入
FileOutputStream fos = new FileOutputStream("day11_exercise\\fos.txt",true);
/* 写数据实现换行
- windows:\r\n
- linux:\n
- mac:\r
*/
for (int i = 0; i < 10; i++) {
//必须以字节类型写入调用getBytes方法,返回的是一个byte型数组
fos.write("hello".getBytes());
fos.write("\r\n".getBytes());
}
//释放资源
fos.close();
}
}
字节输出流写数据的异常处理
异常处理格式:try-catch-finally(被finally控制的语句一定会执行,用于实现资源释放 )
try{
可能出现异常的代码;
}catch(异常类名 变量名){
异常的处理代码;
}finally{
执行所有清除操作;
}
示例代码:
public class FileOutputStreamDemo04 {
public static void main(String[] args) {
//加入finally来实现释放资源
FileOutputStream fos = null;
try {
fos = new FileOutputStream("myByteStream\\fos.txt");
fos.write("hello".getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
if(fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
字节输入流(读取数据)
字节输入流读取数据的步骤:
创建字节输入流对象(FileInputStream)
调用字节输入流对象的读数据方法
释放资源
read一次读取一个字节:
import java.io.FileInputStream;
import java.io.IOException;
public class InputDemo {
public static void main(String[] args) throws IOException {
//创建一个字节输入流对象fis
FileInputStream fis = new FileInputStream("day11_exercise\\aaa.txt");
int b ;//用于记录读入内存的字节
//若文件读取完毕会返回-1
while((b = fis.read()) != -1){
System.out.println((char)b);
}
//释放资源
fis.close();
}
}
利用字节输入和输出流复制文件
import java.io.*;
public class copyDemo {
public static void main(String[] args) throws IOException {
File file = new File("E:\\网络图片\\05.jpg");
//创建输入流对象
FileInputStream fis = new FileInputStream(file);
//创建输出流对象
FileOutputStream fos = new FileOutputStream("day11_exercise\\" + file.getName());
int len;
byte[] bys = new byte[1024];
//一次读入一个字节数组
while((len = fis.read(bys))!=-1){
//一次写入一个字节数组
fos.write(bys);
}
//释放资源
fis.close();
fos.close();
}
}