Java 流(Stream)、文件(File)和IO
Java.io包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标。Java.io包中的流支持很多种格式,比如:基本类型、对象、本地化字符集等等。
一个流可以理解为一个数据的序列。输入流表示从一个源读取数据,输出流表示向一个目标写数据。
Java为I/O提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。
java IO流
I/O类库中使用“流”这个抽象概念。Java对设备中数据的操作是通过流的方式。表示任何有能力产出数据的数据源对象,或者是有能力接受数据的接收端对象。“流”屏蔽了实际的I/O设备中处理数据的细节。IO流用来处理设备之间的数据传输。设备是指硬盘、内存、键盘录入、网络等。
IO的分类可以为:
- 流按操作数据类型的不同分为两种:字节流与字符流。
- 流按流向分为:输入流,输出流(以程序为参照物,输入到程序,或是从程序输出)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vM2caHH4-1590807953678)(C:\Users\ABC\Desktop\暂存\8926909-b2b4859ffeb3ae26.png)]
一、字节流
1、Inpustream
InputStream
有read
方法,一次读取一个字节,OutputStream
的write
方法一次写一个int
。这两个类都是抽象类。意味着不能创建对象,那么需要找到具体的子类来使用。
示例一:使用 read()
方法,一次读取一个字节,读到文件末尾返回-1.
// 打开流
FileInputStream fis = new FileInputStream(path);
int len;
while ((len = fis.read()) != -1) {
System.out.print((char) len);
}
// 使用完关闭流
fis.close();
示例二:使用read()
方法的时候,可以将读到的数据装入到字节数组中,一次性的操作数组,可以提高效率。
// 打开流
FileInputStream fis = new FileInputStream(path);
// 通过流读取内容
byte[] byt = new byte[1024];
int len = fis.read(byt);
for (int i = 0; i <len; i++) {
System.out.print(byt[i]);
}
// 使用完关闭流
fis.close();
示例三:使用read(byte[] b,int off,int len)
把数组的一部分当做流的容器来使用
// 打开流
FileInputStream fis = new FileInputStream(path);
// 通过流读取内容
byte[] byt = new byte[1024];
// 从什么地方开始存读到的数据
int start = 5;
// 希望最多读多少个(如果是流的末尾,流中没有足够数据)
int maxLen = 6;
// 实际存放了多少个
int len = fis.read(byt, start, maxLen);
for (int i = start; i < start + maxLen; i++) {
System.out.print((char) byt[i]);
}
// 使用完关闭流
fis.close();
示例四:使用缓冲(提高效率),并循环读取(读完所有内容).
//使用字节数组当缓冲
FileInputStream fis = new FileInputStream(path);
byte[] byt = new byte[1024];
int len = 0;
while ((len = fis.read(byt)) != -1) {
System.out.println(new String(byt, 0, len));
}
fis.close();
2、OutputStream
OutputStram
的write
方法,一次只能写一个字节。为了提高效率,可以使用缓冲,在OutputStram
类中有write(byte[] b)
方法,将 b.length
个字节从指定的 byte
数组写入此输出流中。
// 打开文件输出流,流的目的地是指定的文件
FileOutputStream fos = new FileOutputStream(path,true);
// 通过流向文件写数据
byte[] byt = "java".getBytes();
fos.