1.往被本地文件中写数据
public void test()throws Exception{
String str="hello,nio";
FileOutputStream fos = new FileOutputStream("basic.txt");
FileChannel fc = fos.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
buffer.put(str.getBytes());
buffer.flip();
fc.write(buffer);
fos.close();
}
NIO中的通道是从输出流对象里通过getChannel()方法获取到的,该通道是双向的,既可以读】又可以写。在往通道里写数据之前,必须通过put方法把数据存到ByteBuffer中,然后通过通道的write方法写数据。在write之前,需要调用flip方法翻转缓冲区,把内部重置到初始位置,这样在接下来写数据时才能把所有数据写到通道里面。
2.从本地文件中读数据
public void test()throws Exception{
File file = new File("basic.txt");
FileInputStream fis = new FileInputStream(file);
FileChannel fc = fis.getChannel();
ByteBuffer buffer = ByteBuffer.allocate((int)file.length());
fc.read(buffer);
System.out.println(new String(buffer.array()));
fis.close();
3.复制文件
public void test()throws Exception{
FileInpurStream fis = new FileInputStream("c:\\user\\zdx\\Desktop\\oracle.mov");
FileOutputStream fos = new FileOutputStream("d:\\oracle.mov");
byte[] b = newbyte[1024];
while(true){
int res=fis.read(b);
if(res==-1){
break;}
fos.write(b,0,res);
}
fis.close();
fos.close();
}
以上代码分别通过输入流和输出流实现了文件的复制,这是通过传统的BIO实现的。
通过NIO复制相同的视频文件,代码如下
public void test()throws Exception{
FileInputStream fis = new FileInputStream("C:\\users\\zdx\\Desktop\\oracle.mov");
FileOutputStream fos = new FIleOutputStream("d:\\ooracle.mov");
FileChannel sourceCh=fis.getChannel();
FileChannel destCh=fos.getChannel();
destCh.transferFrom(sourceCh,0,sourceCh.size());
sourceCh.close();
destCh.close();
}
上述代码分别从两个流中得到两个通道,sourceCh负责读数据,destCh负责写数据,然后直接调用transferFrom方法一步到位实现了文件的复制。