总结理论io——字节流

本文介绍了计算机中输入输出(IO)操作的概念,包括输入流与输出流的基本分类及作用。详细解析了字节流和字符流的区别,并通过具体示例展示了如何使用FileOutputStream和FileInputStream进行文件的写入和读取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当需要把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作。

当把持久设备上的数据读取到内存中的这个动作称为输入(读)Input操作。

因此我们把这种输入和输出动作称为IO操作。

 IO流流向分类

按照流向分:输入流与输出流,每个IO流对象均要绑定一个IO资源

分类关系如下:

字节输入流 7 InputStream 抽象类

FileInputStream 操作文件的字节输入流

字节输出流 OutputStream 抽象类

FileOutputStream 操作文件的字节输出流

按照传输方式:分为字节流和字符流

    字符流  按照字符的方式读写

    字节流  按照字节的方式读写

一切均为字节

在数据传输过程中,一切数据(文本、图像、声音等)最终存储的均为一个个字节,即二进制数字。所以数据传输过程中使用二进制数据可以完成任意数据的传递。

为什么打开一个文本文件我们看到的不是0101001这些数据?

我们向一个文件中存储一定的数据(一些数字),如果使用文本方式打开,则会以文本的方式解释数据。如果以视频的方式打开,则会以视频的方式解释数据。音频、可行执行文件等亦是如此。所以,在文件传输过程中,我们要时刻明确,传输的始终为二进制数据。

字节流

  字节输出流OutputStream

OutputStream此抽象类,是表示输出字节流的所有类的超类。操作的数据都是字节,定义了输出字节流的基本共性功能方法。

输出流中定义都是写write方法

abstract  Input  Streamcreate_input_stream()
          返回一个具有相同缓冲区的输入流。
 ORBorb()
          返回创建此 OutputStream 的 ORB。
abstract  voidwrite_any(Any value)
          在此输出流上写入一个 Any。
abstract  voidwrite_boolean_array(boolean[] value, int offset, int length)
          在此输出流上写入一个 boolean 数组。
abstract  voidwrite_boolean(boolean value)
          将一个 boolean 值写入此流。
abstract  voidwrite_char_array(char[] value, int offset, int length)
          在此输出流上写入一个 char 数组。
abstract  voidwrite_char(char value)
          将一个 char 值写入此流。

FileOutputStream类

OutputStream有很多子类,其中子类FileOutputStream可用来写入数据到文件。

FileOutputStream类,即文件输出流,是用于将数据写入 File的输出流。

       构造方法

FileOutputStream(File file)
          创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
FileOutputStream(String name)
          创建一个向具有指定名称的文件中写入数据的输出文件流。

FileOutputStream类写入数据到文件中(三个方法)

将数据写到文件中, 

步骤

u 1.创建输出流对象

u 2.调用输出流对象的写数据方法

u 3.释放资源


	代码演示:
public class FileOutputStreamDemo {
	public static void main(String[] args) throws IOException {
		//需求:将数据写入到文件中。
		//创建存储数据的文件。
		File file = new File("c:\\file.txt");
		//创建一个用于操作文件的字节输出流对象。一创建就必须明确数据存储目的地。
		//输出流目的是文件,会自动创建。如果文件存在,则覆盖。
		FileOutputStream fos = new FileOutputStream(file);
		//调用父类中的write方法。
		byte[] data = "abcde".getBytes();
		fos.write(data);
		//关闭流资源。
		fos.close();
	}
}

给文件中续写和换行

我们直接new FileOutputStream(file)这样创建对象,写入数据,会覆盖原有的文件,那么我们想在原有的文件中续写内容怎么办呢?

继续查阅FileOutputStream的API。发现在FileOutputStream的构造函数中,可以接受一个boolean类型的值,如果值true,就会在文件末位继续添加。

FileOutputStream(String name, boolean append)
          创建一个向具有指定 name 的文件中写入数据的输出文件流。

FileOutputStream(String file, boolean append)
          创建一个向具有指定 file 的文件中写入数据的输出文件流。

public class FileOutputStreamDemo2 {
	public static void main(String[] args) throws Exception {
		File file = new File("c:\\file.txt");
		FileOutputStream fos = new FileOutputStream(file, true);
		String str = "\r\n"+"itcast";
		fos.write(str.getBytes());
		fos.close();
	}
}

 字节输入流InputStream

InputStream此抽象类,是表示字节输入流的所有类的超类。,定义了字节输入流的基本共性功能方法。

 int read():读取一个字节并返回,没有字节返回-1.

 int read(byte[]): 读取一定量的字节数,并存储到字节数组中,返回读取到的字节数。

public class FileInputStreamDemo {
	public static void main(String[] args) throws IOException {
		File file = new File("c:\\file.txt");
		//创建一个字节输入流对象,必须明确数据源,其实就是创建字节读取流和数据源相关联。
		FileInputStream fis = new FileInputStream(file);
		//读取数据。使用 read();一次读一个字节。
		int ch = 0;
		while((ch=fis.read())!=-1){
			System.out.println("ch="+(char)ch);
		}
		// 关闭资源。
		fis.close();
	}
}

1.1.1    读取数据read(byte[])方法

在读取文件中的数据时,调用read方法,每次只能读取一个,太麻烦了,于是我们可以定义数组作为临时的存储容器,这时可以调用重载的read方法,一次可以读取多个字符。

public class FileInputStreamDemo2 {

    publicstaticvoidmain(String[] args) throws IOException {

        /*

         * 演示第二个读取方法,read(byte[]);

         */

        File file = new File("c:\\file.txt");

        // 创建一个字节输入流对象,必须明确数据源,其实就是创建字节读取流和数据源相关联。

        FileInputStream fis = new FileInputStream(file);      

        //创建一个字节数组。

        byte[] buf = new byte[1024];//长度可以定义成1024的整数倍。       

        int len = 0;

        while((len=fis.read(buf))!=-1){

            System.out.println(newString(buf,0,len));

        }

        fis.close();

    }

}















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值