2.字节流
2.1 IO概述和分类
IO流概述
Java.io 包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标。
Java.io 包中的流支持很多种格式,比如:基本类型、对象、本地化字符集等等。
一个流可以理解为一个数据的序列。输入流表示从一个源读取数据,输出流表示向一个目标写数据。
Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。
- IO:输入/输出(Input/Output)
- 流:是一种抽象概念,是对数据传输的总称。也就是说数据在设备之间传输称为流,流的本质是数据传输。
IO流的分类
- 按照数据的流向
- 输入流:读数据
- 输出流:写数据
- 按照数据类型来分
- 字节流
- 字节输入流,字节输出流
- 字符流
- 字符输入流,字符输出流
一般情况下,我们说IO流的分类是按照数据类型来分的
字符流与字节流使用技巧:
若果数据通过Window自带的记事本本地软件打开,我们还可以读懂里面的内容就使用字符流,否则使用字节流。如果你不知道该使用哪种类型的流,就使用字节流。
2.2 字节流写数据
字节流抽象基类
- InputStream
这个抽象类是表示字节输入流的所有类的超类
public abstract class InputStream
extends InputStream
InputStream 是用来从 CDR 编组流中读取 IDL 类型的 Java API。这些方法供 ORB 用来解组 IDL 类型以及从 Any 中析取 IDL。_array 形式的方法可以直接用来读取 IDL 类型的序列和数组。
该流用于从文件读取数据,它的对象可以用关键字 new 来创建。
有多种构造方法可用来创建对象。
可以使用字符串类型的文件名来创建一个输入流对象来读取文件:
InputStream f = new FileInputStream("C:/java/hello");
也可以使用一个文件对象来创建一个输入流对象来读取文件。我们首先得使用 File() 方法来创建一个文件对象:
File f = new File("C:/java/hello"); InputStream in = new FileInputStream(f);
创建了InputStream对象,就可以使用下面的方法来读取流或者进行其他的流操作。
- OutputStream
**这个抽象类是表示字节输出流的所有类的超类,输出流接受输出字节并将这些字节发送到某个接收器。 **
public abstract class OutputStream
extends OutputStream - 子类名特点:子类名称都是以其父类名作为子类名的后缀
FileOutputStream :文件输出流用于将数据写入File
- FileOutStream(String name):创建文件输出流已指定的名称写入文件
该类用来创建一个文件并向文件中写数据。
如果该流在打开文件进行输出前,目标文件不存在,那么该流会创建该文件。
有两个构造方法可以用来创建 FileOutputStream 对象。
使用字符串类型的文件名来创建一个输出流对象:
OutputStream f = new FileOutputStream("C:/java/hello")
也可以使用一个文件对象来创建一个输出流来写文件。我们首先得使用File()方法来创建一个文件对象:
File f = new File("C:/java/hello"); OutputStream fOut = new FileOutputStream(f);
创建OutputStream 对象完成后,就可以使用下面的方法来写入流或者进行其他的流操作。
使用字节输出流写数据的步骤
- 创建字节输出流对象(调用系统功能创建了文件、创建了字节输出流对象、让字节输出流对象那个指向文件
- 调用字节输出流对象的写数据方法
- 释放资源(关闭此文件输出流并释放与此相关联的任何系统资源)
代码示例:
package com.ithmm_02; import java.io.FileOutputStream; import java.io.IOException; public class InputStream { public static void main(String[] args) throws IOException { //创建字节输出流对象 //FileOutStream(String name):创建文件输出流已指定的名称写入文件 FileOutputStream fos = new FileOutputStream("Io\\fas.txt"); /* 1.调用系统功能创建文件 2.创键字节输出流对象 3.让字节输出流对象指向创建好的文件 */ //void write (int b),将指定字节写入文件输出流 fos.write(97); fos.write(98); fos.write(99); fos.write(55); // void close() // 关闭此输出流并释放与此流有关的所有系统资源。 fos.close(); //fos.write(121);//Stream Closed } }
字节流写数据的3中方法
方法名 | 说明 |
void write(byte[] b) | 将 b.length 个字节写入此输出流。 |
void write(byte[] b, int off, int len) | 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。 |
void write(int b) | 将指定 byte 写入此输出流。 |
package com.ithmm_02; import java.io.FileOutputStream; import java.io.IOException; public class FileOutputStreamDemo02 { public static <FileOutStream> void main(String[] args) throws IOException { /* void write(byte[] b) 将 b.length 个字节写入此输出流。 void write(byte[] b, int off, int len) 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。 void write(int b) 将指定 byte 写入此输出流。 */ //fileOutStream(String name),创键文件输出以指定的文件名写入文件夹 FileOutputStream fos = new FileOutputStream("Io\\fos.txt"); // this(var1 != null ? new File(var1) : null, false); // FileOutputStream fos = new FileOutputStream(new File("Io\\fos.txt")); //FileOutStream (File file); 创键文件输出流以写入由指定的File对象表示的文件 // FileOutputStream fos2 = new FileOutputStream( new File("Io\\fos.txt")); // void write(int b) 将指定 byte 写入此输出流。 // fos.write(97); // fos.write(98); // fos.write(99); //void write(byte[] b) 将 b.length 个字节写入此输出流。 // byte[] bys = {97,98,99, 32, 99}; // fos.write(bys); // fos.close(); // void write(byte[] b) 将 b.length 个字节写入此输出流 byte[] bys1 = "abcdefg".getBytes(); // fos.write(bys1); //void write(byte[] b, int off, int len) 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。 fos.write(bys1,0,bys1.length); //释放 fos.close(); } }
2.4 字节流写数据的两个小问题
2.5 字节流写入数据的异常处理
finally:在异常处理是提供finally块;来执行所有清除操作,比如说IO流中的释放资源
特点:被finally控制的语句一定会执行,除非JVM退出
try{ 可能出现的异常代码; }catch(异常类名 变量名){ 异常的处理代码; }finally{ 执行所有的清除操作; }