本文主要介绍,字符,字节流,缓冲流,转换流,打印流。
一,字节流(输出,输入):
1,输出流(字节输出流),写入方法写入,可以写一个字节,字节片段,也可以规定写入一部分字节的一部分。
2,InputStream(字节输入流),读取方法读取,可以读一个字节,字节片段,也可以规定读取某些字节片段的一部分。字符
流(Reader,Writer):
1,FileWriter(字符输出流),写入方法写入,可以写一个字符,字符数组,也可以规定写入某些字符数组的一部分。
1,FileReader(字符输入流),读取方法read,可以读一个字符,字符数组,也可以规定读取某些字符片段的一部分。
注:字符流在写入的时候要刷新刷新一下,关闭方法中包含了刷新,但是一般还是写入部分刷新一下好。字符流和字节流的用法区别:
一般文本操作的时候用字符流,其他文件操作的时候用字节流。因为汉字不管用什么编码表,都不止一个字节,用字节流来一个个读取会破坏汉字的特性。而用字符流来都其他文件(图片,音乐,视频),也会破坏本来的文件。
字符流,字节流,对文件的复制操作。(复制包含了读取和写入)
package note.basics.demo;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/*
* 分别用字符流和字节流来对文件的Copy
*/
public class Copy_1 {
public static void main(String[] args) throws IOException {
fun();
}
//字节流的操作
public static void fun() throws IOException{
//创建一个操作文件
File file = new File("d:\\copy.txt");
//把文件进行流的捆绑
FileInputStream fis = new FileInputStream(file);
FileOutputStream fos = new FileOutputStream(new File("d:\\aa.txt"));
//当文件读取完了,返回-1,每次返回的是相对于的ASCII
int read = -1;
while( (read = fis.read()) != -1){
fos.write(read);
//如果存的是汉字打印出来的是乱码
// System.out.println((char)read);
}
fis.close();
fos.close();
}
//字符流的操作
public static void fun2() throws IOException{
//创建字符输入输出流,并捆绑文件
FileReader fr = new FileReader(new File("d:\\copy2.txt"));
FileWriter fw = new FileWriter(new File("d:\\bb.txt"));
int read = -1;
while( (read = fr.read()) != -1){
fw.write(read);
//不管存的是什么,都照样输出
// System.out.println((char)read);
}
fr.close();
fw.close();
}
}
二,缓冲流:
1,字节缓冲流(BufferedInputStream,BufferedOutputStream)
1)BufferedOutputStream(字节输出缓冲流):写入数据到流中,作用:提高写入输出流的写入效率。
2)BufferedInputStream(字节输出缓冲流):读取流中的数据,作用:提高内置输入流的读取效率。
2,字符缓冲流(BufferedReader,BufferedWriter)
1)BufferedReader(字符读取缓冲流):从字符输入流中读取文本,缓冲多个字符,从而实现字符,数组和行的高效读取。
2)BufferedWriter(字符写入缓冲流):将文本写入字符串输出流,缓冲多个字符,从而提供字符串,字符串和字符串的高效写入。
注:它们的构造方法都有两个,一个是一个参数的,一个是两个参数的。
1)一个参数的,都是传递相对应的流,进行效率的提高。(以下会代码演示)
2)两个参数的,第一个参数和(1)一样,第二个参数是输入的大小。一般尺寸大小也够,看实际情况来选择方法。
缓冲流对文件复制(复制包含文件的读取,和写入)
package note.basics.demo;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Copy_2 {
public static void main(String[] args) throws IOException{
fun();
fun1();
}
//字节缓冲流复制
public static void fun() throws IOException{
//创建字节输入输出并为其绑定文件
FileInputStream fis = new FileInputStream(new File("d:\\copy.txt"));
FileOutputStream fos = new FileOutputStream(new File("d:\\aa.txt"));
//创建字节缓冲流并绑定相对应的字节流
BufferedInputStream bis = new BufferedInputStream(fis);
BufferedOutputStream bos = new BufferedOutputStream(fos);
//read方法可以读取一个字节或字节数组,或读取字节数组的一部分
int line = -1;
while((line = bis.read()) != -1){
//write方法可以写入一个字节或字节数组,或写入字节数组的一部分
bos.write(line);
}
//关闭流
//直接关闭缓冲流就可以了,它会把相对应的字节流也关闭
bis.close();
bos.close();
}
//字符缓冲流复制
public static void fun1() throws IOException{
//直接一步创建字符缓冲流并绑定文件
BufferedReader br = new BufferedReader(new FileReader("d:\\copy2.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("d:\\bb.txt"));
int line = -1;
while((line = br.read()) != -1){
bw.write(line);
//字符流写入的时候要刷新
bw.flush();
}
br.close();
bw.close();
//这里介绍两个比较好用的方法
//读取文本中的一行,返回String 结束返回null
String readLine = br.readLine();
//向文本中写入换行
bw.newLine();
bw.write("\r\n");//这个也是向文本中写入换行
//但是 newLine更好,因为它可以跨平台
//\r\n是win系统的换行 Linux下是 \r
}
}
三,转换流:
1,InputStreamReader是字节流通向字符流的轴向,读取字节相连其解码为字符。
2,OutputStreamWriter是字符流通向字节流的轴向,将要写入流中的字符编码成字节。
总结:有了这两个转换流就可以完成所有的转换。
1,读取字符转换成字节
2,读取字节转换成字符
用代码展示这两种转换:
package note.basics.demo;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
/*
* 这两个转换流都有两个构造方法:
* 1、一个是一个参数的,是相对应的流
* 2、另一个是两个参数的,第一个参数是相对应的流,第二个参数是指定编码
* 默认编码是GBK,只有GBK和utf-8两种,不区分大小写
*
* 它们都有一个方法 getEncoding(),返回当前转换流使用的编码
*
*/
public class Demo {
public static void main(String[] args) throws IOException {
fun();
fun1();
}
//向文件中写入字符
public static void fun() throws IOException{
FileWriter fw = new FileWriter("d:\\aa.txt");
fw.write("你好");
fw.close();
}
//将写入的字符变成字节
public static void fun1() throws IOException{
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("d:\\bb.txt"),"UTF-8");
osw.write("你好");
osw.close();
}
//读取字节转换成字符
public static void fun2() throws IOException{
InputStreamReader isr = new InputStreamReader(new FileInputStream("d:\\bb.txt"),"utf-8");
int line = -1;
while((line = isr.read()) != -1){
System.out.print((char)line);
}
isr.close();
}
/*
* 结果:
* fun2()函数去读aa.txt文件的时候打印出来的结果是 ???
* fun2()函数去读bb.txt文件的时候打印出来的结果是 你好
*
* 结论:
* OutputStreamWriter流成功把字符转换成了字节
* OutputStreamWriter流成功把字节转换成了字符
*
*/
}
四,打印流
1,PrintStream继承OutputStream
2,PrintWriter继承Writer
特点:
1,此流不负责数据源,只负责数据目的
2,为其他输出流,添加功能
3,永远不会引发IOException,但是可能引发别的异常
package note.basics.io;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
/*
* 打印流
* PrintStream
* PrintWriter
*
* 两个打印流的方法,完全一致
* 构造方法就是打印流的输出目的端
* PrintStream
* 构造方法:接受File类型,接受字符串文件名,接受字节输出流OutputStream
* PrintWriter
* 构造方法:接受File类型,接受字符串文件名,接受字节输出流OutputStream,接受字符输出流Writer
*/
public class io15 {
public static void main(String[] args) throws IOException {
fun3();
}
/*
* 打印流,向File对象的数据目的写入数据
* 方法print println 原样输出
* write 走码表
*/
public static void fun() throws FileNotFoundException{
File file = new File("d:\\1.txt");
PrintWriter pw = new PrintWriter(file);
pw.print(100);
pw.close();
}
/*
* 打印流,输出目的,String文件名
*/
public static void fun1() throws FileNotFoundException{
PrintWriter pw = new PrintWriter("d:\\2.txt");
pw.println(3.5);
pw.close();
}
/*
* 打印流,输出目的,是流对象
* 可以是字节输出流,可以是字符的输出流
* OutputStream Writer
*/
public static void fun2() throws FileNotFoundException{
FileOutputStream fos = new FileOutputStream("d:\\3.txt");
PrintWriter pw = new PrintWriter(fos);
pw.print("dada");
pw.close();
}
/*
* 打印流,可以开启自动刷新功能
* 满足2个条件:
* 1、输出的数据目的必须是流对象
* OutputStream Writer
* 2、必须调用println,printf,format三个方法中的一个,启用自动刷新
*
*/
public static void fun3() throws IOException{
FileOutputStream fos = new FileOutputStream("d:\\5.txt");
PrintWriter pw = new PrintWriter(fos,true);
pw.println("d");
pw.println("a");
pw.println("s");
pw.println("f");
pw.close();
}
}