1. IO 流原理及流的分类 614
1.1 Java IO 流原理
1. I/O是Input/Output的缩写, I/O技术是非常实用的技术,用于处理数据传输。如读/写文件,网络通讯等。
2. Java程序中, 对于数据的输入/输出操作以”流(stream)" 的方式进行。
3. java.io包下提供了各种"流”类和接口,用以获取不同种类的数据,并通过方法输入或输出数据
4.输入input:读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中。
5.输出output:将程序(内存)数据输出到磁盘、光盘等存储设备中
1.2 流的分类
按操作数据单位不同分为:字节流(8 bit)二进制文件,字符流(按字符)文本文件
按数据流的流向不同分为:输入流,输出流
按流的角色的不同分为:节点流,处理流/包装流
1) Java的IO流共涉及40多个类,实际上非常规则,都是从如上4个抽象基类派生的。
2)由这四个类派生出来的子类名称都是以其父类名作为子类名后缀。
2. IO 流体系图-常用的类 614
2.1 IO 流体系图
2.2 文件 VS 流
3. InputStream:字节输入流 615
3.1 InputStream抽象类是所有类字节输入流的超类
3.1.1 InputStream常用的子类 615
FileInputStream:文件输入流
BufferedInputStream:缓冲字节输入流
ObjectInputStream:对象字节输入流
4. FileInputStream和FileOutputStream
4.1 案例演示FileInputStream:文件输入流 615
请使用 FileInputStream 读取 hello.txt 文件,并将文件内容显示到控制台.
代码在com.stulzl.inputstream_fileInputstream.包中
FileInputStream_
package com.stulzl.inputstream_fileInputstream;
import org.junit.jupiter.api.Test;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
//FileInputStream:文件输入流 615
//请使用 FileInputStream 读取 hello.txt 文件,并将文件内容显示到控制台.
public class FileInputStream_ {
public static void main(String[] args) {
}
//演示 FileInputStream 的使用(字节输入流 文件--> 程序)
//单个字节的读取,效率比较低
@Test
public void readFile01(){
String filePath = "e:\\hello.txt";
int readData = 0;//用来接收read()读取数据的返回值
FileInputStream fileInputStream = null;
try {
//创建 FileInputStream 文件输入流对象,用于读取文件
fileInputStream = new FileInputStream(filePath);
//从该输入流读取一个字节的数据。 如果没有输入可用,此方法将阻止。
//如果返回-1 , 表示读取完毕
//解释循环读取,read()每次读取一个数据都会返回一个int类型的值,读完返回-1
//我们将返回值放入readData中,用来当作循环判断条件
while((readData = fileInputStream.read())!=-1){//read()方法一次读取一个字节数据
System.out.print((char)readData);//类型转换
}
} catch (IOException e) {
e.printStackTrace();
}finally {
//关闭文件流释放资源
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//使用read(byte[] b)提高效率
@Test
public void readFile02(){
String filePath = "e:\\hello.txt";
//定义一个字节数组
byte[] buf = new byte[8];//一次可以读8个字节
int readLen = 0;//用来存储read(buf)方法读取数据的返回值
FileInputStream fileInputStream = null;
try {
//创建 FileInputStream 对象,用于读取 文件
fileInputStream = new FileInputStream(filePath);
//从该输入流读取最多 b.length 字节的数据到字节数组。 此方法将阻塞,直到某些输入可用。
//如果返回-1 , 表示读取完毕
//如果读取正常, 返回实际读取的字节数(意思是,要读取的数据 //要读取的数据>buf数组的大小(8个),最多返回8
//这个循环读取,是将数据读到数组buf中了,第一次读8个,第二次读3个数据
while((readLen = fileInputStream.read(buf))!=-1){//read()方法一次读取一个字节数据
//这里解释一下new String(buf,0,readLen),String系统给String提供的其中一个构造器
//String s4 = new String(charD a,int startIndex,int count)
//功能传一个数组,位置,长度,然后将这个数组变成字符串
System.out.print(new String(buf,0,readLen));//显示
}
} catch (IOException e) {
e.printStackTrace();
}finally {
//关闭文件流释放资源
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
4.2 案例演示 FileOutputStream:字节输出流 616
要求: 请使用 FileOutputStream 在 a.txt 文件,中写入 “hello,world”. 如果文件不存在,会创建文件(注意:前提是目录已经存在.)
代码在com.stulzl.outputstream_fileoutputstream.包中
FileOutputStream_01
import org.junit.jupiter.api.Test;
import java.io.FileOutputStream;
import java.io.IOException;
// 案例演示 FileOutputStream:字节输出流 616
//要求: 请使用 FileOutputStream 在 a.txt 文件,中写入 “hello,world”.
// 如果文件不存在,会创建文件(注意:前提是目录已经存在.)
public class FileOutputStream_01 {
public static void main(String[] args) {
}
//演示使用 FileOutputStream 将数据写到文件中
@Test
public void writeFile(){
//创建一个FileOutputStream对象
String filePath = "e:\\a.txt";
FileOutputStream fileOutputStream = null;//定义一个FileOutputStream类型
try {
//得到FileOutputStream对象
//1. new FileOutputStream(filePath) 创建方式,当写入内容是,会覆盖原来的内容
//2. new FileOutputStream(filePath, true) 创建方式,当写入内容是,是追加到文件后面
//fileOutputStream = new FileOutputStream(filePath);
fileOutputStream = new FileOutputStream(filePath, true);
//写入一个字节
//fileOutputStream.write('H');
//写入一个字符串
String str = "hello,world!";
//这里说明一下str.getBytes()方法可以将一个字符串转成一个字节数组,重点哦
//fileOutputStream.write(str.getBytes());
//写入一个字符串的另一种方法,写入想要长度的字符串
fileOutputStream.write(str.getBytes(),0,5);//即 只写入hello
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
4.3 文件的拷贝 617
编程完成图片 的拷贝.
代码在com.stulzl.filecopy_.包中
FileCopy_
package com.stulzl.filecopy_;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
//文件拷贝 617
public class FileCopy_ {
public static void main(String[] args) {
//完成文件拷贝,将e:\\guidao.jpg拷贝到d:\\
//思路
//1. 创建文件的输入流 , 将文件读入到程序
//2. 创建文件的输出流, 将读取到的文件数据,写入到指定的文件
String srcFilePath = "e:\\guidao.jpg";
String destFilePath = "d:\\guidao.jpg";
//定义者两个类型
FileInputStream fileInputStream = null;
FileOutputStream fileOutputStream = null;
try {
fileInputStream = new FileInputStream(srcFilePath);
fileOutputStream = new FileOutputStream(destFilePath);
byte[] buf = new byte[1024];//创建一个临时字节数组
int readLen = 0;
//读取文件资源,即将图片资源使用FileInputStream输入流-->程序
while((readLen=fileInputStream.read(buf))!=-1){//一次读1024个,不够1024个就读取真实个数
//输出文件资源,即使用FileOutputStream输出流 程序-->目的地
//一定要使用write(buf,0,readLen)方法而不能使用write(buf)因为,可能读到最后真实
// 读到的文件资源可能没有1024个,而使用buf就代表每次都有1024个
fileOutputStream.write(buf,0,readLen);
}
System.out.println("文件拷贝成功");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
//关闭相应流,释放资源
if(fileInputStream!=null){
fileInputStream.close();
}
if(fileOutputStream!=null){
fileOutputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
标签:文件,读取,分类,String,FileOutputStream,IO,FileInputStream,及流,字节
From: https://blog.51cto.com/u_15784725/6317321