(IO)流
Io流的理解
通过IO可以完成硬盘文件的读和写
/* * 文件的输入和输出都是基于内存为参照物的 * 文件的输入就是硬盘中的文件读到内存中 * 文件的输出就是内存中的文件写的硬盘中 */
IO 分类
有多种分类方式:
- 一种方式是按照流的方向进行分类:
以内存作为参照物
- 往内存中去,叫做输入(Input)。或者叫做读
- 从内存中出来,叫做输出(Output)或者叫做写
另一种方式是按照读取数据方式不同进行分类
有的流是按照字节的方式读取文件,一次读取一个字节,等同于一次读取8个二进制位,这种流是万能的,什么类型的文件都可以读取,包括:文件文件,视频,声音,图片等。
有的流是按照字符的方式读取数据的,一次只能读取一个字符,这种流是为了方便读取普通文本文件而存在的,这种流不能读取:图片,声音,视频等文件。只能读取单纯的文本文件,word文件也不能读取
javaIO有四大家族
四大家族的首领 :都是抽象类
java.io.InputStream 字节输入流
java.io.OutputStream 字节输出流
java.io.Reader 字符输入流
java.io.Writer 字符输出流
注意 :在java中只要类名以Stream结尾的都是字节流。以Reader/Writer结尾的都是字符流
所有的流都实现了:
java.io.Closeable 接口,都是可关闭的,都有close()方法。
用完流之后一定要关闭
所有的输出流都实现了:
java.io.Flushable 接口 ,都是可刷新的,都有flush()方法。
用完输出流的时候要刷新。刷新的作用就是清空管道。
需要掌握的流
文件专属(掌握)
java.io.FileInputStream
java.io.FIleOUtStream
java.io.FileReader
java.io.FileWriter
转换流:(将字节流转成字符流)
jav.io.InputStreamReader
java.io.OutputStreamWriter
缓存流专属
java.io.BufferedReader
java.io.BufferedWriter
java.io.BufferedInputStream
java.io.BufferedOutputStream
数据流专属
java.io.DataInputStream
java.io.DateOutputStream
对象专属流(掌握)
java.io.ObjectInputStream
java.io.ObjectOutputStream
标准输出流(掌握)
java.io.PrintWriter
java.io.PrintStream
文件专属(流)
文件的读
// 文件的输入流 就是从硬盘到内存中去
FileInputStream fileInputStream=new FileInputStream("D:\\word\\temp.txt");
int readData=0;
while ((readData=fileInputStream.read())!=-1){
System.out.println(readData);
}
fileInputStream.close();
反编译的结果为:
package com.aaa.javase.io;
import java.io.*;
public class InputStreamTest
{
public InputStreamTest()
{
}
public static void main(String args[])
throws IOException
{
FileInputStream fileInputStream = new FileInputStream("D:\\word\\temp.txt");
for(int readData = 0; (readData = fileInputStream.read()) != -1;)
System.out.println(readData);
fileInputStream.close();
}
}
最终版:
FileInputStream fileInputStream=new FileInputStream("D:\\word\\temp.txt");
byte [] bytes=new byte[4];
int recount=0;
while ((recount=fileInputStream.read(bytes))!=-1){
System.out.print(new String(bytes,0,recount));
}
fileInputStream.close();
文件的写
public static void main(String[] args) throws Exception {
//这个true代表在原文件中追加,不覆盖
FileOutputStream os=new FileOutputStream("D:\\word\\temp.txt",true);
//开始写
os.write(98);
String s="我是一个中国人,我骄傲";
//将字符串转成bytes数组
byte[] bytes = s.getBytes();
os.write(bytes);
os.flush();
os.close();
}
文件的复制
public static void main(String[] args) throws Exception{
//文件的读
FileInputStream is=new FileInputStream("D:\\word\\1.txt");
//进行写
FileOutputStream os=new FileOutputStream("D:\\word\\2.txt");
byte[] b=new byte[4];
int reCount=0;
//一遍读一遍写
while ((reCount=is.read(b))!=-1){
os.write(b,0,reCount);
}
os.flush();
is.close();
os.close();
}
FileWriter和FileReader中的操作方式和FileInputStream以及FileOutStream相似
FileWriter和FileReader文件的复制
public static void main(String[] args) throws Exception {
//读
FileReader fileReader=new FileReader("D:\\word\\1.txt");
//写
FileWriter fileWriter=new FileWriter("D:\\word\\3.txt");
char [] chars=new char[4];
int count=0;
while ((count=fileReader.read(chars))!=-1){
fileWriter.write(chars,0,count);
}
fileWriter.flush();
fileReader.close();
fileWriter.close();
}
缓冲流
读:
FileReader fileReader=new FileReader("D:\\word\\1.txt");
BufferedReader reader=new BufferedReader(fileReader);
String s2=null;
while ((s2=reader.readLine())!=null){
System.out.println(s2);
}
reader.close();
public static void main(String[] args) throws Exception{
//字节流
FileInputStream in=new FileInputStream("D:\\word\\1.txt");
//转换流
InputStreamReader isr=new InputStreamReader(in);
//处理流/包装流
BufferedReader reader=new BufferedReader(isr);
String s = reader.readLine();
System.out.println(s);
reader.close();
}
写:
public static void main(String[] args) throws Exception{
//节点流
FileWriter fileWriter = new FileWriter("D:\\word\\1.txt",true);
//包装流
BufferedWriter bufferedWriter=new BufferedWriter(fileWriter);
//换行 每次写入换行
bufferedWriter.newLine();
bufferedWriter.write("小明");
bufferedWriter.flush();
bufferedWriter.close();
}
标准输出流
标准输出流默认输出到控制台
//标准输出流不再指定控制台,执行log文件
PrintStream pr=new PrintStream(new FileOutputStream("log"));
//修改输出方向,将输出方向修改到log文件
System.setOut(pr);
System.out.println("xhang");