import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.Channel;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
public class FileChannelMain {
private static final Charset charset = Charset.forName("GBK");
private static final int BUFFER_CAPACITY = 1024;
public static void main(String[] args) throws IOException, InterruptedException {
final String srcfilePath = "D:/tomcat-6.0.26/logs/catalina.2012-04-30.log";
readFile(srcfilePath);
final String writeFilePath = "D:/test.txt";
final String[] lines = new String[]{"line1xxssss", "中文测试", "!@#$%^&*()"};
writeFile(writeFilePath, lines, Boolean.TRUE);
readFile(writeFilePath);
final String targetFilePath = "D:/test-copy.txt";
copyFile1(srcfilePath, targetFilePath);
copyFile2(srcfilePath, targetFilePath);
}
/**
*
* <br>------------------------------<br>
* @param srcfilePath
* @param targetPath
* @throws IOException
*/
private static void copyFile2(String srcfilePath, String targetPath) throws IOException {
File file = new File(targetPath);
if (!file.getParentFile().exists()) {
file.mkdirs();
}
FileInputStream fileInputStream = new FileInputStream(srcfilePath);
FileOutputStream fileOutputStream = new FileOutputStream(file);
FileChannel inChannel = fileInputStream.getChannel();
FileChannel outChannel = fileOutputStream.getChannel();
//两者等价
// inChannel.transferTo(0, inChannel.size(), outChannel);
outChannel.transferFrom(inChannel, 0, inChannel.size());
close(fileOutputStream);
close(fileInputStream);
close(inChannel);
close(outChannel);
}
/**
*
* <br>------------------------------<br>
* @param srcfilePath
* @param targetPath
* @throws IOException
*/
private static void copyFile1(String srcfilePath, String targetPath) throws IOException {
File file = new File(targetPath);
if (!file.getParentFile().exists()) {
file.mkdirs();
}
FileInputStream fileInputStream = new FileInputStream(srcfilePath);
FileOutputStream fileOutputStream = new FileOutputStream(file);
FileChannel inChannel = fileInputStream.getChannel();
FileChannel outChannel = fileOutputStream.getChannel();
ByteBuffer inBuffer = ByteBuffer.allocate(BUFFER_CAPACITY);
while (inChannel.read(inBuffer) != -1) {
inBuffer.flip();
outChannel.write(inBuffer);
inBuffer.clear();
}
close(fileOutputStream);
close(fileInputStream);
close(inChannel);
close(outChannel);
}
/**
* <br>------------------------------<br>
* @param writeFilePath
* @param lines
* @param append
* @throws IOException
*/
private static void writeFile(String writeFilePath, String[] lines, boolean append) throws IOException {
File file = new File(writeFilePath);
if (!file.getParentFile().exists()) {
file.mkdirs();
}
FileOutputStream fileOutputStream = new FileOutputStream(file, append);
FileChannel fileChannel = fileOutputStream.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(BUFFER_CAPACITY);
for (String line : lines) {
buffer.put(line.getBytes());
buffer.put("\r\n".getBytes());
buffer.flip();
fileChannel.write(buffer);
buffer.clear();
}
close(fileOutputStream);
close(fileChannel);
}
/**
* <br>------------------------------<br>
* @param path
* @throws IOException
*/
private static void readFile(String path) throws IOException {
if (isFileNotExists(path)) {
throw new FileNotFoundException();
}
FileInputStream fileInputStream = new FileInputStream(path);
FileChannel fileChanne = fileInputStream.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(BUFFER_CAPACITY);
while (fileChanne.read(buffer) != -1) {
buffer.flip();
System.out.println(charset.decode(buffer));
buffer.clear();
}
close(fileInputStream);
close(fileChanne);
}
private static boolean isFileNotExists(String path) {
File file = new File(path);
return !file.exists();
}
/**
*
* <br>------------------------------<br>
* @param outputStream
*/
private static void close(OutputStream outputStream) {
if (outputStream == null) return;
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
*
* <br>------------------------------<br>
* @param channel
*/
private static void close(Channel channel) {
if (channel == null ) return;
try {
channel.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
*
* <br>------------------------------<br>
* @param inputStream
*/
private static void close(InputStream inputStream) {
if (inputStream == null) return;
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
NIO - FileChannel
最新推荐文章于 2021-02-25 02:51:41 发布