第一部分:字节流概述
概念:
- IO流用于处理设备之间的数据传输
- Java对数据操作是通过流的方式
- Java用于操作流的类都在IO包中
- 流按流向分为两种:输入流,输出流。
- 按操作类型分为两种:
字节流:字符流可以操作任何数据,因为在计算机中任何数据都是以字节的形式存储的
字符流:字符流只能操作纯字符的数据,比较方便 - IO流常用的父类:
字节流的抽象父类:
InputStream
OutputStream
字符流的抽象父类:
Reader
Writer - IO程序书写
使用前:导入IO包中的类
使用时:进行IO异常处理
使用后:释放资源
第二部分:InputStream 读取数据
Read()一次读取一个字节。
代码案例:
创建目录
创建一个Test1.txt文件,内容如下。
package io;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class InputStreamTest {
public static void main(String[] args) throws IOException {
InputStream is = new FileInputStream("test1.txt"); 创建字节流,文件放入
int b; //创建b来 存放读取文件的内容
while((b=is.read())!=-1) {
/*b按字节读取某个文件里面的内容(这种情况是是一个字节一个字节的读取,所以当读到最后的时候,就会返回-1。*/
System.out.println(b);
}
is.close(); //关闭字节流
}
}
输出结果
119
101
99
108
111
109
101
32
116
111
32
105
111
84
101
115
116
提问:为什么Read()方法返回值为int 而不是Byte类型?
1.返回值为数字的因为这里Read()方法,读取到的是每一个字母所对应的ASCII码。
2.因为字节流可以操作任意类型的文件,这些文件底层都是以二进制形式存储的,如果每次读取都返回byte的话,那么又可能遇到11111111
这个11111111是byte类型中的-1,我们的程序是遇到-1就会停止,不继续往后面读取了,所以这个应该用int,如果发现有11111111会在其前面补上24个0,凑足4个字节,那么byte的-1就会编程int 类型的255了,这样就可以保证数据读完,而结束标记-1 就是int的类型的
第三部分:OutPutStream 写入数据
代码案例:
package io;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class InputStreamTest {
public static void main(String[] args) throws IOException {
OutputStream os = new FileOutputStream("test2.txt");
os.write(111);
os.close();
}
}
实例1:用inputStream和outputStream实现图片的拷贝
package io;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class InputStreamTest {
public static void main(String[] args) throws IOException {
InputStream is = new FileInputStream("img.jpg"); //原图片输入流
OutputStream os = new FileOutputStream("copy.jpg"); //复制图片输出流
int b;
while((b=is.read())!=-1) {
os.write(b);
}
is.close();
os.close();
}
}
方法二:
这里我们会出现这样一个问题,当我们拷贝一个音频文件或者其他较大的文件的时候,我们用上述方法就显得比较缓慢,这个时候我们需要用到一个新的方法。
package io;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class InputStreamTest {
public static void main(String[] args) throws IOException {
InputStream is = new FileInputStream("img.jpg"); //原图片输入流
OutputStream os = new FileOutputStream("copy.jpg"); //复制图片输出流
int b =is.available(); //先读取到原文件。
byte[] bytes = new byte[1024*8]; //标准格式。
is.read(bytes);
os.write(bytes);
is.close();
os.close();
}
}