java字节流

字节输出流

java.io.OutputStream抽象类是表示字节输出流的所有类的超类,将指定的字节信息写出到目的地。它定义了字节输出流的基本共性功能方法。

  • public void close(): 关闭此输出流并释放与此流相关联的任何系统资源。
  • public void flush(): 刷新此输出流并强制任何缓冲的输出字节被写出。
  • public void write(byte[] b): 将b.length字节从指定的字节数组写入此输出流。
  • public void write(byte[] b, int off, int len): 从指定的字节数组写入len字节,从偏移量off开始输出到此输出流。
  • public abstract void write(int b): 将指定的字节输出到此输出流

需要定义OutputStream子类的应用程序必须提供至少一种可写入一个输出字节的方法。

FileOutputStream

java.io.FileOutputStream extends OutputStream

FileOutputStream 是文件字节输出流,它的作用是:把内存中的数据写入到硬盘的文件中

构造方法:

  • FileOutputStream(String name)创建一个向具有指定名称的文件中写入数据的输出文件流。
  • FileOutputStream(File file) 创建一个向指定File对象表示的文件中写入数据的文件输出流。
  • 参数:写入数据的目的地,name是一个路径,file是一个java中抽象的文件
  • 构造方法的作用:
    1. 创建一个FileOutputStream对象
    2. 会根据构造方法中传递的文件/文件路径,创建一个空的文件
    3. 会把FileOutputStream对象指向创建好的文件。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Demo01FileOutputStream {
public static void main(String[] args) throws IOException {
//默认覆盖写,追加写需为append参数赋值true
//OutputStream os = new FileOutputStream("G:\\test1\\aa.txt",true);

OutputStream os = new FileOutputStream("G:\\test1\\aa.txt");
os.write(49);
os.write(48);
os.write(48);
byte[] bytes = "你好".getBytes();
os.write(bytes);
byte[] bytes1 = {50,50,50,50,50};
os.write(bytes1);
os.close();
}
}

换行

如果是文本文件,适当地加上换行,才能有较高的可阅读性,但是换行对于不同的操作系统,又是不一致的

  • windows: "\r\n"
  • linux: "/n"
  • mac: "/r"

字节输入流

java.io.InputStream: 字节输入流

此抽象类是表示字节输入流的所有类的超类

定义了所有子类共性的方法:

  • int read() : 从输入流中读取数据的下一个字节。
  • int read(byte[] b):从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中。
  • void close():关闭此输出流并释放与该流关联的所有系统资源。

FileInputStream

java.io.FileInputStream extends InputStream

FileInputStream: 文件字节输入流

作用:把硬盘文件中的数据,读取到内存中使用

构造方法:

  • FileInputStream(String name)
  • FileInputStream(File file)
  • 参数:读取文件的数据源,name为文件的路径,file是java中的文件对象
  • 构造方法的作用:
    1. 会创建一个FileInputStream对象
    2. 会为FileInputStream对象指定要读取的文件

读取数据的原理(硬盘 –> 内存)

​ java程序 –> JVM –> OS –> OS读取数据的方法 –> 读取文件

字节输入流的使用步骤(重点):

  1. 创建FileInputStream对象,构造方法中绑定要读取的数据源
  2. 使用FileInputStream对象中的方法read,读取文件
  3. 释放资源
1
2
3
4
5
6
7
8
9
10
public class Demo01FileInputStream {
public static void main(String[] args) throws IOException {
InputStream is = new FileInputStream("G:\\test1\\aa.txt");
int len = 0; // 记录要读取到的字节
while ((len = is.read()) != -1) {
System.out.println(len);
}
is.close();
}
}

一次读取多个字节

int read(byte[] b) :从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中

明确:

  1. 方法的参数byte[]的作用?
    • 起到缓冲作用,存储每次读到的多个字节
    • 数组的长度一般定义为1024(1kb)或者1024的整数倍
  2. 方法的返回值int是什么?
    • 每次读取到的有效字节个数(少于或等于byte数组的长度,因为文件的长度不一定是数组长度的整数倍)
1
2
3
4
5
6
7
8
9
10
11
public class Demo02FileInputStream {
public static void main(String[] args) throws IOException {
InputStream is = new FileInputStream("G:\\test1\\aa.txt");
byte[] bytes = new byte[1024];
int len = 0;
while((len = is.read(bytes))!=-1){
System.out.println(new String(bytes,0,len));
}
is.close();
}
}

文件复制综合案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Demo01FileCopy {
public static void main(String[] args) throws IOException {
// 1.字节输入流对象
FileInputStream fis = new FileInputStream("G:\\test1\\aa.png");
// 2.字节输出流对象
FileOutputStream fos = new FileOutputStream("G:\\test1\\bb.png");
// 3.使用数组缓冲读取多个字节,写入多个字节
byte[] bytes = new byte[1024];
int len = 0;
while((len = fis.read(bytes))!=-1){
fos.write(bytes,0,len);
}
// 释放资源
// 先关闭写的,后关闭读的,写的完了,读的一定是完了
fos.close();
fis.close();
}
}


java字节流
https://blog.wangxk.cc/2020/10/01/java字节流/
作者
Mike
发布于
2020年10月1日
许可协议