21.NIO中FileChannel的使用

使用FileChannel读取下载文件 使用FileChannel读取下载文件前言一、FileChannel是什么?二、FileChannal的方法介绍1.open2.read3.write4.lock总结 前言 FileChannal的理解和使用场景 对于文件的复制,平时我们都是使用输入输出流进行操作,利用源文件创建出一个输入流,然后利用目标文件创建出一个输出流,最后将输入流的数据读取写入到输出流中。这样也是可以进行操作的。但是利用fileChannel是很有用的一个方式。它能直接连接输入输出流的文件通道,将数据直接写入到目标文件中去。而且效 阅读详情

FileChannel的使用

Java NIO中的FileChannel是一个连接到文件的通道。可以通过文件通道读写文件。
FileChannel无法设置为非阻塞模式,它总是运行在阻塞模式下。


一.打开FileChannel

在使用FileChannel之前,必须先打开它。但是,我们无法直接打开一个FileChannel,需要通过使用一个InputStream、OutputStream或RandomAccessFile来获取一个FileChannel实例

下面是通过RandomAccessFile打开FileChannel的示例:

    RandomAccessFile aFile = new RandomAccessFile("data/nio-data.txt", "rw");
    FileChannel inChannel = aFile.getChannel();

RandomAccessFile类的构造方法如下所示:

RandomAccessFile(File file ,  String mode)
//创建随机存储文件流,文件属性由参数File对象指定

RandomAccessFile(String name ,  String mode)
//创建随机存储文件流,文件名由参数name指定

[注意]
这两个构造方法均涉及到一个String类型的参数mode,它决定随机存储文件流的操作模式,其中mode值及对应的含义如下:

  • “r”:以只读的方式打开,调用该对象的任何write(写)方法都会导致IOException异常
  • “rw”:以读、写方式打开,支持文件的读取或写入。若文件不存在,则创建之。
  • “rws”:以读、写方式打开,与“rw”不同的是,还要对文件内容的每次更新都同步更新到潜在的存储设备中去。这里的“s”表示synchronous(同步)的意思
  • “rwd”:以读、写方式打开,与“rw”不同的是,还要对文件内容的每次更新都同步更新到潜在的存储设备中去。使用“rwd”模式仅要求将文件的内容更新到存储设备中,而使用“rws”模式除了更新文件的内容,还要更新文件的元数据(metadata),因此至少要求1次低级别的I/O操作

二.从FileChannel读取数据

调用多个read()方法之一从FileChannel中读取数据。如:

ByteBuffer buf = ByteBuffer.allocate(48); int bytesRead = inChannel.read(buf);

首先,分配一个Buffer。从FileChannel中读取的数据将被读到Buffer中。

然后,调用FileChannel.read()方法。该方法将数据从FileChannel读取到Buffer中。read()方法返回的int值表示了有多少字节被读到了Buffer中。如果返回-1,表示到了文件末尾。


三.向FileChannel写数据

使用FileChannel.write()方法向FileChannel写数据,该方法的参数是一个Buffer。如:

String newData = "New String to write to file..." + System.currentTimeMillis();
ByteBuffer buf = ByteBuffer.allocate(48);
buf.clear();
buf.put(newData.getBytes());
buf.flip();
while(buf.hasRemaining()) {
    channel.write(buf);
}

[注意]:

注意FileChannel.write()是在while循环中调用的。因为无法保证write()方法一次能向FileChannel写入多少字节,因此需要重复调用write()方法,直到Buffer中已经没有尚未写入通道的字节。


四.关闭FileChannel

用完FileChannel后必须将其关闭。如:
channel.close();


例子:

例一:

package cn.cc.Nio;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

/**
 * @author CC
 * 非阻塞IO
 */
public class NioDemo2 {
	public static void main(String[] args) {
		NioDemo2 n = new NioDemo2();
		n.writeFile();
		n.readFile();
	}
	
	public void readFile() {
		//NIO读取文件
		FileInputStream fis = null;
		FileChannel fc = null;
		try {
			fis = new FileInputStream("F:\\out.txt");
			fc = fis.getChannel();
			//创建缓冲区
			ByteBuffer buffer = ByteBuffer.allocate(1024);
			//读取内容到缓冲区
			int length = fc.read(buffer);//读取到的长度
			System.out.println("读取到"+length);
			//从缓冲区获取数据
			buffer.flip();
			byte[] ary = new byte[length];
			buffer.get(ary);//把缓冲区的内容获取到后,存入ary数组中
			System.out.println(new String(ary));
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public void writeFile() {
		//NIO写入文件
		// 创建输出流
		FileOutputStream fos = null;
		FileChannel fc = null;
		try {
			fos = new FileOutputStream("F:\\out.txt");
			// 获取通道
			fc = fos.getChannel();
			ByteBuffer buffer = ByteBuffer.allocate(1024);
			buffer.put("wo shi cui chen".getBytes());
			buffer.flip();
			// 通过通道写入目标文件
			fc.write(buffer);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (fc != null) {
					fc.close();
				}
				if (fos != null) {
					fos.close();
				}
			} catch (IOException ex) {
				ex.printStackTrace();
			}
		}
	}
}


例二:

package cn.cc.Nio;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileChannel.MapMode;

public class NioDemo3 {

	public static void main(String[] args) {
		//创建通道
		FileChannel inChannel = null;
		FileChannel outChannel = null;
		try {
			//读取大文件
			inChannel = new RandomAccessFile("F:\\c", "r").getChannel();
			//写入大文件
			outChannel = new RandomAccessFile("D:\\o", "rw").getChannel();
			
			//把内存映射为缓冲区
			MappedByteBuffer map = inChannel.map(MapMode.READ_WRITE, 0, inChannel.size());
			//把内存缓冲区的内容写道输出管道
			outChannel.write(map);
			System.out.println("读取结束!");
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			if (outChannel!=null) {
				try {
					outChannel.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if (inChannel!=null) {
				try {
					inChannel.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}

}


基本步骤
在这里插入图片描述
总结:

  • 通过通道写入文件:

代码—>写入(write)缓冲区(buffer)—>通道(Channel)—>目标文件(File)

  • 通过通道读取文件:

目标文件(File)—>通道(Channel)读取到(read)—>缓冲区(buffer)—>代码中

嵌入式主板系统配置实战:OTG切换、双网共存与开机自启详解 在嵌入式Linux系统开发中,系统配置是连接硬件平台与应用功能的关键桥梁。其核心原理在于通过内核参数、文件系统接口和系统服务等机制,实现对硬件资源和系统行为的精细控制。掌握这些配置技术,对于提升开发效率、保障系统稳定性和实现产品差异化至关重要。无论是工业物联网网关、智能终端还是边缘计算设备,都需要对网络、USB、启动项等基础功能进行可靠配置。本文聚焦于嵌入式主板开发中的高频需求,例如OTG功能模式切换、双网共存路由策略以及基于systemd的开机自启动实现,通过具体的命令和脚本示例,为开发者提供一套可直接复 阅读详情

相关推荐

基于STM32和K210的自动驾驶小车设计

自动驾驶技术正在迅速发展,成为了汽车行业和智能交通领域的热点之一。随着科技的发展,STM32和K210这两款芯片为自动驾驶小车提供了优秀的硬件支持。本文我们将学习如何使用STM32和K210打造一个简单的自动驾驶小车。提示:以下是本篇文章正文内容,下面案例可供参考通过这篇文章,掌握了如何使用STM32和K210构建一个简单的自动驾驶小车。通过了解基本的电路设计,并编写了STM32和K210的代码。通过这个例子,可以更好地理解如何在嵌入式系统中使用STM32和K210,以及如何实现自动驾驶小车的简单功能。

Kyle_Chan_zMH的博客 2215

【NIO】FileChannel

前言 Github:https://github.com/yihonglei/java-all Project:java-nio Java NIO中的FileChannel是一个连接到文件的通道。可以通过文件通道读写文件。 FileChannel无法设置为非阻塞模式,它总是运行在阻塞模式下。 一 打开FileChannel 在使用FileChannel之前,必须先打开它。但是,我们无法...

yhl_jxy的博客 5508

Proteus 8.15仿真STM32F103C8,ADC采样总为0?别急着换芯片,先检查这3个配置

本文详细解析了在Proteus 8.15中仿真STM32F103C8时ADC采样值为0的常见原因及解决方法。从供电网络配置、时钟设置到ADC参数调整,提供了系统性的排查指南,帮助开发者快速定位问题,避免不必要的硬件更换。重点关注供电网络、时钟分频和ADC配置等关键环节。

weixin_30425949的博客 366

Netty——文件编程(FileChannel中方法说明与代码示例)

Netty——文件编程(FileChannel中方法说明与代码示例)

小志的博客 990

数据分析项目:电商用户行为分析系统

本报告基于某电商平台用户行为数据(采样10%),通过清洗、探索性分析及多维度建模,旨在挖掘用户行为特征、商品销售规律及用户价值分层,为运营策略优化提供数据支持。原始数据字段:用户ID、商品ID、类目ID、行为类型、时间戳。长尾商品(购买量低)可考虑捆绑销售或限时折扣,提升动销率。长尾商品(购买量低)可考虑捆绑销售或限时折扣,提升动销率。,少数高活跃用户贡献大部分行为,多数用户行为次数较少。

Nervousr的博客 1700

瑞数jsvmp算法还原流程讲解

​ 又是很久没写文章了,今天水一篇文章吧,鉴于之前有看到过别人的文章被警告的案例,所以这篇文章就仅写一下还原瑞数vmp的大概流程吧(仅记录下自己还原的思路)

博客 6606

Flume --文件通道(file channel)

文件通道是Flume的持久通道。它将所有事件写入磁盘,因此不会丢失进程或机器关机或崩溃的数据。文件通道可确保任何提交到通道的事件只有在接收到事件并提交事务时才会从通道中删除,即使机器或代理程序崩溃并重新启动。它被设计为高度并发,同时处理多个source和sink。      文件通道设计用于需要数据持久性和不能容忍数据丢失的情况。由于通道将数据写入磁盘,因此不会在数据崩溃或失败时丢失数据。由于将

tianqinglei的博客 9408

001、Zephyr RTOS简介与历史背景

本文介绍了Zephyr RTOS的特点及其在嵌入式开发中的应用。作者通过亲身经历比较了Zephyr与传统RTOS的差异,重点分析了Zephyr的设备树、统一驱动模型、基于CMake的构建系统、POSIX兼容层等核心特性。文章详细阐述了Zephyr在内核设计上的优势,如中断处理模型、内存管理等,并提供了社区生态和使用建议。作者建议开发者从简单项目入手逐步掌握Zephyr,同时指出了常见的使用问题和适用场景,认为Zephyr特别适合复杂软件架构的物联网和工业控制项目。

m0_50546716的博客 154

Day386&387.Nio概述&Nio的Channel通道 -NIO

Java NIO 概述 Java NIO(New IO 或 Non Blocking IO)是从Java 1.4 版本开始引入的一个新的IO API,可以替代标准的 Java IO API。NIO 支持面向缓冲区的、基于通道的 IO 操作。NIO 将以更加高效的方式进行文件的读写操作。 1.1 阻塞 IO 通常在进行同步 I/O 操作时,如果读取数据,代码会阻塞直至有可供读取的数据。同样,写入调用将会阻塞直至数据能够写入。传统的 Server/Client 模式会基于 TPR(Thread per Requ

阿昌爱Java 1669

2026年GESP3月认证C++五级真题解析

因为要合并成升序数组,所以当A[i]小于等于B[j]时,取A[i],否则取B[j]。当a[i]>a[j]时,左边数组中从i到m的所有元素都大于a[j],因此逆序对数量增加m-i+1。给定一个包含n个互不相同的正整数的数组A与一个包含m个互不相同的正整数的数组B,请你帮忙计算有多少个数在数组A与数组B中均出现。下面代码实现两个整数除法,其中被除数为一个“大整数”,用字符串表示,除数是一个小整数,用int表示,则横线处应该填写()。且a[i] > a[j],则a[i]和a[j]是一个逆序对。

lan_in的博客 116

Python 爬虫实战:全球渔业船舶捕捞记录数据采集与分析全攻略

通过本项目,我们实现了对全球渔业船舶捕捞记录数据的采集、处理和可视化,为渔业资源管理和海洋生态保护提供了数据支持。未来,可以进一步结合机器学习和深度学习技术,对捕捞行为进行预测和分类,提高对非法捕捞活动的识别能力。

2201_76125261的博客 554

使用NIO——FileChannel按行读取文件

读取字符文件时,如果中途我们想输出字符串要特别小心。下面的代码在输出文本内容时,很可能产生中文读取再输出的乱码: private static void byteBuffer() throws IOException { RandomAccessFile randomAccessFile = new RandomAccessFile("/Users/zhengwei/lanqiao/Con...

赶路人儿 5441

高通SDX35平台 modem启动异常分析

SDX35 MIFI项目在生产时出现modem反复重启问题。经排查发现是modem在初始化GNSS模块时访问了不存在的硬件地址导致崩溃,原因是产线使用的SDX35 000-AB型号芯片阉割了GNSS功能,而本地测试使用的AA型号支持该功能。解决方案是通过修改modem编译选项,采用高通新提供的genlmm2选项(保留IMS和SMS功能但去除GNSS支持),最终解决了启动异常问题并满足VZW认证需求。

四儿家的小祖宗的博客 273

NIO之FileChannel介绍

FileChannel 可以通过的对象中的方法来获取,也可以通过静态方法来打开。FileChannel.open()的方式通过静态静态方法 FileChannel.open() 打开的通道可以指定打开模式,模式通过 StandardOpenOption 枚举类型指定。示例Paths.get("data","test","c.txt"), // 路径:data/test/c.txtpath获取:将传入的参数根据顺序进行统一拼接成为一个完整文件路径;:传入一个路径参数;

smart_an的专栏 1038

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Java的NIO之FileChannel

FileChannel文件通道Java的NIO中的FileChannel是一个连接到文件的通道,文件可以通过这个通道来进行读写操作。值得注意的是:FileChannel无法设置成非阻塞模式,它总是工作在阻塞模式下。下面介绍一下FileChannel的用法:7.1 打开一个FileChannel在使用FileChannel之前我们必须先打开一个FileChannel;但是我们无法直接打开一个FileC

惜暮 1505

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【死磕 NIO】— 深入分析Channel和FileChannel

大家好,我是大明哥,这次我们来看看NIO的第二个组件:Channel。 上篇文章[【死磕 NIO】— 深入分析Buffer]介绍了 NIO 中的 Buffer,Buffer 我们可以认为他是装载数据的容器,有了容器,还需要传输数据的通道才能完成数据的传输,这个通道就是今天要介绍的 Channel。 Channel 我们可以认为它是本地 I/O 设备、网络 I/O 的通信桥梁,只有搭建了这座桥梁,数据才能被写入 Buffer 。 Channel 在 NIO 中,Channel 和 Buffer 是相辅相成的

chenssy 的技术博客 2730

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

NIO与Socket笔记 :FileChannel

Java NIO中的FileChannel是一个连接到文件的通道。可以通过文件通道读写文件。 FileChannel无法设置为非阻塞模式,它总是运行在阻塞模式下。 打开FileChannel 在使用FileChannel之前,必须先打开它。但是,我们无法直接打开一个FileChannel,需要通过使用一个InputStream、OutputStream或RandomAccessFile来...

张伯毅的专栏 1790

NIO之通道Channel【FileChannel介绍】

通道(channel)介绍   Channel是一个对象,作用是用于源节点和目标节点的连接,在java NIO中负责缓冲区数据的传递。Channel本身不存储数据,因此需要配合缓冲区进行传输。 主要的实现类有   主要的实现类有如下四个: FileChannel, SocketChannel, ServerSocketChannel, DatagramChannel,都实现了java.nio.c...

波波烤鸭的博客 2477

NIO学习之NIO概述和FileChannel详解

NIO学习之NIO概述和FileChannel详解入门概述阻塞 IO非阻塞 IO(NIO)NIO 概述ChannelBufferSelector通道和缓冲区Java NIO(Channel)Channel 概述channel 接口源码Channel 实现FileChannel 介绍和示例从 FileChannel 读数据FileChannel 操作详解打开 FileChannel从 FileChannel 读取数据向 FileChannel 写数据关闭 FileChannelFileChannel 的 po

m0_53157173的博客 1026

【linux】NIO中的FileChannel与mmap

FileChannel是Java NIO库中的一个类,用于对文件进行读写操作。它提供了一种高效的方式来读取、写入和操作文件。

morris 1万+

Java NIO FileChannel

Java NIO中的FileChannel是一个连接到文件的通道。可以通过文件通道读写文件。 FileChannel无法设置为非阻塞模式,它总是运行在阻塞模式下。 打开FileChannel 在使用FileChannel之前,必须先打开它。但是,我们无法直接打开一个FileChannel,需要通过使用一个InputStream、OutputStream或RandomAcc

u010395804的专栏 622

NIO07——FileChannel

 FileChannel 是一个连接到文件的通道,使用 FileChannel 可以从文件读数据,也可以向文件中写入数据。Java NIO 的 FileChannel 是标准 Java IO 读写文件的替代方案。  FileChannel 不能设置为非阻塞的模式,也就是说 FileChannel 总是阻塞的。  1、开启 FileChannel  在使用 FileChannel 之前必须先开启。但...

如不來的博客 627

Java NIO学习篇之通道FileChannel详解

定义: FileChannel是Java NIO对应于磁盘等存储设备文件操作的通道。 常用API详解: 获取FileChannel的API /** * 打开一个与文件的连接通道,用于进行文件操作。 * path:path,文件的路径对象,可用Path.get("文件路径"),获取。 * options:通道的操作参数。通常使用实现类枚举StandardOpenOption指定。 * attrs:创建文件时自动设置的文件属性的可选列表,比如读写执行。 */ public static FileChannel

qq_40837310的博客 1435

【Java NIO】— 深入分析 Channel 和 FileChannel

作者简介:大家好,我是码炫码哥,前中兴通讯、美团架构师,现任某互联网公司CTO,兼职码炫课堂主讲源码系列专题代表作:《jdk源码&多线程&高并发》,《深入tomcat源码解析》,《深入netty源码解析》,《深入dubbo源码解析》,《深入springboot源码解析》,《深入spring源码解析》,《深入redis源码解析》等联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬。大家好,我是码哥,这次我们来看看NIO的第二个组件:Channel。

smart_an的专栏 1397

Java NIO详解(一): FileChannel

概述FileChannel是用来读,写,映射, 操作文件的channel(概念参见我的另一篇Java NIO概述). A channel for reading, writing, mapping, and manipulating a file. 获取FileChannel对象有三种方式:FileInputStream.getChannel(); FileOutputStream.getCh

sichenglain的专栏 2413

Java NIO之FileChannel 详解

Java NIO之FileChannel 详解

1176
上一篇: 20.NIO非阻塞IO
下一篇: 2.IO序列化(文件写操作)
cuichen97
博客等级 码龄7年 34粉丝 209原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值