在Java中,通过不同的输入输出设备之间的数据传输抽象表述为"流",程序允许通过流的方式与输入输出设备进行数据传输。在Java中的"流"都在java.io包中,称为IO流。
IO流
按照操作数据的不同,可以分为字节流和字符流
按照数据传输方向的不同可分为输入流和输出流
字节流:在计算机中,无论是文本、图片、视频、音频都是以二进制(字节)形式存在,IO流中针对字节的输入输出提供了
一系列的流,统称为字节流,根据数据的传输方向,可分为字节输入流和字节输出流
JDK提供了两个抽象类InputStream和OutputStream,它们是字节流的顶级父类,所有的字节输入流都继承自InputStream
所有的字节输出流都继承自OutputStream
InputStream字节输入流
案例:
import java.io.FileInputStream;
import java.io.InputStream;
public class Demo1 {
public static void main(String[] args) throws Exception {
// 创建一个文件字节输入流
InputStream fileInputStream = new FileInputStream("D:/test.txt");
int b = 0;
while(true){
b = fileInputStream.read();
if(b == -1){
break;
}
System.out.println(b);
}
// IO流用完了一定要关闭不然会一直开着造成资源浪费
fileInputStream.close();
}
}
```
OutputSream字节输出流
案例:
package com.sj.cn3;
import java.io.FileOutputStream;
import java.io.OutputStream;
public class Demo2 {
public static void main(String[] args) throws Exception {
// 文件字节输出流
// FileOutputStream会在项目根目录下新建一个test1.txt
OutputStream outputStream = new FileOutputStream("D:/test1.txt");
String str = "张三";
byte[] bytes = str.getBytes();
for(int i = 0 ; i < bytes.length ; i ++){
outputStream.write(bytes[i]);
}
outputStream.close();
}
}
在上面代码中,修改代码可以往文件里面追加内容
import java.io.FileOutputStream;
import java.io.OutputStream;
public class Demo3 {
public static void main(String[] args) throws Exception {
// 文件字节输出流
// FileOutputStream会在项目根目录下新建一个test1.txt true参数表示可追加
OutputStream outputStream = new FileOutputStream("D:/test1.txt",true);
String str = "软件开发工程师";
byte[] bytes = str.getBytes();
for(int i = 0 ; i < bytes.length ; i ++){
outputStream.write(bytes[i]);
}
outputStream.close();
}
}
字节流的缓冲区:
案例:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
public class Demo5 {
public static void main(String[] args) throws Exception {
// 创建字节文件输入流河输出流
InputStream is = new FileInputStream("D:/test.txt");
OutputStream os = new FileOutputStream("D:/tar/test.txt");
// 缓冲区
byte[] buff = new byte[1024];
// 定义一个变量len,用于记录每次读取的一个字节
int len;
long beginTime = System.currentTimeMillis();
// 通过while循环每次读取相关字节写入
while((len = is.read(buff))!=-1){
// 读取buff缓存区中的数据从0开始到len结束
os.write(buff,0,len);
}
long endTime = System.currentTimeMillis();
System.out.println("拷贝文件所用时间为:"+(endTime-beginTime)+"毫秒");
is.close();
os.close();
}
}
字符流:
字符流顶级父类,Reader和Writer Reader是字符输入流从某个源设备读取字符 Writer是字符输出流向某个目标写入字符
字符流获取文件中的数据:
案例:
import java.io.FileReader;
public class Demo1 {
public static void main(String[] args) throws Exception {
FileReader fileReader = new FileReader("D:/read.txt");
int len;
while((len=fileReader.read())!= -1){
System.out.print((char) len);
}
fileReader.close();
}
}
字符流缓冲对象
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
public class Demo2 {
public static void main(String[] args) throws Exception{
FileReader reader = new FileReader("D:/read.txt");
BufferedReader br = new BufferedReader(reader);
FileWriter fileWriter = new FileWriter("D:/read2.txt");
BufferedWriter bw = new BufferedWriter(fileWriter);
String str;
while((str=br.readLine())!=null){
bw.write(str+"\n");
bw.newLine();
}
br.close();
bw.close();
}
}
转换流
字节流和字符流之间转换
案例:
import java.io.*;
public class Demo3 {
public static void main(String[] args) throws Exception{
// 创建字节输入流
FileInputStream fileInputStream = new FileInputStream("D:/read.txt");
// 将字节输入流转换成字符输入流
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream);
// 创建字符流对象缓冲区
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
FileOutputStream fileOutputStream = new FileOutputStream("D:/read2.txt");
// 将字节输出流转换成字符输出流
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream);
// 创建字符流对象缓冲区
BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
String str;
while((str=bufferedReader.readLine())!=null){
bufferedWriter.write(str);
}
bufferedWriter.close();
bufferedReader.close();
}
}
```