I/O中read及write各个方法区别

java I/O中,流式部分分为:Reader,Writer,InputStream,OutputStream和File。

具体内容,这里就不赘述,对I/O存在疑惑的朋友去该网址学习,很好的归纳了I/O: JAVA I/O介绍

本文主要介绍其中read方法和write方法的区别

read方法包括:

1. read(),此方法一个字节一个字节的读取

如以下代码,每次输出的都是读到的字节内容

package test;

import java.io.File;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Readtxt {

	public static void main(String[] args) {
		File file=new File("E:\\pic\\zz.txt");
		File file1=new File("E:\\pic\\zz1.txt");
		int count=0;
		try{
		FileInputStream input=new FileInputStream(file);
		FileOutputStream output=new FileOutputStream(file1);
		int len=-1;
//		byte[] buffer=new byte[10];
		while((len=input.read())!=-1){
			System.out.println(len);
			output.write(len);

		}
		input.close();
		output.close();
		}catch(IOException e){
			e.printStackTrace();
		}


	}

}

这里输出的len都是读取实际内容,结果如下

72
101
108
108
111
44
109
121
32
110
97
109
101
32
105
115
32
122
101
110
103
122
104
101
110
13
10
13
10
105
39
109
32
50
51
32
121
101
97
114
115
32
111
108
100
46


2. read(buffer),此方法按buffer进行读取,如果文件总共读取的byte长度是46,buffer长度为10,则读取4次,每次读取10个字节,最后一次读取6个字节。

这里len输出的每次读取的buffer长度,最后一次是6

package test;

import java.io.File;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Readtxt {

	public static void main(String[] args) {
		File file=new File("E:\\pic\\zz.txt");
		File file1=new File("E:\\pic\\zz1.txt");
		int count=0;
		try{
		FileInputStream input=new FileInputStream(file);
		FileOutputStream output=new FileOutputStream(file1);
		int len=-1;
		byte[] buffer=new byte[10];
		while((len=input.read(buffer))!=-1){
			System.out.println(len);
			output.write(buffer);

		}
		input.close();
		output.close();
		}catch(IOException e){
			e.printStackTrace();
		}


	}

}


输出结果如下

10
10
10
10
6



3. read(buffer,0,len) 则按照len长度进行读取,例如len长度为5,则读取9次,每次读取5个字节,最后一次读取1个字节。

和第二种方法基本相同,不同的是按照len长度进行读取

package test;

import java.io.File;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Readtxt {

	public static void main(String[] args) {
		File file=new File("E:\\pic\\zz.txt");
		File file1=new File("E:\\pic\\zz1.txt");
		int count=0;
		try{
		FileInputStream input=new FileInputStream(file);
		FileOutputStream output=new FileOutputStream(file1);
		int len=-1;
		byte[] buffer=new byte[10];
		while((len=input.read(buffer,0,5))!=-1){
			System.out.println(len);
			output.write(buffer,0,5);

		}
		input.close();
		output.close();
		}catch(IOException e){
			e.printStackTrace();
		}


	}

}

输出结果

5
5
5
5
5
5
5
5
5
1


write方法包括:(参照read方法):

1. write()

2. write(buffer) 在这里,和read方法不同的是,如果byte长度是46,则输出5次,每次读取10个字节,最后一次只有6个字节,却多出了4个字节,而采用第三种方法就可以避免你多余输出,占了内存。

3. write(buffer,0,len)


  • 7
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Linux 内核,`struct file_operations` 是一个非常重要的结构体,用于定义文件操作的函数指针。下面是各个成员的具体定义: 1. `struct module *owner`:指向拥有这个结构体的模块的指针。 2. `loff_t (*llseek) (struct file *, loff_t, int)`:定义了文件定位的函数指针,用于在文件寻找一个指定的位置。这个函数的第一个参数是指向文件对象的指针,第二个参数是要定位的文件偏移量,第三个参数是定位的方式。 3. `ssize_t (*read) (struct file *, char __user *, size_t, loff_t *)`:定义了文件读取的函数指针,用于从文件读取数据。这个函数的第一个参数是指向文件对象的指针,第二个参数是指向用户空间缓冲区的指针,第三个参数是要读取的字节数,第四个参数是读取的起始位置。 4. `ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *)`:定义了文件写入的函数指针,用于向文件写入数据。这个函数的第一个参数是指向文件对象的指针,第二个参数是指向用户空间缓冲区的指针,第三个参数是要写入的字节数,第四个参数是写入的起始位置。 5. `ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t)`:定义了异步文件读取的函数指针,用于从文件异步读取数据。这个函数的第一个参数是指向异步 I/O 控制块的指针,第二个参数是指向一个 iovec 结构体数组的指针,每个结构体描述了一个缓冲区,第三个参数是读取的字节数,第四个参数是读取的起始位置。 6. `ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned long, loff_t)`:定义了异步文件写入的函数指针,用于向文件异步写入数据。这个函数的参数和 `aio_read` 相同。 7. `int (*readdir) (struct file *, void *, filldir_t)`:定义了目录读取的函数指针,用于读取目录的文件列表。这个函数的第一个参数是指向目录文件对象的指针,第二个参数是指向一个目录项结构体的指针,第三个参数是一个函数指针,用于填充目录项结构体。 8. `unsigned int (*poll) (struct file *, struct poll_table_struct *)`:定义了文件的 poll 函数指针,用于检查文件描述符是否可以进行读取或写入操作。这个函数的第一个参数是指向文件对象的指针,第二个参数是指向 poll_table_struct 结构体的指针,用于注册等待事件。 9. `long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long)`:定义了文件的非阻塞 I/O 控制函数指针,用于控制和查询设备的状态。这个函数的第一个参数是指向文件对象的指针,第二个参数是 ioctl 命令,第三个参数是 ioctl 参数。 10. `long (*compat_ioctl) (struct file *, unsigned int, unsigned long)`:定义了文件的兼容性非阻塞 I/O 控制函数指针,用于支持旧版本的 ioctl 命令。这个函数的参数和 `unlocked_ioctl` 相同。 11. `int (*mmap) (struct file *, struct vm_area_struct *)`:定义了文件的内存映射函数指针,用于将文件映射到进程的虚拟内存空间。这个函数的第一个参数是指向文件对象的指针,第二个参数是指向 vm_area_struct 结构体的指针,用于描述映射的内存区域。 12. `int (*open) (struct inode *, struct file *)`:定义了文件的打开函数指针,用于打开文件并返回文件对象。这个函数的第一个参数是指向 inode 结构体的指针,第二个参数是指向文件对象的指针。 13. `int (*flush) (struct file *, fl_owner_t id)`:定义了文件的刷新函数指针,用于刷新文件的缓存数据。这个函数的第一个参数是指向文件对象的指针,第二个参数是一个所有者标识符。 14. `int (*release) (struct inode *, struct file *)`:定义了文件的释放函数指针,用于释放文件对象和相关资源。这个函数的第一个参数是指向 inode 结构体的指针,第二个参数是指向文件对象的指针。 总之,`struct file_operations` 的各个成员定义了文件操作的各种函数指针,这些函数指针实现了文件的读取、写入、定位、异步 I/O、目录读取、poll、ioctl、内存映射、打开、刷新和释放等功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值