IO流
Java里面分为两种流:字节流和字符流。如果细分的话有,可分为:4个文件流,4个缓冲流,2个转换流,2个打印流,2个序列化流,2个数据流。
//文件流 FileInputStream //字节输入流 FileOutPutStream //字节输出流 FileReader //字符输入流 FileWriter //字符输出流 //缓冲流 BufferedInputStream //字节输入缓冲流 BufferedOutputStream //字节输出缓冲流 BufferedReader //字符输入缓冲流 BufferedWriter //字符输出缓冲流 //序列化流 ObjectInputStream ObjectOutputStream //转换流(字符流) 将字节流转换为字符流 InputStreamReader OutputStreamWriter //数据流 DataInputStream DataOutputStream //打印流 PrintWriter PrintStream
输入输出方向
对于IO流而言,IO(input Output)输入输出的意思。在输入输出之间我们需要找一个参照物,然后判断相对于参照物而言是输入还是输出。而我们一般会把内存作为参照物。当我们打开一个应用程序时,计算机会把那个应用程序加载到内存,然后等待CPU执行,对内存就相当于输入。当我们写代码时,代码首先会进内存里面,按下Ctrl+S时,计算机会将内存中的代码保存到硬盘中,对内存而言就相当与输出。带有Input Reader输入(读),Output Writer输出(写)。
字节流和字符流
Stream表示基于字节流,Writer和Reader表示基于字符流。
用字节流FileInputStream和FileOutputStream来读写文件
package FileStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;
public class File_Stream {
public static void main(String[] args) throws IOException {
Scanner sca=new Scanner(System.in);
//写文件
System.out.print("请输入文件名:");
String name=sca.next();
File file=new File(name+".txt");//文件名 相对路径(项目名根目录下)
// FileOutputStream fs=new FileOutputStream(file); //如果文件存在 覆盖
FileOutputStream fos=new FileOutputStream(file,true);//true表示追加,如果文件存在 向里面继续添加内容
System.out.println("请输入写入的内容:");
String str=sca.next();
byte bytes[]=str.getBytes(); //FileOutputStream 是基于字节流 把要写入的信息 保存到字节数组中
fos.write(bytes,0,bytes.length);//将字节数组中全部内容写到文件中 从0—数组的长度
fos.close();//关闭流
System.out.println("文件写入成功!");
//读文件
FileInputStream fis=new FileInputStream(file);
byte bt[]=new byte[1024];//1KB 每次最多读取的1KB 根据文件大小而定
int temp=0;
while((temp=fis.read(bt))!=-1){ //将数据保存到数组(缓冲区)中 并返回读取的字节数 -1表示读完了
System.out.println(new String(bt,0,temp));//输出数组中保存内容 按照每次读取的字节数
}
fis.close();
}
}
运行结果:
由于FileInputStream和FileOutputStream是基于字节流的,所以每次都需要定义byte数组对读写进行操作。
PS:如果单独读取一个文件时,出现了乱码。可能是字符集不同,Eclipse默认为GBK,IDEA默认为UTF-8,改成对应的字符集即可。
用字节流FileInputStream和FileOutputStream来Copy文件
package FileStream;
import java.io.*;
public class File_Copy {
public static void main(String[] args) throws IOException {
File file=new File("dome.txt");
if(!file.isFile()){ //判断文件是否存在
System.out.println("该文件不存在,无法Copy!");
return;
}
FileInputStream fis=new FileInputStream(file); //"src\\"+file.getName()
FileOutputStream fos=new FileOutputStream("src/"+file.getName());//把文件拷(输出)到src下
byte bytes[]=new byte[1024];
int temp=0; //边读边写
while((temp=fis.read(bytes))!=-1){ //读
fos.write(bytes,0,temp); //写
}
fis.close();
fos.close();
System.out.println("文件拷贝成功!");
}
}
运行结果:
在Copy文件的时候,只需要将FileInputStream和FileOutputStream一起使用,边读边写,就可以达到Copy文件的目的。
每日鸡汤:比你优秀的人仍在努力,比你差的人还没放弃,你没还有什么借口不坚持下去。
Over!