1. 什么是字节流?
如果是对文件、图片、视频、音频等数据进行复制和转移时,适合使用字节流
2. FileInputStream(文件字节输入流)
作用:以内存为基准,可以把磁盘文件中的数据以字节的形式读入到内存中去。
应用场景:适合做数据的转移,如:文件复制等。
构造器 | 说明 |
---|---|
public FileInputStream(File file) | 创建字节输入流管道与源文件接通 |
public FileInputStream(String pathname) | 创建字节输入流管道与源文件接通【简化写法推荐使用】 |
方法 | 说明 | 注意 |
---|---|---|
public int read() | 每次读取一个字节返回,如果发现没有数据可读会返回-1 | 这种方式读取数据的性能很差! 读取中文会乱码,无法避免! |
public int read(byte[] buffer) | 每次用一个字节数组去读取数据,返回字节数组读取了多少个字节,如果发现没有数据可读会返回-1 | 读取多少就倒出多少 性能得到了明显提示!!! 这种方案也不能避免读取汉字输出乱码的问题!!! |
public byte[] readAllBytes() throws IOException | 直接将当前字节输入流对应的文件对象的字节数据装到一个字节数组中返回 | |
inputStream.close() | 关闭文档流 |
public static void Test2() throws IOException {
File file = new File("D:\\repo\\javasepro\\helloworld-app\\src\\com\\ming\\File_\\abc.txt");
// 1. public FileInputStream(File file) 创建字节输入流管道与源文件接通
InputStream inputStream = new FileInputStream(file);
// 2. public FileInputStream(String pathname) 创建字节输入流管道与源文件接通【简化写法推荐使用】
InputStream inputStream1 = new FileInputStream("D:\\repo\\javasepro\\helloworld-app\\src\\com\\ming\\File_\\abc.txt");
// 3. public int read() 每次读取一个字节返回,如果发现没有数据可读会返回-1
// 注意:这种方式读取数据的性能很差!
// 读取中文会乱码,无法避免!
// 流使用完成之后必须关闭流
// int read = inputStream.read();
// System.out.println((char) read); // a
//
// int read2 = inputStream.read();
// System.out.println((char) read2); // b
//
// int read3 = inputStream.read();
// System.out.println(read3); // -1
// 使用循环改造
// int b; // 用于记住的字节
// while ((b = inputStream.read()) != -1) {
// System.out.print((char) b);
// }
// 4. public int read(byte[] buffer) 每次用一个字节数组去读取数据,返回字节数组读取了多少个字节,如果发现没有数据可读会返回-1
// 注意:读取多少就倒出多少
// 性能得到了明显提示!!!
// 这种方案也不能避免读取汉字输出乱码的问题!!!
// byte[] buffer = new byte[3];
//
// int len = inputStream1.read(buffer);
// String s = new String(buffer, 0, len);
// System.out.print(s);
// System.out.println("当前读取的字节数:" + len);
//
// int len2 = inputStream1.read(buffer);
// String s2 = new String(buffer, 0, len2);
// System.out.print(s2);
// System.out.println("当前读取的字节数:" + len2);
//
// int len3 = inputStream1.read(buffer);
// System.out.println("当前读取的字节数:" + len3);
// 代码改造
byte[] buffer = new byte[3];
int len; // 每次读取了多少个字节
while ((len = inputStream1.read(buffer)) != -1) {
System.out.print(new String(buffer, 0, len));
}
// 5. 关闭流
inputStream.close();
inputStream1.close();
}
- 一次性读取全部字节(解决中文乱码问题)【推荐使用readAllBytes】
private static void Test3() throws IOException {
File file = new File("D:\\repo\\javasepro\\helloworld-app\\src\\com\\ming\\File_\\abc.txt");
InputStream inputStream = new FileInputStream(file);
// 1. 方式一:自定义字节数组与读取文件的大小一致
byte[] buffer = new byte[(int) file.length()];
int len = inputStream.read(buffer);
String s = new String(buffer, 0, len);
System.out.println(s);
// 2. 方式二:public byte[] readAllBytes() throws IOException 直接将当前字节输入流对应的文件对象的字节数据装到一个字节数组中返回
byte[] readAllBytes = inputStream.readAllBytes();
System.out.println(new String(readAllBytes));
inputStream.close();
}
3. FileOutputStream(文件字节输出流)
作用:以内存为基准,内存中的数据以字节的形式写入到文件中去。
构造器 | 说明 |
---|---|
public FileOutputStream(File file) | 创建字节输出流管道与源文件对象接通 |
public FileOutputStream(String filepath) | 创建字节输出流管道与源文件对象接通 |
public FileOutputStream(File file, boolean append) | 创建字节输出流管道与源文件对象接通,可以追加数据 |
public FileOutputStream(String filepath, boolean append) | 创建字节输出流管道与源文件对象接通,可以追加数据 |
方法 | 说明 |
---|---|
public void write(int a) | 写一个字节出去 |
public void write(byte[] buffer) | 写一个字节数组出去 |
public void write(byte[] buffer, int pos, int len) | 写一个字节数组的一部分出去 |
private static void Test4() throws IOException {
// 构造器
File file = new File("D:\\repo\\javasepro\\helloworld-app\\src\\com\\ming\\File_\\123.txt");
// 1. public FileOutputStream(File file) 创建字节输出流管道与源文件对象接通
// OutputStream outputStream = new FileOutputStream(file);
// 2. public FileOutputStream(String filepath) 创建字节输出流管道与源文件对象接通
// OutputStream outputStream1 = new FileOutputStream("D:\\repo\\javasepro\\helloworld-app\\src\\com\\ming\\File_\\123.txt");
// 3. public FileOutputStream(File file, boolean append) 创建字节输出流管道与源文件对象接通,可以追加数据
OutputStream outputStream = new FileOutputStream(file, true);
// 4. public FileOutputStream(String filepath, boolean append) 创建字节输出流管道与源文件对象接通,可以追加数据
// OutputStream outputStream1 = new FileOutputStream("D:\\repo\\javasepro\\helloworld-app\\src\\com\\ming\\File_\\123.txt", true);
// 方法
// 1. public void write(int a) 写一个字节出去
outputStream.write('a');
// 2. public void write(byte[] buffer) 写一个字节数组出去
byte[] buffer = "b我爱你中国abc".getBytes();
outputStream.write(buffer);
// 3. public void write(byte[] buffer, int pos, int len) 写一个字节数组的一部分出去
byte[] buffer2 = "b我爱你中国abc".getBytes();
outputStream.write(buffer, 1, 15);
// 4. 换行
outputStream.write("\r\n".getBytes());
outputStream.close();
}
4. 文件复制
通用的复制方法,可以复制所有类型的文件数据
private static void Test5(String sourcePath, String targetPath) throws IOException {
// 1. 创建字节输入流管道与源文件接通
InputStream inputStream = new FileInputStream(sourcePath);
// 2. 创建字节输出流管道与源文件接通
OutputStream outputStream = new FileOutputStream(targetPath);
// 3. 创建字节数组,负责转移字节数据
byte[] buffer = new byte[1024];
// 4. 从字节输入流中读取字节数据,写出到字节输出流中,读多少写多少
int len; // 记住:每次读取了多少个字节
while ((len = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, len);
}
// 5. 关闭流 先创建的后关 后创建的先关
outputStream.close();
inputStream.close();
}