功能:将一个TXT文件保存到另一个文件;
public static void main(String[] args) throws Exception {
//得到一个文件的输入流
FileInputStream inputStream = new
FileInputStream("C:\\Users\\jinzheyi\\Desktop\\some2.txt");
//创建一个文件
File file = new File("C:\\Users\\jinzheyi\\Desktop\\some3.txt");
if (!file.exists()) {
file.createNewFile();
}
//创建一个输出流
FileOutputStream outputStream = new FileOutputStream(file);
byte[] b = new byte[1024];
while (true) {
int read = inputStream.read(b);
if (read == -1) {
break;
}
outputStream.write(b);
}
outputStream.close();
inputStream.close();
}
上面的代码我们首先从本地取一个TXT文件,得到一个输入流;
然后我们创建了一个文件,到时候写入这个文件中;
然后创建一个输出流;
最主要的我们就是创建一个缓冲区;
byte[] b = new byte[1024];
查看java API文档如下:
上面的文档来自于InputStream 抽象类文档;
这个缓冲区就是我们输入输出流的桥梁;打个比方,你从电脑里面读取了文件的字节码,就相当于得到在淘宝买东西付款,这个钱不是直接给商家的,是先给了淘宝,然后我们得到货物之后,确认收货之后,商家才可以从淘宝得到我们的钱,这个缓冲区就相当于淘宝。这个当时没有想清楚,现在理解了,记录一下;
Java NIO 与 Java IO区别:
Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java 1.4开始),Java NIO提供了与标准IO不同的IO工作方式。
Java NIO: Channels and Buffers(通道和缓冲区)
标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。
Java NIO: Non-blocking IO(非阻塞IO)
Java NIO可以让你非阻塞的使用IO,例如:当线程从通道读取数据到缓冲区时,线程还是可以进行其他事情。当数据被写入到缓冲区时,线程可以继续处理它。从缓冲区写入通道也类似。
Java NIO: Selectors(选择器)
Java NIO引入了选择器的概念,选择器用于监听多个通道的事件(比如:连接打开,数据到达)。因此,单个的线程可以监听多个数据通道。
下面的代码按照以前的逻辑写的,只不过现在用了NIO;
//获取读取通道,通过从FileInputStream
FileInputStream inputStream = new FileInputStream("C:\\Users\\jinzheyi\\Desktop\\some2.txt");
FileChannel channel = inputStream.getChannel();
//创建缓冲区
ByteBuffer buffer = ByteBuffer.allocate(1024);
//从通道读到缓冲区
//channel.read(buffer);
//获取写入通道,通过FileOutputStream
FileOutputStream outputStream = new FileOutputStream("C:\\Users\\jinzheyi\\Desktop\\some4.txt");
FileChannel channel2 = outputStream.getChannel();
int read = channel.read(buffer);
while (read != -1) {
//模式翻转,读模式转写模式
buffer.flip();
//判断position 和 limit 之间是否有元素
// while(buffer.hasRemaining()){
// System.out.print((char) buffer.get());
// }
channel2.write(buffer);
buffer.clear();
read = channel.read(buffer);
}
outputStream.close();
inputStream.close();
实际上我们还可以这样写,更加简单;
FileInputStream inputStream = new FileInputStream("C:\\Users\\jinzheyi\\Desktop\\some2.txt");
//创建缓冲区
FileChannel channel = inputStream.getChannel();
long position = 0;
long count = channel.size();
FileOutputStream outputStream = new FileOutputStream("C:\\Users\\jinzheyi\\Desktop\\some4.txt");
FileChannel channel2 = outputStream.getChannel();
//transferTo()方法将数据从FileChannel传输到其他的channel中
channel.transferTo(position, count, channel2);
//FileChannel的transferFrom()方法可以将数据从源通道传输到FileChannel中
//channel2.transferFrom(channel, position, count);
outputStream.close();
inputStream.close();
粗略的了解一下NIO,继续努力