Java NIO 读写文件
2015-02-28 17:38
197 查看
1.读取文件涉及三个步骤:(1) 从FileInputStream获取 Channel,(2) 创建 Buffer,(3) 将数据从 Channel 读到 Buffer 中;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class NioReader {
public static void main(String[] args)
{
try {
//获取文件
FileInputStream fin = new FileInputStream("E:\\nioTest.txt");
//获取通道
FileChannel channel = fin.getChannel();
//创建缓冲区
ByteBuffer buffer = ByteBuffer.allocate(1024);
while(channel.read(buffer) != -1){
buffer.flip();
//注意要使用buffer.limit()作为大小否则会读取到多余的数据
System.out.print(new String(buffer.array(), 0, buffer.limit(), "utf-8"));
buffer.clear();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2.写文件涉及三个步骤:(1) 从FileOutputStream获取 Channel,(2) 创建 Buffer,(3) 将数据写入到 Buffer 中,
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class NioWriter {
public static void main(String[] args) {
// TODO Auto-generated method stub
//要写入的文件内容
String message = "字节缓冲区要么是直接的,要么是非直接的。如果为直接字节缓冲区,"
+ "则 Java 虚拟机会尽最大努力直接在此缓冲区上执行本机 I/O 操作。也就是说,在每次调用基础操作系统的一个本机 I/O 操作之前(或之后),"
+ "虚拟机都会尽量避免将缓冲区的内容复制到中间缓冲区中(或从中间缓冲区中复制内容)。 "
+ "\n直接字节缓冲区可以通过调用此类的 allocateDirect 工厂方法来创建。"
+ "此方法返回的缓冲区进行分配和取消分配所需成本通常高于非直接缓冲区。直接缓冲区的内容可以驻留在常规的垃圾回收堆之外,"
+ "因此,它们对应用程序的内存需求量造成的影响可能并不明显。所以,"
+ "建议将直接缓冲区主要分配给那些易受基础系统的本机 I/O 操作影响的大型、持久的缓冲区。一般情况下,"
+ "最好仅在直接缓冲区能在程序性能方面带来明显好处时分配它们。 \n直接字节缓冲区还可以通过 mapping将文件区域直接映射到内存中来创建。"
+ "Java 平台的实现有助于通过 JNI 从本机代码创建直接字节缓冲区。如果以上这些缓冲区中的某个缓冲区实例指的是不可访问的内存区域,"
+ "则试图访问该区域不会更改该缓冲区的内容,并且将会在访问期间或稍后的某个时间导致抛出不确定的异常。 "
+ "\n字节缓冲区是直接缓冲区还是非直接缓冲区可通过调用其 isDirect 方法来确定。"
+ "提供此方法是为了能够在性能关键型代码中执行显式缓冲区管理。 ";
try {
byte[] arr = message.getBytes("utf-8");
//获取文件
FileOutputStream fout = new FileOutputStream("E:\\nioTest2.txt");
//获取通道
FileChannel channel = fout.getChannel();
//创建缓冲区
ByteBuffer buffer = ByteBuffer.allocate(arr.length);
buffer.put(arr);
buffer.flip();
//写入文件
channel.write(buffer);
//清空缓冲区
buffer.clear();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
参照资料:http://www.ibm.com/developerworks/cn/education/java/j-nio/
1.读取文件涉及三个步骤:(1) 从FileInputStream获取 Channel,(2) 创建 Buffer,(3) 将数据从 Channel 读到 Buffer 中;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class NioReader {
public static void main(String[] args)
{
try {
//获取文件
FileInputStream fin = new FileInputStream("E:\\nioTest.txt");
//获取通道
FileChannel channel = fin.getChannel();
//创建缓冲区
ByteBuffer buffer = ByteBuffer.allocate(1024);
while(channel.read(buffer) != -1){
buffer.flip();
//注意要使用buffer.limit()作为大小否则会读取到多余的数据
System.out.print(new String(buffer.array(), 0, buffer.limit(), "utf-8"));
buffer.clear();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2.写文件涉及三个步骤:(1) 从FileOutputStream获取 Channel,(2) 创建 Buffer,(3) 将数据写入到 Buffer 中,
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class NioWriter {
public static void main(String[] args) {
// TODO Auto-generated method stub
//要写入的文件内容
String message = "字节缓冲区要么是直接的,要么是非直接的。如果为直接字节缓冲区,"
+ "则 Java 虚拟机会尽最大努力直接在此缓冲区上执行本机 I/O 操作。也就是说,在每次调用基础操作系统的一个本机 I/O 操作之前(或之后),"
+ "虚拟机都会尽量避免将缓冲区的内容复制到中间缓冲区中(或从中间缓冲区中复制内容)。 "
+ "\n直接字节缓冲区可以通过调用此类的 allocateDirect 工厂方法来创建。"
+ "此方法返回的缓冲区进行分配和取消分配所需成本通常高于非直接缓冲区。直接缓冲区的内容可以驻留在常规的垃圾回收堆之外,"
+ "因此,它们对应用程序的内存需求量造成的影响可能并不明显。所以,"
+ "建议将直接缓冲区主要分配给那些易受基础系统的本机 I/O 操作影响的大型、持久的缓冲区。一般情况下,"
+ "最好仅在直接缓冲区能在程序性能方面带来明显好处时分配它们。 \n直接字节缓冲区还可以通过 mapping将文件区域直接映射到内存中来创建。"
+ "Java 平台的实现有助于通过 JNI 从本机代码创建直接字节缓冲区。如果以上这些缓冲区中的某个缓冲区实例指的是不可访问的内存区域,"
+ "则试图访问该区域不会更改该缓冲区的内容,并且将会在访问期间或稍后的某个时间导致抛出不确定的异常。 "
+ "\n字节缓冲区是直接缓冲区还是非直接缓冲区可通过调用其 isDirect 方法来确定。"
+ "提供此方法是为了能够在性能关键型代码中执行显式缓冲区管理。 ";
try {
byte[] arr = message.getBytes("utf-8");
//获取文件
FileOutputStream fout = new FileOutputStream("E:\\nioTest2.txt");
//获取通道
FileChannel channel = fout.getChannel();
//创建缓冲区
ByteBuffer buffer = ByteBuffer.allocate(arr.length);
buffer.put(arr);
buffer.flip();
//写入文件
channel.write(buffer);
//清空缓冲区
buffer.clear();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
参照资料:http://www.ibm.com/developerworks/cn/education/java/j-nio/
相关文章推荐
- java nio 超大文件的读写
- java:NIO读写文件的示例
- Java文件读写IO/NIO及性能比较总结
- Java文件读写IO/NIO及性能比较总结
- Java文件读写IO/NIO及性能比较详细代码及总结
- 2015我想和Java聊聊之NIO读写文件
- 使用java的java.nio.channels.FileLock,实现程序对文件的独占读写.
- 【JavaNIO的深入研究4】内存映射文件I/O,大文件读写操作,Java nio之MappedByteBuffer,高效文件/内存映射
- 大数据量的文件读写 java nio的完全发挥
- JAVA之NIO按行读写大文件,完美解决中文乱码问题
- 【JavaNIO的深入研究4】内存映射文件I/O,大文件读写操作,Java nio之MappedByteBuffer,高效文件/内存映射
- JAVA I/O 、NIO 文件读写性能对比
- JAVA NIO 读写文件
- Java文件读写IO/NIO及性能比较总结
- java对比IO和NIO的文件读写性能测试
- java对比IO和NIO的文件读写性能测试
- JAVA之NIO按行读写大文件,完美解决中文乱码问题
- Java文件读写IO/NIO及性能比较总结
- Java nio(文件读写 实例解析)
- java基本的文件读写