IO流(字节流):
输入(Input)/ 输出(Output)
流:数据在设备间的传输称为流
IO流的分类 :
(输入输出都是相对于内存而言)
输入流:读数据(内存读入数据)
输出流:写数据(内存向磁盘写数据)
字节流:字节输入流和字节输出流
IO流的使用场景:
操作的是图片、视频、音频等二进制文件,使用字节流
如果不确定文件类型,优先使用字节流。字节流是万能的流
字节流:
字节输出流(写入数据)
使用字节输出流写数据的步骤:
创建字节输出流(FileOutputStream)对象,让字节输出流对象指向文件
调用字节输出流对象的写数据方法
释放资源(关闭此文件输出流并释放与此流相关联的任何系统资源)
输出流写数据的方法分类:
方法名 说明
void write(int b) 将指定的字节写入此文件输出流 一次写一个字节数据
void write(byte[] b) 将 b.length字节从指定的字节数组写入此文件输出流 一次写一个字节数组数据
void write(byte[] b, int off, int len) 将 len字节从指定的字节数组开始,从偏移量off开始写入此文件输出流 一次写一个字节数组的部分数据
代码示例:
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();
}
}
1.2 字节输出流写数据的异常处理
异常处理格式: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();
}
}
}
}
}
1.3 字节输入流(读取数据)
字节输入流,以实际存在文件路径作为参数,创建一个FileInputStream对象,该路径可以是String类型也可以是File类型
字节输入流读取数据的步骤:
创建字节输入流对象(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();
}
}
read一次读入一个字节数组:
import java.io.FileInputStream;
import java.io.IOException;
public class InputStreamDemo {
public static void main(String[] args) throws IOException {
//创建字节输入流对象
FileInputStream fis = new FileInputStream("myByteStream\\fos.txt");
byte[] bys = new byte[1024]; //临时存放读入内存的字节,一次读取1024字节
int len;//若文件读取完毕返回-1
//循环读取
while ((len=fis.read(bys))!=-1) {
//使用平台的默认字符集解码指定的字节子阵列来构造新的String对象,并打印
System.out.print(new String(bys,0,len));
}
//释放资源
fis.close();
}
}
1.4 利用字节输入和输出流复制文件
实现步骤:
根据数据源地址创建字节输入流对象
根据目的地地址创建字节输出流对象
读写数据,复制图片(一次读取一个字节数组,一次写入一个字节数组)
释放资源
实现代码:
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();
}
}
2.字符流
2.1 字符流写数据的5种方式
方法 描述
void write(int c) 写一个字符
void write(charl[] cbuf) 写入一个字符数组
void write(char[] cbuf, int off, int len) 写入字符数组的一部分
void write(String str) 写一个字符串
void write(String str, int off, int len) 写一个字符串的一部分
2.2 字符流读数据的两种方式
方法 描述
int read() —次读一个字符数据
int read(char[]cbuf) 一次读一个字符数组数据
练习 :
import java.io.*;
public class Character {
public static void main(String[] args) throws IOException {
// 字符流写数据
OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("C:\\data\\writer.txt"));
// 写一个字符,结果为:d
osw.write(100);
// 写入一个字符数组,结果为:def
char[] c={100,101,102};
osw.write(c);
//写入字符数组的一部分,结果为:ef
osw.write(c,1,2);
// 写一个字符串,结果为:落霞与孤鹜齐飞,秋水共长天一色
String s="落霞与孤鹜齐飞,秋水共长天一色";
osw.write(s);
// 写一个字符串的一部分,结果为:孤鹜齐飞
osw.write(s,3,4);
osw.close();
// 字符流读数据
InputStreamReader isr=new InputStreamReader(new FileInputStream("C:\\data\\将进酒.txt"),"UTF-8");
// —次读一个字符数据,这里的结果是将进酒这首诗
int ch;
while((ch=isr.read())!=-1){
System.out.print((char)ch);
}
//一次读一个字符数组的数据,结果还是将进酒这首诗
char[] cr=new char[1024];
int len;
while((len=isr.read(cr))!=-1){
System.out.print(new String(cr,0,len));
}
isr.close();
}
}
2.3 字符缓冲流
1、BufferedReader
从字符输入流读取文本。缓冲字符,以提供字符,数组和行的高效读取。
可以指定缓冲区大小,或者可以使用默认大小。默认值足够大,可用于大多数用途。
构造方法:BufferedReader(Reader in)
2、BufferedWriter
将文本写入字符输出流,缓冲字符、数组和字符串的高效写入
可以指定缓冲区大小,也可以接受默认大小。默认值足够大,可用于大多数用途。
构造方法:BufferedWriter (Writer out)
3、对字符缓冲流的练习
import java.io.*;
public class BufferTest {
public static void main(String[] args) throws IOException {
// BufferedWriter bw=new BufferedWriter(new FileWriter("C:\\data\\buffer.txt"));
// bw.write("万里悲秋常作客,百年多病独登台");
// bw.close();
BufferedReader br=new BufferedReader(new FileReader("C:\\data\\将进酒.txt"));
// readLine读取一行
// String s;
// while((s=br.readLine())!=null){
// System.out.println(s);
// }
// 一次读取一个字符
// int ch;
// while((ch=br.read())!=-1){
// System.out.print((char) ch);
// }
// 一次读取一个字符数组
char[] c=new char[1024];
int len;
while((len=br.read(c))!=-1){
System.out.print(new String(c,0,len));
}
br.close();
}
}