`

FileChannel示例

 
阅读更多

FileChannel 

 

 

public class TestFileChannel {
	/**
	 * 复制文件
	 * @param srcfile
	 * @param destFile
	 * @throws IOException
	 */
	public void copyFile(File srcfile,File destFile ) throws IOException{
		FileChannel srcfileChannel = new FileInputStream(srcfile).getChannel();
		
		FileChannel destfileChannel = new FileOutputStream(destFile).getChannel();
		srcfileChannel.transferTo(0, srcfileChannel.size(), destfileChannel);
		srcfileChannel.close();
		destfileChannel.close();
	}
	/**
	 * 文件尾部追加另一文件内容
	 * @param srcfile
	 * @param destFile
	 * @throws IOException
	 */
	public void appendFile(File srcfile,File destFile ) throws IOException{
		FileChannel srcfileChannel = new FileInputStream(srcfile).getChannel();
		FileChannel destfileChannel = new FileOutputStream(destFile,true).getChannel();
		destfileChannel.write(ByteBuffer.wrap("\r\n".getBytes()));
		destfileChannel.transferFrom(srcfileChannel, destfileChannel.size(), srcfileChannel.size());
		srcfileChannel.close();
		destfileChannel.close();
	}
	/**
	 * 固定文件格式内容写入
	 * 文件格式:
	 * 1. 性名:类型:String,长度:50 
	 * 2. 年龄:类型:int ,长度 :4
	 * 3. 身高: 类型:flaot ,长度:4
	 * 4. 性别: 类型:byte,长度:1
	 * 5. 简介长度: 类型:int,长度:4
	 * 6. 简介:类型  String,长度:不确定,由简介长度指定
	 * @param file
	 * @throws IOException
	 */
	public void writeFile(File file) throws IOException{
		FileChannel fileChannel = new FileOutputStream(file).getChannel();
		String name="yanlei";//max size=50;
		int age=30;
		float stature = 1.65f;
		byte sex = 1;
		String introduction="good main";
		ByteBuffer nameByteBuffer = ByteBuffer.allocate(50);
		nameByteBuffer.put(name.getBytes());
		nameByteBuffer.rewind();//limit=capacity,position=0
		
		byte [] introBytes =  introduction.getBytes();
		int length = 4+4+1+4+introBytes.length;//age.length+stature.length+sex.length+一个int(introduction占用字节数)+introduction.length
		ByteBuffer otherByteBuffer = ByteBuffer.allocate(length);
		otherByteBuffer.putInt(age);
		otherByteBuffer.putFloat(stature);
		otherByteBuffer.put(sex);
		otherByteBuffer.putInt(introBytes.length);
		otherByteBuffer.put(introBytes);
		otherByteBuffer.rewind();//limit=capacity,position=0
		

		fileChannel.write(new ByteBuffer[]{nameByteBuffer,otherByteBuffer});
		fileChannel.close();
	}
	/**
	 * 固定文件格式内容读取
	 * 文件格式:
	 * 1. 性名:类型:String,长度:50 
	 * 2. 年龄:类型:int ,长度 :4
	 * 3. 身高: 类型:flaot ,长度:4
	 * 4. 性别: 类型:byte,长度:1
	 * 5. 简介长度: 类型:int,长度:4
	 * 6. 简介:类型  String,长度:不确定,由简介长度指定
	 * @param file
	 * @throws IOException
	 */
	public void readFile(File file) throws Exception{
		FileChannel fileChannel = new FileInputStream(file).getChannel();
		ByteBuffer nameByteBuffer = ByteBuffer.allocate(50);
		fileChannel.read(nameByteBuffer);
		String name = new String(delete0(nameByteBuffer.array()));
		int otherLength = 4+4+1+4;
		ByteBuffer otherByteBuffer = ByteBuffer.allocate(otherLength);
		fileChannel.read(otherByteBuffer);
		otherByteBuffer.flip();
		int age = otherByteBuffer.getInt();
		float stature = otherByteBuffer.getFloat();
		byte sex = otherByteBuffer.get();
		int introLength = otherByteBuffer.getInt();
		ByteBuffer introByteBuffer = ByteBuffer.allocate(introLength);
		fileChannel.read(introByteBuffer);
		String introduction = new String(introByteBuffer.array());
		System.out.println("name="+name+",age="+age+",stature="+stature+",sex="+sex+",introduction="+introduction);
		//输出name=yanlei,age=30,stature=1.65,sex=1,introduction=good main
	}
	private byte [] delete0(byte [] data){
		if(data != null){
			int i=data.length-1;
			for(;i>=0;i--){
				if(data[i]!= 0){
					break;
				}
			}
			return Arrays.copyOf(data, i+1);
		}
		return null;
	}
	public static void main(String []args ){
		try{
		TestFileChannel test = new TestFileChannel();
		test.copyFile(new File("test.txt"), new File("destFile.txt"));
		test.appendFile(new File("test.txt"), new File("destFile.txt"));
		test.writeFile(new File("persion.txt"));
		test.readFile(new File("persion.txt"));
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}

 

 

writeFile 方法生成的文件内容:



 

  • 大小: 4.4 KB
分享到:
评论

相关推荐

    nio入门文档及示例代码

    1. **文件读写示例**:演示如何使用FileChannel进行文件的读取和写入,可能会包含`transferTo()`和`transferFrom()`等方法的使用。 2. **网络通信示例**:展示如何使用SocketChannel和ServerSocketChannel进行客户端...

    java nio示例代码

    例如,FileChannel、SocketChannel和DatagramChannel是常用的通道类型。 2. **缓冲区(Buffer)**:缓冲区是NIO的核心,它在内存中分配一块区域来存储数据。在进行IO操作时,数据先被存入缓冲区,然后再从缓冲区读取...

    NIO原生API示例

    常见的通道类有FileChannel、SocketChannel、ServerSocketChannel等。例如,ServerSocketChannel用于监听客户端连接,SocketChannel用于接收和发送数据。 2. **缓冲区(Buffers)**:缓冲区是存储数据的容器,它...

    一个NIO开发的示例代码

    这个名为"nioSamples"的压缩包文件很可能包含了以上概念的Java代码示例,你可以通过学习和运行这些示例,更深入地理解Java NIO的工作原理和使用方法。对于Java初学者来说,这是一个极好的实践资源,可以帮助你快速...

    Android网络多线程断点续传下载 示例

    在“Multi_thread_Download”示例中,开发者可能使用了`OkHttp`或者`Volley`这样的网络库来发起HTTP请求,利用`java.nio`包中的`FileChannel`进行文件的读写和合并,以及`SharedPreferences`存储下载状态。...

    java NIO原理和使用

    示例代码展示如何使用 `FileChannel` 的 `map()` 方法进行内存映射: ```java FileChannel fileChannel = ...; MappedByteBuffer mappedBuffer = fileChannel.map(FileChannel.MapMode.READ_WRITE, 0, fileChannel....

    Java大文件传输示例额

    本示例主要关注如何高效地传输大文件,通过将大文件分解为较小的数据块,然后逐个传输这些小块,最后在接收端进行组装。这种方法可以有效避免一次性加载整个大文件到内存中导致的资源消耗和可能的溢出问题。 首先,...

    Java使用BIO和NIO进行文件操作对比代码示例

    "Java使用BIO和NIO进行文件操作对比代码示例" Java BIO和NIO是两种不同的输入/输出(IO)模型,在文件操作中发挥着重要作用。BIO(Blocking I/O)是一种同步阻塞IO模式,而NIO(Non-Blocking I/O)是一种同步非阻塞...

    java网络编程NIO视频教程

    - **主要内容**:具体讲解FileChannel的使用方法,并提供示例代码。 - **学习目标**:学会如何利用FileChannel进行文件读写操作。 #### 5. Java NIO-Channel-FileChannel详解(一) - **主要内容**:深入探讨...

    无涯教程(LearnFk)-Java-Nio教程离线版.pdf

    这一示例演示了使用Java NIO的FileChannel类来读取文件的基本流程。 在介绍完Java NIO的基础概念后,文档通过代码示例加深了对NIO使用方法的理解。如ChannelDemo.java展示了一个简单的文件读取操作,其中使用了...

    Java NIO测试示例

    Java NIO提供了多种类型的通道,如FileChannel用于文件操作,SocketChannel用于网络通信,DatagramChannel用于UDP通信等。通道可以同时进行读写操作,并且可以与多个缓冲区进行交互。 2. **缓冲区(Buffer)**: ...

    java读取超大文本文件

    示例代码中演示了如何使用`ByteBuffer`和`FileChannel`读取文件: ```java int bufSize = 1024; byte[] bs = new byte[bufSize]; ByteBuffer byteBuf = ByteBuffer.allocate(1024); FileChannel channel = new ...

    java nio基础使用示例

    Java NIO(New IO)是Java 1.4版本引入的一种新的I/O API,它提供了非阻塞的I/O操作,极大地提高了I/O操作的效率。...此外,NIO还有Buffer、Pipe、FileChannel等重要概念,它们共同构建了Java NIO的强大功能。

    NIO复制文件

    1. **FileChannel**:`java.nio.channels.FileChannel`是用于读写文件的通道,可以从一个文件通道向另一个文件通道直接传输数据,避免了中间缓冲区的开销。在文件复制中,我们通常使用`transferTo()`和`transferFrom...

    复制文件(java)

    FileChannel inChannel = FileChannel.open(Paths.get(sourcePath), StandardOpenOption.READ); FileChannel outChannel = FileChannel.open(Paths.get(destPath), StandardOpenOption.WRITE); ByteBuffer ...

    JAVA-NIO程序设计完整实例

    示例代码片段 ```java Selector selector = Selector.open(); ServerSocketChannel server = ServerSocketChannel.open().bind(new InetSocketAddress(8080)); server.configureBlocking(false); server.register...

    示例1.1 File类操作文件

    Java NIO(New Input/Output)提供了一种新的文件操作方式,`FileChannel`类允许通过通道直接进行文件操作,这通常比传统的流更快。尽管如此,`File`类在NIO中仍然扮演着基础角色,用来创建通道。 10. **并发访问*...

    Java NIO实战开发多人聊天室

    01-Java NIO-课程简介.mp4 05-Java NIO-Channel-FileChannel详解(一).mp4 06-Java NIO-Channel-FileChannel详解(二).mp4 08-Java NIO-Channel-...23-Java NIO-Selector-示例代码(客户端).mp4 24

    java复制文件的4种方式

    本文将详细介绍四种常见的Java文件复制方法:使用`FileStreams`、使用`FileChannel`、使用Apache `Commons IO`以及使用Java 7的`Files`类。 #### 1. 使用`FileStreams`复制文件 这种方法是最传统的文件复制手段,...

Global site tag (gtag.js) - Google Analytics