字符流和字节流的区别
字节流一般用来处理图像、视频、音频、PPT、Word等类型的文件。字符流一般用于处理纯文本类型的文件,如TXT文件等,但不能处理图像视频等非文本文件。用一句话说就是:字节流可以处理一切文件,而字符流只能处理纯文本文件。
字节流与字符流对比
- 字节流操作的基本单元为字节;字符流操作的基本单元为Unicode码元。
- 字节流默认不使用缓冲区;字符流使用缓冲区。
- 字节流通常用于处理二进制数据,实际上它可以处理任意类型的数据,但它不支持直接写入或读取Unicode码元;字符流通常处理文本数据,它支持写入及读取Unicode码元。
字节流一般用来处理图像、视频、音频、PPT、Word等类型的文件。字符流一般用于处理纯文本类型的文件,如TXT文件等,但不能处理图像视频等非文本文件。用一句话说就是:字节流可以处理一切文件,而字符流只能处理纯文本文件。
FileReader
import org.junit.Test;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class FileReader_test {
public static void main(String[] args) {
File file = new File("hello.txt"); //D:\JavaSE基础学习\IO流\hello.txt
System.out.println(file.getAbsolutePath());
File file1 = new File("day09\\hello.txt"); //D:\JavaSE基础学习\IO流\day09\hello.txt
System.out.println(file1.getAbsolutePath());
}
//将hello.txt文件读入程序中,并输出
@Test
public void FileReader_test1() {
FileReader fr = null;
try {
//1.实例化File类的对象,指明要操作的文件
File file = new File("./src/hello.txt");
//2.提供具体的流
fr = new java.io.FileReader(file);
int data;
while ((data = fr.read()) != -1) {
System.out.print((char) data);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fr != null) {
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//对read()操作升级:使用read的重载方法
@Test
public void FileReader_test2() {
java.io.FileReader fr = null;
try {
//1.File类的实例化
File file = new File("./src/hello.txt");
//2.FileReader流的实例化
fr = new java.io.FileReader(file);
//3.读入的操作
//read(char[] cbuf):返回每次读入cbuf数组中的字符的个数。如果达到文件末尾,返回-1
char[] cbuf = new char[5];
int len;
while ((len = fr.read(cbuf)) != -1) {
//方式一:
//错误的写法
// for(int i = 0;i < cbuf.length;i++){
// System.out.print(cbuf[i]);
// }
//正确的写法
// for(int i = 0;i < len;i++){
// System.out.print(cbuf[i]);
// }
//方式二:
//错误的写法,对应着方式一的错误的写法
// String str = new String(cbuf);
// System.out.print(str);
//正确的写法
String str = new String(cbuf, 0, len);
System.out.print(str);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fr != null) {
//4.资源的关闭
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
标题FileWriter
import org.junit.Test;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
/*
从内存中写出数据到硬盘的文件里。
说明:
1. 输出操作,对应的File可以不存在的。并不会报异常
2.
File对应的硬盘中的文件如果不存在,在输出的过程中,会自动创建此文件。
File对应的硬盘中的文件如果存在:
如果流使用的构造器是:FileWriter(file,false) / FileWriter(file):对原有文件的覆盖
如果流使用的构造器是:FileWriter(file,true):不会对原有文件覆盖,而是在原有文件基础上追加内容
*/
public class FileWriter_test {
public static void main(String[] args) {
return;
}
@Test
public void FileWriter_test1() {
FileWriter fw = null;
//1.提供File类的对象,指明写出到的文件
File file = new File("./src/hello1.txt");
//2.提供FileWriter的对象,用于数据的写出
try {
fw = new FileWriter(file, true);
//3.写出的操作
fw.write("I have a dream!\n");
fw.write("you need to have a dream!");
} catch (IOException ioException) {
ioException.printStackTrace();
} finally {
//4.流资源的关闭
if (fw != null) {
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
标题FileInputStream和FileOutputStream
实现图片的复制
import org.junit.Test;
import java.io.*;
public class FileInputOutputStream_test {
//实现对图片的复制操作
@Test
public void FileInputOutputStream_test() {
FileInputStream ins = null;
FileOutputStream outs = null;
File f1 = new File("./src/1.jpg");
File f2 = new File("./src/2.jpg");
try {
ins = new FileInputStream(f1);
outs = new FileOutputStream(f2);
byte buffer[] = new byte[10];
int len;
while ((len = ins.read(buffer)) != -1) {
outs.write(buffer, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ins != null) {
try {
ins.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (outs != null) {
try {
outs.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
- 对于文本文件(.txt,.java,.c,.cpp),使用字符流处理
- 对于非文本文件(.jpg,.mp3,.mp4,.avi,.doc,.ppt,…),使用字节流处理
- 使用字节流FileInputStream处理文本文件,可能出现乱码。
缓冲流
- BufferedInputStream
- BufferedOutputStream
- BufferedReader
- BufferedWriter
import org.junit.Test;
import java.io.*;
public class FileInputOutputStream_test {
//BufferedInputStream
//BufferedOutputStream
//实现对图片的复制操作
@Test
public void FileInputOutputStream_test() {
FileInputStream ins = null;
FileOutputStream outs = null;
File f1 = new File("./src/1.jpg");
File f2 = new File("./src/2.jpg");
try {
ins = new FileInputStream(f1);
outs = new FileOutputStream(f2);
byte buffer[] = new byte[10];
int len;
while ((len = ins.read(buffer)) != -1) {
outs.write(buffer, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ins != null) {
try {
ins.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (outs != null) {
try {
outs.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//BufferedReader
//BufferedWriter
@Test
public void testFileInputStream() {
FileInputStream fis = null;
try {
//1. 造文件
File file = new File("./src/hello.txt");
//2.造流
fis = new FileInputStream(file);
//3.读数据
byte[] buffer = new byte[5];
int len;//记录每次读取的字节的个数
while((len = fis.read(buffer)) != -1){
String str = new String(buffer,0,len);
System.out.print(str);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if(fis != null){
//4.关闭资源
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
转换流
InputStreamReader:将一个字节的输入流转换为字符的输入流
OutputStreamWriter:将一个字符的输出流转换为字节的输出流
/*
* 处理流之二:转换流的使用
* 1.转换流:属于字符流
* InputStreamReader:将一个字节的输入流转换为字符的输入流
* OutputStreamWriter:将一个字符的输出流转换为字节的输出流
*
* 2.作用:提供字节流与字符流之间的转换
*
* 3. 解码:字节、字节数组 --->字符数组、字符串
* 编码:字符数组、字符串 ---> 字节、字节数组
*/
import org.junit.Test;
import java.io.*;
public class InputStreamReader_test {
/*
此时处理异常的话,仍然应该使用try-catch-finally
InputStreamReader的使用,实现字节的输入流到字符的输入流的转换
*/
@Test
public void test1() throws IOException {
FileInputStream fis = new FileInputStream("./src/hello.txt");
//InputStreamReader isr = new InputStreamReader(fis);//使用系统默认的字符集
//参数2指明了字符集,具体使用哪个字符集,取决于文件helllo.txt保存时使用的字符集
InputStreamReader isr = new InputStreamReader(fis,"gbk");//使用系统默认的字符集
char[] cbuf = new char[20];
int len;
while((len = isr.read(cbuf)) != -1){
String str = new String(cbuf,0,len);
System.out.print(str);
}
isr.close();
}
/*
此时处理异常的话,仍然应该使用try-catch-finally
综合使用InputStreamReader和OutputStreamWriter
*/
@Test
public void test2() throws Exception {
//1.造文件、造流
File file1 = new File("./src/hello.txt");
File file2 = new File("./src/hello4.txt");
FileInputStream fis = new FileInputStream(file1);
FileOutputStream fos = new FileOutputStream(file2);
InputStreamReader isr = new InputStreamReader(fis,"utf-8");
OutputStreamWriter osw = new OutputStreamWriter(fos,"gbk");
//2.读写过程
char[] cbuf = new char[20];
int len;
while((len = isr.read(cbuf)) != -1){
osw.write(cbuf,0,len);
}
//3.关闭资源
isr.close();
osw.close();
}
}