Java IO概念
1. 用于设备之间的数据传输。
2. Java 将操作数据流的功能封装到了IO包中。
3. 数据流流向分:输入流和输出流,操作对象为文件。
4. 流按照操作数据分:字节流(通用)和字符流。
5. 将计算机语言:二进制数据转换成文件显示到电脑上。
IO包:继承关系图:
字符流:
Reader :读取字符流,方法见API。
Writer :写入字符流,方法见API。
案例(Writer ):
import java.io.*;public classvar {public static voidmain(String[] agrs){
Writer writer= null;try{
writer= new FileWriter("Demo.txt");
// writer = new FileWriter("Demo.txt",true); 文件续写功能,否则会覆盖。
writer.write("今天天气真好!");
writer.flush();
}catch(IOException e) {
e.printStackTrace();
}finally{if(writer != null){try{
writer.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}
}
}
运行结果:
案例(Reader):
文件数据:
import java.io.*;public classvar {public static voidmain(String[] agrs){
Reader reader= null;try{
reader= new FileReader("Demo.txt");
char[] arr = new char[5];int red = reader.read(arr); //red是装到数组的长度。
while(red != -1){
System.out.println(new String(arr,0,red));
red=reader.read(arr);
}
}catch(IOException e) {
e.printStackTrace();
}finally{if(reader != null){try{
reader.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}
}
}
运行结果:
实现一个完整的文件复制。
import java.io.*;public classvar {public static voidmain(String[] agrs){
Reader reader= null;
Writer writer= null;try{
reader= new FileReader("Demo.txt");
writer= new FileWriter("Dome1.txt"); // char[] arr = new char[5];int red = 0; //red是装到数组的长度。
while((red = reader.read(arr)) != -1){
writer.write(new String(arr,0,red));
writer.flush();
}
}catch(IOException e) {
e.printStackTrace();
}finally{if(reader != null){try{
reader.close();
}catch(IOException e) {
e.printStackTrace();
}
}if(writer != null){try{
writer.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}
}
}
运行结果:
优化文件复制案例(缓冲流):
import java.io.*;public classvar {public static voidmain(String[] agrs){
BufferedReader bufferedReader= null; //缓冲读取流
BufferedWriter bufferedWriter = null; //缓冲写入流
try{
bufferedReader= new BufferedReader(new FileReader("Demo.txt"));
bufferedWriter= new BufferedWriter(new FileWriter("Dome2.txt"));
String str ;while((str = bufferedReader.readLine()) != null){
bufferedWriter.write(str);
bufferedWriter.newLine();//换行。
bufferedWriter.flush();
}
}catch(IOException e) {
e.printStackTrace();
}finally{if(bufferedReader != null){try{
bufferedReader.close();
}catch(IOException e) {
e.printStackTrace();
}
}if(bufferedWriter != null){try{
bufferedWriter.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}
}
}
运行结果:
上述IO无法处理视频,图片等一些文件,拷贝出来的文件也无法打开,由此我们引出字节流。
字节流:
OutputSteam:写入字节流,方法见API。
InputSteam: 读取字节流,方法见API。
案例(OutputSteam):
public classvar {public static voidmain(String[] agrs){
FileOutputStream fileOutputStream= null;try{
fileOutputStream= new FileOutputStream("demo.txt");
fileOutputStream.write("今天天气真好,我们去玩吧!".getBytes());//不需要刷新。
} catch(FileNotFoundException e) {
e.printStackTrace();
}catch(IOException e) {
e.printStackTrace();
}finally{if(fileOutputStream != null){try{
fileOutputStream.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}
}
}
运行结果:
案例(InputSteam):
importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.IOException;public classPublicTest {public static voidmain(String[] args) {
FileInputStream fileInputStream= null;try{
fileInputStream= new FileInputStream("demo.txt");int ch =0;byte[] arr = new byte[fileInputStream.available()]; //正式写代码不要使用fileInputStream.available(),因为文件比较大的时候内存会不够用。
while((ch = fileInputStream.read(arr)) != -1){
System.out.println(new String(arr,0,ch));
}
}catch(FileNotFoundException e) {
e.printStackTrace();
}catch(IOException e) {
e.printStackTrace();
}finally{if(fileInputStream != null){try{
fileInputStream.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}
}
}
运行结果:
案例:复制一个视频文件
importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.IOException;public classPublicTest {public static voidmain(String[] args) {
FileOutputStream fileOutputStream= null;
FileInputStream fileInputStream= null;try{
fileInputStream= new FileInputStream("video.avi");
fileOutputStream= new FileOutputStream("video1.avi");int ch =0;byte[] arr = new byte[fileInputStream.available()]; //正式写代码不要使用fileInputStream.available(),因为文件比较大的时候内存会不够用。
while((ch = fileInputStream.read(arr)) != -1){
fileOutputStream.write(arr);
}
}catch(FileNotFoundException e) {
e.printStackTrace();
}catch(IOException e) {
e.printStackTrace();
}finally{if(fileInputStream != null){try{
fileInputStream.close();
}catch(IOException e) {
e.printStackTrace();
}
}if(fileOutputStream != null){try{
fileOutputStream.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}
}
}
运行结果:
转换流(键盘输入和控制台输出作为案例):
import java.io.*;public classvar {public static voidmain(String[] agrs){
OutputStream out= System.out; //控制台打印
OutputStreamWriter outputStreamWriter = null;
outputStreamWriter= new OutputStreamWriter(out); //outputStreamWriter = new OutputStreamWriter(out,"GBK"); 可以指定写的编码
BufferedWriter bufferedWriter = newBufferedWriter(outputStreamWriter);
InputStream in= System.in; //键盘输入流。
InputStreamReader inputStreamReader = new InputStreamReader(in); //InputStreamReader inputStreamReader = new InputStreamReader(in,"BGK"); 同样可以指定编码
BufferedReader bufferedReader = newBufferedReader(inputStreamReader);try{
String line= null;while((line = bufferedReader.readLine()) != null){if("exit".equals(line)){break;
}
bufferedWriter.write(line);
bufferedWriter.flush();
}
}catch(IOException e) {
e.printStackTrace();
}finally{try{if(bufferedWriter != null){
bufferedWriter.close();
}if(bufferedReader != null){
bufferedReader.close();
}
}catch(IOException e) {
e.printStackTrace();
}
}
}
}
运行结果:
IO流先讲到这里,Java IO流还有很多有意思的类和方法见API。