1.基本概念
流:程序通过流来传输和保存数据 程序的输入输出都是以流的方式,流里保存的是字节。
Java IO通过Stream(流)来实现。Java中定义了两种类型的流:字节型,和字符型。 关于流,可以理解为是一种“数据的管道”。管道中流动的东西可以是基于字节,也可以是基于字符的等。就好像管道里面可以流动水,也可以流动石油一样。
输入流 和 输出流:程序 需要数据的时候,通过输入流来获取数据。程序 需要保存数据的时候,通过输出流保存数据。输入流和输出流是相对程序而言,程序需要数据就需要输入流,程序保存数据 相对程序来说是是输出数据 就需要输出流。
字节流和字符流: 在java.io包中 操作文件内容主要有两大类:字节流和字符流。 字节流常用来操作 图片,音频,视频等。字符流长用来操作含有中文的文件。
在字节流中,输入和输出是使用InputStream和OutStream完成的。
在字符流中,输入和输出是Reader类和Writer类完成的。
2.java IO 操作的步骤:
1.创建文件: 根据文件路径 创建文件和文件夹
2.打开输入输出流: 如果是保存文件,根据文件打开输出流;如果是读取文件,根据文件打开输入流
3.读取操作: 这一步需要用到byte[] 数组。如果是保存文件,就把要保存的内容转换成byte[] 数组,然后把byte[] 数组写入输出流。 如果是读取文件,就new 一个byte[] 数组,然后通过输入流 把要读取的文件内容读取到byte[] 数组。
4.关闭输入输出流。
3.字节流 byte IO操作
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.junit.Test;
public class IOTest {
// 字节数组 写的时候,把待保存的文件转化为字节数组,然后把字节数组写入输出流。
// 字节数组 读的时候 创建一个空的字节数组,把要读取的文件,读入字节数组
@Test
public void readFileByStream() throws IOException {
// 1.创建文件
File file = new File("D:/xml/file/test.txt");
if (file.exists()) {
// 2.打开输入输出流---根据文件打开输入流
InputStream inputStream = new FileInputStream(file);
// 3.读写操作---把要读的文件 读取到字节数组里
byte[] b = new byte[(int) file.length()];
int len = inputStream.read(b);
// 4.关闭输入出处流
inputStream.close();
System.out.println(new String(b));
}
}
@Test
public void saveFileByStream() throws IOException {
//1.创建文件
String folderPath = "D:/xml/file";
File folder = new File(folderPath);
if(!folder.exists()){
folder.mkdirs();
}
File file = new File("D:/xml/file/test.txt");
//2.打开输入输出流--- 根据要保存的文件 创建文件输出流
OutputStream outputStream = new FileOutputStream(file);
//3.读写操作: 把要保存的内存转化到byte数组,然后以字节的方法 把字节数组输出到输出流
String str = "haaaaaaaa";
outputStream.write(str.getBytes());
//4.关闭输入输出流
outputStream.close();
}
}
4.字符流 IO操作
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import org.junit.Test;
public class IOTest {
@Test
public void saveFileByChar() throws IOException {
// 1.创建文件
String folderPath = "D:/xml/file";
File folder = new File(folderPath);
if (!folder.exists()) {
folder.mkdirs();
}
File file = new File("D:/xml/file/testChar.txt");
// 2.打开输入输出流: 根据文件打出输出流
Writer writer = new FileWriter(file);
// 3.读写操作:把要保存的内容 写入到输出流
String str = "我这次真的有点纠结了!";
writer.write(str);
// 4.关闭输入输出流
writer.close();
}
@Test
public void readFileByChar() throws IOException {
// 1.创建文件
File file = new File("D:/xml/file/testChar.txt");
if (file.exists()) {
// 2.打开输入输出流: 根据文件打开输入流
Reader reader = new FileReader(file);
// 3.读写操作:把要读取的内容 读取到输入流
char[] c = new char[(int) file.length()];
reader.read(c);
System.out.println(new String(c));
// 4.关闭输入输出流
reader.close();
}
}
}
5.字节流和字符路的区别:
1.字节流 是byte 字节来传输的,字符流是by 字符的。如果对是中文字符操作,最好用字符流
2.字节流是没有用到缓存区的,直接对文件操作,所以即使没有即使关闭资源 outputstream.close() ,也可以输出内容。
字符流是用了缓存区的,如果没有及时关闭资源,不会有内存输出。但是如果没有关闭资源,通过flush() 强制刷新缓存,也可以输出内容。
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Writer;
import org.junit.Test;
public class IOTest {
@Test
public void saveFileByStream() throws IOException {
String folderPath = "D:/xml/file";
File folder = new File(folderPath);
if (!folder.exists()) {
folder.mkdirs();
}
File file = new File("D:/xml/file/test1.txt");
OutputStream outputStream = new FileOutputStream(file);
String str = "haaaaaaaa";
outputStream.write(str.getBytes());
// 4.关闭输入输出流 这样文件里也有内容
// outputStream.close();
}
@Test
public void saveFileByChar() throws IOException {
String folderPath = "D:/xml/file";
File folder = new File(folderPath);
if (!folder.exists()) {
folder.mkdirs();
}
File file = new File("D:/xml/file/testchar1.txt");
Writer writer = new FileWriter(file);
String str = "haaaaaaaa";
writer.write(str);
// 4.关闭输入输出流
//writer.close(); //这样testchar1.txt文件里 没有内容
//writer.flush(); //强制刷新缓存也 可以输出内容
}
}