Java IO操作 字节流&字符流
参考 字节流与字符流的区别详解
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(); //强制刷新缓存也 可以输出内容 } }