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();
}
}
}
分享到:
相关推荐
04-Java NIO-Channel-FileChannel(介绍和示例).mp4 05-Java NIO-Channel-FileChannel详解(一).mp4 06-Java NIO-Channel-FileChannel详解(二).mp4 07-Java NIO-Channel-Socket通道-概述.mp4 08-Java NIO-Channel-...
05-Java NIO-Channel-FileChannel详解(一).mp4 06-Java NIO-Channel-FileChannel详解(二).mp4 08-Java NIO-Channel-ServerSocketChannel.mp4 09-Java NIO-Channel-SocketChannel.mp4 10-Java NIO-Channel-...
7.1 打开一个FileChannel 7.2 从FileChannel通道中读取数据 7.3 向FileChannel中写入数据: 7.4 关闭FileCha
Java NIO系列教程(七) FileChannel Java NIO系列教程(八) SocketChannel Java NIO系列教程(九) ServerSocketChannel Java NIO系列教程(十) Java NIO DatagramChannel Java NIO系列教程(十一) Pipe Java ...
教程内容涵盖:阻塞和非阻塞IO、Channel通道、Buffer缓冲区、Selector选择器、Pipe管道、FileLock文件锁,以及Path、Files、异步FileChannel和Charset字符编码等,并通过一个多人聊天室的综合案例,把所有的NIO知识...
jruby-stdin-channel JRuby Java 扩展 gem,它从 Java System.in stdin 中提取可中断的FileChannel。 使用这个 gem,在阻塞read方法上调用close将解除阻塞,这与普通的 JRuby $stdin 。 使用close转义阻塞读取仅适用...
使用nio byteBuffer 实现按行读取文件(大文件) 在window/linux/macOS上均测试通过 对于中文乱码也已处理成功 完整注释,可随需求更改 有问题请邮件:mly610865580@126.com
java-nio java-nio ...AbstractInterruptibleChannel, AbstractSelectableChannel, DatagramChannel, FileChannel, Pipe.SinkChannel, Pipe.SourceChannel, SelectableChannel, ServerSocketChannel, Socke
1.1 阻塞 IO 2.3 FileChannel 介绍和示例 2.4 FileChannel 操作详解
两个通道之间传输数据的方式有两种,分别是:FileChannel 的transferFrom()方法可以将数据从源通道传输到FileChannel中(这个方法在
import java.nio.channels.FileChannel; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import javax.swing.filechooser.FileFilter; 实验...
FileChannel Buffer URLConnection NIO Process HashMap LinkedHashMap TreeMap ConcurrentHashMap ConcurrentLinkedQueue ThreadPool ThreadLocal Reflection ScheduledThreadPool ...
源(如java.nio.channels.ReadableByteChannel和java.nio.channels.FileChannel一起使用的方法,它们允许对来自各种源的位和字节进行高效、惰性的访问和操作。 十六进制和二进制字符串字面量是通过所支持的hex和bin...
There are some Linux bugs reported against the NIO sendfile behavior, make sure you have a JDK that is up to date, or disable sendfile behavior in the Connector. 6427312: (fc) FileChannel....
SAMBox使用允许使用基于java.nio.channels.FileChannel , java.io.InputStream和java.nio.MappedByteBuffer的提供的实现之一(是否缓冲)。 通过使用java.lang.StringBuilder池最小化GC。 通过绑定视图的概念直接...
##NIO基础 三大组件 Channel & Buffer channel有点类似于stream,它就是读写数据的双向通道,可以从channel将数据读入buffer,也可以将buffer中的数据写入到channel 中,而stream只能完成一种 常见的Channel有 ...
import java.nio.channels.FileChannel; import java.text.DecimalFormat; import java.util.Vector; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import ...
import java.nio.channels.FileChannel; import java.util.ArrayList; import java.util.Hashtable; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; /* * ...
import java.nio.channels.FileChannel; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.Box; import ...