系列文章目录
Java_IO——概述
Java_IO——字节流
Java_IO——字符流
Java_IO——缓冲流
Java_IO——属性集与转换流
Java_IO——序列化与反序列化、打印流
Java_IO——IO异常的处理
文章目录
前言
一切数据在计算机中的底层传输与存储方式都是二进制的数字,都是一个个字节,所以字节流可以传输任意文件数据
输出流
OutputStream类(字节输出流)
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开始输出到此输出流(字节数组的一部分)参数:
int off:数组开始的索引
int len:写多少 - public abstract void write(int b)
将指定的字节输出流
注意:这些方法会抛出IOException
FileOutputStream类(文件字节输出流,字节输出流(OutputStream)的子类)
- 把内存中的数据写入到硬盘中的文件中
- 构造方法:
- FileOutputStream(Strng name)
创建一个具有指定名称的文件,写入数据的输出流
参数:String name:文件的路径 - FileOutputStream(File file)
创建一个向指定File对象表示的文件中写入数据的流
参数:File file:文件
- FileOutputStream(Strng name)
- 运行方式:
- 创建一个对象(FileOutputStream)
- 会根据构造方法中传递的文件/文件路径,创建一个空的文件
- 会把FileOutputStream对象指向创建好的文件
注意:此类中的构造方法抛出了FileOutputStream异常
使用
写出字节数据:
- 创建一个FileOutputStream对象,构造方法中传递写入数据的目的地
- 调用FileOutputStream对象中的方法write,把数据写入到文件中
- 释放资源(流会占用一定的内存,使用完毕要释放内存,提高程序效率)
package DemoOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo01OutputStream {
public static void main(String[] args) throws IOException {
//创建输出流,并获取文件路径
FileOutputStream fos = new FileOutputStream("D:\\***\\a.txt");
//调用write方法
fos.write(97);
//关闭输出流
fos.close();
}
}
多字节输出:
- 可以将字节数据输入到字节数组中,再使用write方法
- 字符写入:
- 可以将String类中的方法:byte[] getBytes()把字符串,转换为字节数组
Tips:
- 若写的第一个字节是正数(0~127),那么显示时会查询ASCII表
- 若写的第一个字节是负数,那么第一个字节与第二个字节会组成一个中文显示,会查询系统默认码表(GBK)
package DemoOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
public class Demo02OutputStream {
public static void main(String[] args) throws IOException {
//创建输出流,并获取文件路径
FileOutputStream fos1 = new FileOutputStream("D:\\***\\b.txt");
//将数据转换为数组
byte[] bytes1 = {-65,66,-67,68,69};
System.out.println(Arrays.toString(bytes1));
//调用write方法
fos1.write(bytes1);
//关闭输出流
fos1.close();
}
}
数据的追加续写:
使用构造方法:
- FileOutputStream(Strng name,boolean append)
创建一个向现有的指定文件name中写入数据的输出文件流 - FileOutputStream(File file,boolean append)
创建一个向file对象指定的现有的文件中写入数据的输出文件流
参数:
- Strng name,File file:写入数据的目的地
- boolean append:
- true:不覆盖源文件,继续在文件的末尾追加数据
- false:创建一个新文件,覆盖源文件
数据换行:
- 写换行符号
- windows:\r\n
- linux:\n
- mac:\r
Tip:换行符也是字符串,需要先存到字符数组中再写入文件
package DemoOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
public class Demo03OutputStream {
public static void main(String[] args) throws IOException {
//创建一个向file对象指定的现有的文件中写入数据的输出文件流
FileOutputStream fos = new FileOutputStream("D:\\***\\a.txt",true);
//循环调用
for (int i = 0; i < 10; i++) {
fos.write("你好".getBytes());
//数据换行
fos.write("\r\n".getBytes());
}
关闭输出流
fos.close();
}
}
原理
java程序→JVM(java虚拟机)→OS(操作系统)→OS调用写数据的方法→把数据写入到文件中
图解:
输入流
InputStream类(字节输入流)
java.io.InputStream抽象类是表示字节输入流所有类的超类,可以读取字节信息到内存中
它定义了字节输入流的所有共性方法:
- public void close()
关闭此输出流并释放与此流相关联的所有系统资源 - public abstract int read()
从输入流读取数据的下一字节,读取后指针向下移一位,读到末尾返回-1 - public int read(byte[] b)
从输入流读取数据,并将它们存储到字节数组b中
FileInputStream类(文件字节输入流,字节输入流(InputStream))
从文件中读取字节
- 构造方法:
- FileInputStream(File file)
参数:File file:文件 - FileInputStream(String name)
参数:String name:文件的路径
- FileInputStream(File file)
注意:这些方法会抛出IOException
- 运行方式:
- 创建一个FileInputStream对象
- 把FileInputStream对象指定构造方法中要读取的文件
使用
输入字节数据:
- 创建FileInputStream对象,构造方法中绑定要读取的数据源
- 调用FileInputStream对象中的方法read,读取文件
- 释放资源
Tip:代码优化时,不知道有多少字节时,用while循环
package DemoInputStream;
import java.io.FileInputStream;
import java.io.IOException;
public class Demo01InputStream {
public static void main(String[] args) throws IOException {
//创建FileInputStream对象,并绑定要读取的数据源
FileInputStream fis = new FileInputStream("D:\\***\\c.txt");
//初始化表识
int len = 0;
//while循环调用read方法
while ((len = fis.read()) != -1) {
System.out.print((char) len);
}
//关闭输入流
fis.close();
}
}
一次读取多个字节:
- 创建FileInputStream对象,构造方法中绑定要读取的数据源
- 调用FileInputStream对象中的方法read,读取文件
- 从输入流读取一定数量的字节,并将其储存在缓存数组b中
- 释放资源
Tip:
此方法可用于读取中文,输出时,可以新建字符串,使用String类中的构造方法,将byte数组转为字符串
数组转字符串方法(String类构造方法):
- String(byte[] bytes)
- String(byte[] bytes,int offset,int length)
- 参数:
- byte[] bytes:目标数组
- int offset:起始索引
- int length:转换个数
- 参数:
package DemoInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;
public class Demo02InputStream {
public static void main(String[] args) throws IOException {
//创建FileInputStream对象,并绑定要读取的数据源
FileInputStream fis = new FileInputStream("D:\\***\\a.txt");
//新建字节数组
byte[] bytes = new byte[2];
//调用read方法,并将读取到的字节存入数组
int len = fis.read(bytes);
System.out.println(len);
System.out.println(Arrays.toString(bytes));
System.out.println(new String(bytes));
//关闭输入流
fis.close();
}
}
原理
Java程序→JVM→OS→OS调用读取数据的方法→读取文件
图解: