JAVA基础 IO流一
IO是指 文件内容的读入写出 ,上传下载。是 操作文件内部的内容非File操作文件外部。
流是指 一连串流动的数据,数据以先入先出的方式流动,就像是在管道中流动的水一样。
数据源 --> 数据 --> 目的地。
在java中,我们以程序为中心。根据数据的流向来判断是否是输入流还是输出流。
流的分类:
流向分类:
输入流(读书)
输出流(写信)
操作单元分类:
字节流 : 万能流 ****
字符流 : 纯文本
功能分类:
节点流: 真是基本做读写的
功能流: 扩展节点流的功能,提高节点的效率
InputStream
此抽象类是 表示输入字节流的所有类 的父类。
子类: ByteArrayInputStream 字节数组输入流:当管道的另一端是字节数组的时候使用
FileInputStream 文件输入流:当管道的另一端是文件的时候,操作文件的时候使用
FileInputStream文件输入流
从API中我们可以看到InputStream是一个抽象的类,因此要想使用他,我们可以用他的子类来实现,因为他的子类和他的方法是差不多的,也可以直接使用他的多态来使用。
创建流
1>InputStream is = new FileInputStream(“D:/heihei.txt”);
2>File file = new File(“D:/heihei.txt”);
InputStream is = new FileInputStream(file);
两种方式都是可以使用的,因为FileInputStream(File file),构造器中本身也是一个File的地址,分开写和一起写都是一样的。
读入
1>read() 从此输入流中读取一个字节的数据。 返回一个int类型,即字符的Unicode码。
int len = is.read();
2>利用循环重复读取。
read() 从此输入流中读取一个字节的数据。 返回值: 数据的下一个字节,如果到达文件的末尾, -1 。
每次读取一个字节的数据,当数据个数非常多, 重复读取多次–>循环简化
int len = -1; //result中存储读入到的数据(数据的字节|-1没读到)
//重复读取
while((len = is.read())!=-1){
//3.处理数据
System.out.println((char)len);
}
3> 每次只读一个字节,读取次数过多,过于浪费,每次读取一个字节数组的数据,循环读取
int read(byte[] b) 从此输入流 b.length最多 b.length字节的数据读 b.length字节数组。
//字节数组 卡车
byte[] car = new byte[1024]; //卡车
int len = -1; //存储读入到数组中数据的个数
//重复读取
while((len=is.read(car))!=-1){
System.out.println(new String(car,0,len));
}
处理数据
1> 也就是打印数据,可以用强转成char类型的,这样方便我们读看。
System.out.println((char)len);
System.out.println((char)(is.read()));
关闭
close() 关闭此文件输入流并释放与该流关联的所有系统资源。
is.close();
OutputStream
字节输出流: 此抽象类是表示输出字节流的所有类的父类。
ByteArrayOutputStream 字节数组输出流 从程序写出内容到字节数组
FileOutputStream 文件输出流 从程序写出内容到文件
注意:
只要输出流就要提供关闭之前的刷出
目的地文件不存在会自动创建,但是如果目的地目录不存在,需要手动创建
写出目的地源文件中的内容默认覆盖不是追加,如果想要追加,需要在构造器中添加一个参数boolean append,true为追加,默认false覆盖
创建流
1>OutputStream os = new FileOutputStream(“D:/xixi.txt”);
2> File dest = new File(“D:/xixi.txt”);
OutputStream os = new FileOutputStream(dest,true); //true为追加
写出
void write(int b) 将指定的字节写入此文件输出流。
os.write(97);//b
write(byte[] b, int off, int len)
将从偏移量 off开始的指定字节数组中的 len字节写入此输出流。
刷出
os.flush();
关闭
os.close();
读入写出综合 copy
这是用的try catch 来捕获异常,也可以用throws抛出异常。我们平常使用抛出异常较多,因为idea等工具会自动给你抛出,比较方便。
创建流(输入流和输出流)
读入和写出
刷出
关闭
public static void main(String[] args){
//1.创建流
InputStream is = null;
OutputStream os = null;
try{
//输入流
is = new FileInputStream("D:space/ascii.png");
//输出流
os = new FileOutputStream("D:text/ascii.png");
//2.读入,写出
byte[] car = new byte[1024];
int len= -1;
//循环读写
while((len=is.read(car))!=-1){
//读入到字节数组中多少个len个数据,写出多少个
os.write(car,0,len);
}
//3.刷出
os.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
//4.关闭 (后打开的先关闭)
if(os!=null){
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(is!=null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}