字节流
- 字节流适合做一切文件数据的拷贝(音视频,文本)
- 字节流不适合读取中文内容输出
- 字符流适合做文本的操作(读和写)
- InputStream(抽象类)
输入流
- FileInputStream
- 构造方法:FileInputStream(String name)
- 常用方法:public abstract int read()
- public int read(byte[] b)
public abstract int read() 从inputStream中读取一个字节,如果没有字节可读,返回-1
InputStream inputStream = new FileInputStream("E:\\java_study\\demo3\\images\\test1.txt");
int b=0;
while ((b = inputStream.read())!= -1){
System.out.println((char)b);
}
public int read(byte[] b) 一次读取b的长度的字节,返回读取字节的数量,读取的字节暂存在b中,使用String的构造方法String(byte[] bytes, int offset, int length) 解析
InputStream inputStream = new FileInputStream("E:\\java_study\\demo3\\images\\test1.txt");
//inputStream.readAllBytes()一次性读取全部字节
byte[] buffer = new byte[3];
int len;
while ((len = inputStream.read(buffer)) != -1){
System.out.print(new String(buffer, 0, len));
}
- BufferedInputStream
- 构造器 BufferedInputStream(InputStream in)
- 同InputStream类似,但是BufferedInputStream自带缓冲池,比较之读取速度更快
public void bufferedIOStreamTest(){
try{
InputStream is = new FileInputStream("E:\\java_study\\demo3\\images\\test.txt");
InputStream in = new BufferedInputStream(is);
byte[] buffer = new byte[1024];
int len;
while ((len = in.read(buffer)) != -1){
System.out.print(new String(buffer, 0, len));
}
}catch (Exception e){
e.printStackTrace();
}
}
- ObjectInputStream(对象字节输入流)
- 构造方法:ObjectInputStream(InputStream in)
- 常用方法:final Object readObject()
- 对象逆序列化:把磁盘文件中暂存的对象取出实例化为对象
public void objectInputStreamTest(){
try(
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("E:\\java_study\\demo3\\images\\objectTest01.txt"));
) {
Student s = (Student) objectInputStream.readObject();
System.out.println(s);
} catch (Exception e) {
e.printStackTrace();
}
}
- OutputStream(抽象类)
- FileOutputStream
- 常用构造器:FileOutputStream(String name)
- void write(byte[] b)
- void write(byte[] b, int off, int len)
- void write(int b)
public void fileOutputStreamTest() throws Exception {
OutputStream os = new FileOutputStream("E:\\java_study\\demo3\\images\\test2.txt");//先清空之前的数据,覆盖
OutputStream os1 = new FileOutputStream("E:\\java_study\\demo3\\images\\test2.txt",true);//追加管道,不会清除之前的数据
//void write(int b)
os.write(98);
os.write('a');
//void write(byte[] b)
byte[] buffer1 = {'a',97,98};
os.write(buffer1);
byte[] buffer2 = "我爱中国!!".getBytes();
os.write(buffer2);
os.write("\r\n".getBytes());//换行
//void write(byte[] b, int off, int len)
os.write(buffer1, 0, 2);
//刷新数据,数据才生效,流可继续使用
os.flush();
os.write(buffer1, 0, 2);
//释放资源,包括刷新,关闭后流不可继续使用
os.close();
- BufferedOutputStream
- 构造器:BufferedOutputStream(OutputStream out)
- 写方法:public void write(byte[] b,int off, int len)
- 写方法:public void write(int b)
public void bufferedIOStreamTest() throws Exception{
try(
OutputStream os = new FileOutputStream("E:\\java_study\\demo3\\images\\text.txt");
OutputStream out = new BufferedOutputStream(os);
) {
out.write(98);
byte[] buffer = {'a',97,98};
out.write(buffer,0,buffer.length);
}
}catch (Exception e){
e.printStackTrace();
}
}
- ObjectOutputStream(对象字节输出流)
- 构造方法:ObjectOutputStream(OutputStream out)
- 声明为ObjectOutputStream 对象,以便可以调用ObjectOutputStream的独特方法:writeObject(Object obj)
- 对象序列化:以内存为基准,把内存中的对象存储到磁盘文件中去,称为对象序列化
- try(){}catch{}语法,使得在输出流运行完毕后自动调用close()方法,关闭流,节省空间
public void objectOutputStreamTest(){
Student student = new Student("张三",18,"男");
try(
ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream("E:\\java_study\\demo3\\images\\objectTest01.txt"));
) {
o.writeObject(student);
} catch (IOException e) {
e.printStackTrace();
}
}
- PrintStream
- 构造方法:PrintStream(File file)
- 构造方法:PrintStream(OutputStream out)
- 构造方法:PrintStream(String fileName) (常用)
- 常用方法:void print()可打印几乎所有类型数据
PrintStream p = new PrintStream(new FileOutputStream("E:\\java_study\\demo3\\images\\test3.txt"));
PrintStream p1 = new PrintStream("E:\\java_study\\demo3\\images\\test3.txt");
PrintWriter pw = new PrintWriter("E:\\java_study\\demo3\\images\\test3.txt");
p.print("lalala");
p.flush();
应用(打印重定向)
//打印流重定向
public void test01() throws Exception{
PrintStream p1 = new PrintStream("E:\\java_study\\demo3\\images\\test3.txt");
System.setOut(p1);//把系统打印流改到自己文件
}