Created
June 11, 2020 09:12
-
-
Save hotstu/b44ba3ea318204a867625283556689ed to your computer and use it in GitHub Desktop.
Java Nio File channel code including write/read/copy/lock/map
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import org.junit.Test; | |
import java.io.ByteArrayOutputStream; | |
import java.io.RandomAccessFile; | |
import java.nio.ByteBuffer; | |
import java.nio.MappedByteBuffer; | |
import java.nio.channels.FileChannel; | |
import java.nio.channels.FileLock; | |
public class NioFile { | |
@Test | |
public void write() { | |
try ( | |
RandomAccessFile file = new RandomAccessFile("test.out", "rw"); | |
FileChannel channel = file.getChannel() | |
) { | |
for (int i = 0; i < 1000; i++) { | |
final ByteBuffer wrap = ByteBuffer.wrap("fork you\n".getBytes()); | |
channel.write(wrap); | |
} | |
channel.force(true); | |
} catch (Exception e) { | |
e.printStackTrace(); | |
} | |
} | |
@Test | |
public void read() { | |
try ( | |
RandomAccessFile file = new RandomAccessFile("test.out", "rw"); | |
FileChannel channel = file.getChannel(); | |
final ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream() | |
) { | |
ByteBuffer byteBuffer = ByteBuffer.allocate(1024); | |
while (channel.read(byteBuffer) > 0) { | |
byteOutputStream.write(byteBuffer.array(), 0, byteBuffer.position()); | |
byteBuffer.clear(); | |
} | |
System.out.println(new String(byteOutputStream.toByteArray()).length()); | |
} catch (Exception e) { | |
e.printStackTrace(); | |
} | |
} | |
@Test | |
public void copy() { | |
try ( | |
RandomAccessFile file = new RandomAccessFile("test.out", "r"); | |
RandomAccessFile file2 = new RandomAccessFile("test.out3", "rw"); | |
FileChannel channel = file.getChannel(); | |
FileChannel channel2 = file2.getChannel(); | |
) { | |
channel2.truncate(0); | |
ByteBuffer byteBuffer = ByteBuffer.allocate(16); | |
while (channel.read(byteBuffer) > 0) { | |
byteBuffer.flip(); | |
channel2.write(byteBuffer); | |
byteBuffer.flip(); | |
} | |
} catch (Exception e) { | |
e.printStackTrace(); | |
} | |
} | |
/** | |
* 进程间: lock()将block,tryLock()返回null | |
* 线程间: lock()将block,tryLock()抛出异常 | |
*/ | |
@Test | |
public void lock() { | |
try ( | |
RandomAccessFile file2 = new RandomAccessFile("test.out3", "rw"); | |
FileChannel channel2 = file2.getChannel(); | |
final FileLock lock = channel2.lock() | |
) { | |
Thread another = new Thread(() -> { | |
tryLock(); | |
}); | |
another.start(); | |
Thread.sleep(15*1000); | |
System.out.println("lock released"); | |
} catch (Exception e) { | |
e.printStackTrace(); | |
} | |
} | |
@Test | |
public void tryLock() { | |
try ( | |
RandomAccessFile file2 = new RandomAccessFile("test.out3", "rw"); | |
FileChannel channel2 = file2.getChannel(); | |
final FileLock lock = channel2.tryLock(); | |
) { | |
System.out.println(lock); | |
} catch (Exception e) { | |
e.printStackTrace(); | |
} | |
} | |
@Test | |
public void map() { | |
try ( | |
RandomAccessFile file2 = new RandomAccessFile("test.out3", "rw"); | |
FileChannel channel2 = file2.getChannel(); | |
) { | |
final MappedByteBuffer map = channel2.map(FileChannel.MapMode.READ_WRITE, 0, 100); | |
//可以做多线程分段文件下载 | |
} catch (Exception e) { | |
e.printStackTrace(); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment