FileChannel
FileLock ...文件锁操作
lock(),tryLock(),
关于锁定的方式:
共享锁:允许多个线程进行文件的读取操作;
独占锁:只允许一个线程进行文件的读写操作。
字符集:有个Charset类来负责处理编码的问题,
包含了创建编码器(CharsetEncoder)和创建解码器(CharsetDecoder)的操作
Selector,构建一个非阻塞的网络服务。
之前在Socket程序的时候,服务器必须始终等着客户端的连接,造成浪费资源,所以引入了非阻塞的IO操作。
把内容写到文件中去
package Demo.javatest;
import java.io.File;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class NewIoChanel_01 {
/**
* 把内容写到文件中去
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception{
String info[] = {"wangs","hehe","wangshao","北京"};
File file = new File("d:"+File.separator+"myfile.txt");
FileOutputStream output= null;
output = new FileOutputStream(file);
FileChannel fout = null;
fout = output.getChannel();
ByteBuffer buf = ByteBuffer.allocate(1024);
for(int i=0;i<info.length;i++){
buf.put(info[i].getBytes()); //字符串变为字节数组放入缓冲区
}
buf.flip();
fout.write(buf);//输出缓冲区的内容
fout.close();
output.close();
}
}
读取文件
package Demo.javatest;
import java.io.File;
import java.io.FileInputStream;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
public class NewIoChanel_02 {
/**
* 读取文件
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception{
File file = new File("d:"+File.separator+"myfile.txt");
FileInputStream input = null;
FileChannel fin = null;
input = new FileInputStream(file);
fin = input.getChannel();
MappedByteBuffer mbb = null;
mbb = fin.map(FileChannel.MapMode.READ_ONLY, 0, file.length());
byte data [] = new byte[(int) file.length()];
int foot =0;
while(mbb.hasRemaining()){
data[foot++] = mbb.get();
}
System.out.println(new String(data));
fin.close();
input.close();
}
}
读取文件,写到文件中去
package Demo.javatest;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class NewIoChanel_03 {
/**
* 读取文件,写到文件中去
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception{
File file = new File("d:"+File.separator+"myfile.txt");
File file2 = new File("d:"+File.separator+"myfile2.txt");
FileInputStream input= null;
FileOutputStream output= null;
input = new FileInputStream(file);
output = new FileOutputStream(file2);
FileChannel fout = null;
FileChannel fin = null;
fin = input.getChannel();
fout = output.getChannel();
ByteBuffer buf = ByteBuffer.allocate(1024);
int temp = 0;
while((temp = fin.read(buf))!= -1){ //以1024为单位,边读边写
buf.flip();
fout.write(buf);
buf.clear(); //不清空内容进不来,所有变量位置恢复到原点
}
fin.close();
fout.close();
input.close();
output.close();
}
}
/**
* 对一个文件进行锁定
* @param args FileOutputStream具有可写操作,FileInputStream找不到写操作,无法锁定
*/
package Demo.javatest;
import java.io.File;
import java.io.FileOutputStream;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
public class FileLockDemo {
/**
* 对一个文件进行锁定
* @param args FileOutputStream具有可写操作,FileInputStream找不到写操作,无法锁定
*/
public static void main(String[] args) throws Exception {
File file = new File("d:"+File.separator+"myfile.txt");
FileOutputStream output= null;
output = new FileOutputStream(file,true); //这里需要加true
FileChannel fout =null;
fout = output.getChannel();
FileLock lock = fout.tryLock();
if(lock!= null){
System.out.println(file.getName()+"文件被锁定30秒");
Thread.sleep(30000);
lock.release(); //释放锁定
System.out.println(file.getName()+"文件被解锁");
}
fout.close();
output.close();
}
}
进行编码,解码操作。
package Demo.javatest;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.CharacterCodingException;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CharsetEncoder;
public class CharSetEnDeDemo {
/**进行编码,解码操作。
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
Charset latin1 = Charset.forName("ISO8859-1");
CharsetEncoder encoder = latin1.newEncoder(); //得到编码器
CharsetDecoder decoder = latin1.newDecoder();//得到解码器
CharBuffer cb = CharBuffer.wrap("hello,charset"); //准备编译内容
ByteBuffer bb = encoder.encode(cb); //进行编码
System.out.println(decoder.decode(bb));
}
}
得到所有Charset编码
package Demo.javatest;
import java.nio.charset.Charset;
import java.util.Iterator;
import java.util.Map;
import java.util.SortedMap;
public class GetAllCharSetDemo {
/**得到所有Charset编码
* @param args
*/
public static void main(String[] args) {
SortedMap<String, Charset> all =null;
all= Charset.availableCharsets();
Iterator<Map.Entry<String, Charset>> iter= null;
iter = all.entrySet().iterator();
while(iter.hasNext()){
Map.Entry<String, Charset> me= iter.next();
System.out.println(me.getKey()+"---->"+me.getValue());
}
}
}
一个非阻塞的服务器端
package Demo.javatest;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Date;
import java.util.Iterator;
import java.util.Set;
public class SelectorDemo {
/**一个非阻塞的服务器端
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
int ports[]= {8888,8880,8881,8882};
Selector selector = Selector.open();
for(int i=0;i< ports.length;i++){
ServerSocketChannel initSer = null;
initSer = ServerSocketChannel.open(); //打开服务器套接字通道
initSer.configureBlocking(false); //设置为非阻塞
ServerSocket initSock = initSer.socket(); //检索相关的套接字
InetSocketAddress address = null;
address = new InetSocketAddress(ports[i]); //实例化绑定监听地址
initSock.bind(address);
initSer.register(selector, SelectionKey.OP_ACCEPT); //相当于accept(),注册选择器
System.out.println("服务器运行在"+ports[i]+"端口.");
}
int addKey = 0;
while((addKey=selector.select())>0){
Set<SelectionKey> selectKeys = selector.selectedKeys();
Iterator<SelectionKey> iter = selectKeys.iterator();
while(iter.hasNext()){
SelectionKey key = iter.next();
if(key.isAcceptable()){
ServerSocketChannel server = (ServerSocketChannel) key.channel();
SocketChannel client = server.accept();
client.configureBlocking(false); //配置为非阻塞
ByteBuffer outbuf = ByteBuffer.allocateDirect(1024);
outbuf.put(("当前的时候:"+new Date()).getBytes());
outbuf.flip();
client.write(outbuf);
client.close();
}
}
selectKeys.clear();
}
}
}
相关推荐
java新IO文件流java新IO文件流java新IO文件流java新IO文件流java新IO文件流java新IO文件流java新IO文件流
Java新IO获取Path文件大小 Java新IO(NIO)是一个Java API,提供了文件操作的功能,其中包括获取文件大小。在Java新IO中,获取文件大小可以使用Files类的size方法。下面将详细介绍如何使用Java新IO获取Path文件大小...
java IO教程,java IO教程,java IO教程,java IO教程java IO教程java IO教程java IO教程java IO教程,java IO教程java IO教程java IO教程java IO教程java IO教程,java IO教程,java IO教程,java IO教程,java IO...
Java.io.CharConversionException: isHexDigit 处理详解 Java.io.CharConversionException: isHexDigit 是 Java 中一种常见的异常,通常发生在传输数据时编码不正确或 URL 传值时出现问题。本文将对该异常进行详细...
### Java.io.Reader与Java.io.InputStream的关键差异解析 在深入探讨`java.io.Reader`与`java.io.InputStream`的具体差异之前,我们首先需要理解这两者在Java I/O操作中的基础角色。`java.io.Reader`和`java.io....
Java的IO流是Java编程语言中的重要组成部分,它主要用于数据的输入和输出操作。在Java中,IO流被设计为处理任何类型的数据,包括字符、字节甚至对象。本练习旨在帮助初学者理解和掌握Java IO流的基础知识。 一、IO...
Java 1.4引入了NIO(New IO),提供了非阻塞I/O,通道(Channel)、缓冲区(Buffer)和选择器(Selector)等新概念,提高了并发I/O的性能。 通过实例学习,你可以创建简单的文件读写程序,逐步了解流的层次结构,...
Java_IO流详解 Java 的核心库 java.io 提供了全面的 IO 接口,包括文件读写、标准设备输出等。Java 中 IO 是以流为基础进行输入输出的,所有数据被串行化写入输出流,或者从输入流读入。在项目开发中,IO 是非常...
Java 网络IO简介: bio nio aio
### Java.io包详解 #### 一、概述 Java.io包是Java编程语言中非常重要的一个标准库,它提供了丰富的类和接口,支持多种输入/输出流的处理方式,包括文件I/O、网络通信等场景。Java.io包的核心设计思想是以流...
例如,javaio.bmp和javaio2.bmp可能是两张展示IO框架图的图片,其中详细描绘了不同类之间的继承关系和使用场景,帮助开发者更好地理解和掌握Java IO系统。 总结一下,Java IO框架是Java平台不可或缺的一部分,它为...
Java IO系统主要包括两个包:`java.io`和`java.nio`(New IO),其中`java.io`提供了一系列基于流的I/O操作接口与实现类,而`java.nio`则提供了更高效的数据访问方式,如通道和缓冲区等。 Java IO系统的设计原则之...
### Java IO详解 #### 1. 什么是IO 在计算机科学中,IO(Input/Output,输入/输出)指的是程序与外部系统之间进行数据交换的过程。在Java中,IO操作主要通过`java.io`包来实现,这个包包含了用于文件读写、标准...
Java调用IO流是进行数据输入输出操作的核心技术之一,特别是在处理文件、网络通信和程序间数据传递时不可或缺。在Java中,IO流分为两大类:字节流(Byte Stream)和字符流(Character Stream)。字节流处理单个字节...
在Java编程领域,IO(Input/Output)技术是不可或缺的一部分,尤其在处理数据持久化、文件操作、网络通信等方面发挥着重要作用。在这个“java小项目练习IO实现”中,我们将探讨如何利用Java的IO流来实现本地数据的...
Java IO(输入输出)是Java平台中的核心概念,主要用于数据的读取和写入操作。在Java SE中,IO框架提供了丰富的类库,使得开发者能够处理各种类型的数据流,包括文件、网络、内存等。本资源"java_IO.rar"包含了关于...
Java IO的设计采用了Decorator模式,使得在不修改原有类的基础上,能够动态地增加新功能。 Decorator模式是一种设计模式,它允许我们在运行时向对象添加新的行为或责任,而无需修改该对象的源代码。在Java IO中,...
Java阻塞IO与非阻塞IO - OPEN 开发经验库