0、IO流
0.1、IO(Input Output)流的概念
Java中将不同设备之间的数据传输抽象为“流”:Stream
设备指的是:磁盘上的文件,网络连接,另一个主机等等
按流向分:输入流,输出流:都是针对内存来说的
- 输入流,只能从其中读取数据
- 输出流,只能把数据放入其中
按每次处理的数据单位分:字节流,字符流
1.字节流:每次处理一个字节
2.字符流:每次处理一个字符
0.2、IO流抽象基类
通常流的分类,如果没有特定指出,都是按操作数据单位来说的
字节流:两个方向
InputStream:输入字节流
OutputStream:输出字节流
字节流继承图:
字符流:两个方向
Reader:输入字符流
Writer:输出字符流
字符流继承图:
1、字节流
1.1字节输出流抽象基类:OutputStream
1.1.1 FileOutputStream实现类
构造方法:(输出流会自动创建输出对象)
FileOutputStream(File file)
通过一个File对象创建一个文件输出流对象
FileOutputStream(String name)
通过一个字符串构建一个文件输出流对象
FileOutputStream(File file,boolean append)
通过文件对象创建文件输出流对象,并指定是否追加
FileOutputStream(String name,boolean append)
通过一个字符串构建一个文件输出流对象,并指定是否追加
note:如果没有实际对象,对对象的操作并不会作用于实际文件
写出数据到流对象:
void write(byte[] bytes)
一次写一个字节数组的数据
void write(int b)
一次写一个字节
void write(byte[] bytes,int off,int len)
一次写一个字节数组的一部分
关闭流对象:
void close()
关闭此文件输出流并释放与此流有关的所有系统资源
关闭流的两个作用:
1.让流不能再继续使用
2.释放和此流相关的系统资源
1.1.2 FileInputStream实现类
构造方法:(必须要求输入对象事先存在)
FileInputStream(File file)
通过File对象创建一个文件输入流对象FileInputStream(String name)
通过一个字符串创建一个文件输入流对象 String可以是完整路径字符串
int read()
从输入流中读取一个字节
int read(byte[] b)
从输入流中读取字节,放到字节数组中,返回字节个数
int read(byte[] b,int off,int len)
从输入流中读取字节,放到字节数组中,只放到指定位置(不常用)
1.1.3自带关闭资源的try语句块
为了替换finally臃肿的写法,JDK7出现了自带关闭资源的try语句块,可以不用显式的写finally语句。
用法:
将需要关闭的资源定义或者初始化语句放到try后的括号里,程序会自动关闭这些资源,前提是这些类实现了AutoCloseable接口或者Closeable接口
格式:
try(需要自动关闭的资源声明或者初始化){ //正常逻辑语句 }
案例:字节读取
1.一次读取一个字节 2.用循环改进读取字节 3.简化循环读取字节 4.一次读取一个字节数组 5.加上异常处理读取字节数组 6.改进异常处理读取字节数组
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; /* * FileInputStream(File name) * FileInputStream(String name) */ public class FileInputStreamDemo { public static void main(String[] args) throws Exception { //输入流关联的文件必须事先存在,否则异常,输出流目标文件可以自动创建 FileInputStream fis = new FileInputStream(new File("a.txt")); // FileInputStream fis2 = new FileInputStream("a.txt"); //一次读取一个字节: // int b = fis.read(); // System.out.println(b); /* b = fis.read(); System.out.println(b); b = fis.read(); System.out.println(b); b = fis.read(); System.out.println(b); b = fis.read(); System.out.println(b); */ //用循环改进 /* int b = 0; while(true){ b = fis.read(); if(b == -1){ break; }else{ System.out.println(b); } } */ //最终代码 // int b = 0; // while((b = fis.read()) != -1){ // System.out.println(b); // } //一次读取一个字节数组 /* byte[] bys = new byte[1024]; int len = fis.read(bys); System.out.println(len); //用字节数组构建字符串 String str = new String(bys, 0, len); System.out.println(str); */ //循环读取数据 int len = 0; byte[] bys = new byte[1024]; while((len = fis.read(bys) + test()) != -1){ System.out.print(new String(bys,0,len)); } //释放资源 fis.close(); } public static int test(){ System.out.println("方法被调用了"); return 0; } }