`

[java]nio.2 使用续

 
阅读更多

第一篇在这里:http://fair-jm.iteye.com/blog/1912942

这里再记录一些

 

SymbolicLink无法作用在win的快捷方式

符号引用简单点说就像个快捷方式(shortcut) 但是在使用中发现这对win下的快捷方式无效:

代码如下(混杂了其他东西):

	Path path=Paths.get("../BF.png.lnk");	
	path=path.toRealPath();
	System.out.println(path);
	System.out.println(Files.isSymbolicLink(path));
	//符号链接在win下不能用
    BasicFileAttributeView bav=Files.getFileAttributeView(path, BasicFileAttributeView.class);
    
    System.out.println("startWith?:"+path.startsWith(Paths.get("G:/nio2")));
    System.out.println("endsWith?:"+path.endsWith(Paths.get("BF.png.lnk")));
    
    BasicFileAttributes ba=bav.readAttributes();
    //或者:
    //BasicFileAttributes ba=Files.readAttributes(file, BasicFileAttributes.class);
    System.out.format("File size: %s \n" , ba.size());  
    System.out.format("File creation time: %s \n" , ba.creationTime());  
    System.out.format("File was last accessed at: %s \n" , ba.lastAccessTime());  
    System.out.format("File was last modified at: %s \n" , ba.lastModifiedTime());  
    System.out.format("Is directory? %s \n" , ba.isDirectory());  
    System.out.format("Is regular file? %s \n" , ba.isRegularFile());  
    System.out.format("Is symbolic link? %s \n" , ba.isSymbolicLink());  
    System.out.format("Is other? %s \n" , ba.isOther());  

 输出:

G:\nio2\BF.png.lnk
false
startWith?:true
endsWith?:true
File size: 935 
File creation time: 2013-08-13T15:00:13.162298Z 
File was last accessed at: 2013-08-13T15:00:13.2023Z 
File was last modified at: 2013-08-13T15:00:21.9528Z 
Is directory? false 
Is regular file? true 
Is symbolic link? false 
Is other? false 

 可见shortcut不算符号引用(文件的真实路径显示的还是G:\nio2\BF.png.lnk) 也无法得到链接的文件(这边输出的文件信息就是那个快捷方式的)

 

当然win也不是那么鸡肋的 win7下提供了mklink的工具 可以创造符号链接 

命令如下(win7请以管理员模式运行cmd):

G:\nio2>mklink BFSym.png C:\Users\dell\Desktop\BF.png

 当然还有额外的参数可以用 具体可以参考:

http://www.cnblogs.com/asion/archive/2011/03/10/1979282.html

然后我把以上代码里的BF.png.lnk换成BGSym.png 再看输出:

C:\Users\dell\Desktop\BF.png
false
startWith?:false
endsWith?:false
File size: 158701 
File creation time: 2012-08-27T08:08:04.561389Z 
File was last accessed at: 2012-10-11T11:17:25.613585Z 
File was last modified at: 2012-08-27T08:08:04.635393Z 
Is directory? false 
Is regular file? true 
Is symbolic link? false 
Is other? false 

 可以看到已经是连接的文件信息了

 

关于使用的toRealPath()方法:

java程序员修炼之道 写道
此外,toRealPath()方法也很有效,它融合了toAbsolutePath()和normalize()两个方法的功能,还能检测并跟随符号连接。

 

此外还有一点要注意

 BasicFileAttributeView bav=Files.getFileAttributeView(path, BasicFileAttributeView.class);

默认会跟随符号连接的 代码我不再演示 如果只是要读符号连接本身(而不是连接的文件)的属性

记得加个参数:

 BasicFileAttributeView bav=Files.getFileAttributeView(path, BasicFileAttributeView.class,LinkOption.NOFOLLOW_LINKS);

 

 

 

 

WatchService使用:

在原来没有写 这边写个简单的例子:

	public static void main(String[] args) throws IOException, InterruptedException {
		Path file=Paths.get(".").toRealPath(); //G:\nio2\path_test
		Path watchDir=file.resolveSibling("watchDir"); //G:\nio2\path\watchDir
		System.out.println(watchDir.toRealPath());
		
		WatchService ws=FileSystems.getDefault().newWatchService();
		
		WatchKey wk=watchDir.register(ws, StandardWatchEventKinds.ENTRY_CREATE,StandardWatchEventKinds.ENTRY_DELETE,StandardWatchEventKinds.ENTRY_MODIFY);
		System.out.println("watching......");
		while(true){
			wk=ws.take();
			for(WatchEvent event:wk.pollEvents()){
				System.out.println((new Date())+":"+((Path)event.context()).getFileName().toString()+":"+event.kind());
			}
			wk.reset();
		}
	}

 这个只能检测一个目录 不检测子目录的变化 如果子目录下产生文件了 他只会简单返回一个子目录被修改的事件 这边对文件的重命名也比较有意思 返回的事件是原名的文件被删除和新名的文件被创建:

G:\nio2\watchDir
watching......
Wed Aug 14 15:19:36 CST 2013:新建文件夹:ENTRY_CREATE  //新建了一个文件夹
Wed Aug 14 15:19:40 CST 2013:新建文件夹:ENTRY_MODIFY //在新建的文件夹下放了一个文件
Wed Aug 14 15:19:46 CST 2013:新建文件夹:ENTRY_MODIFY
Wed Aug 14 15:19:55 CST 2013:cc.txt:ENTRY_DELETE //重命名cc.txt为xx.txt
Wed Aug 14 15:19:55 CST 2013:xx.txt:ENTRY_CREATE
Wed Aug 14 15:19:55 CST 2013:xx.txt:ENTRY_MODIFY //以下为修改文件内容
Wed Aug 14 15:20:09 CST 2013:xx.txt:ENTRY_MODIFY 
Wed Aug 14 15:20:32 CST 2013:test.txt:ENTRY_MODIFY
Wed Aug 14 15:20:32 CST 2013:test.txt:ENTRY_MODIFY

 

 

 

0
1
分享到:
评论

相关推荐

    功能丰富的FTP库使用Java 1.7 方法和java.nio.rar

    健壮和经过验证的FTP Java。 支持断点续传、主动和被动模式、二进制、ASCII。 开源,源代码包括在内。 可用于商业用途(LGPL许可 )。 可选择购买non-LGPL 许可证的产品,提供永久支持。 特性: FTP 支持所有标准和...

    JAVA实现HTTP断点续传[借鉴].pdf

    5. 使用`java.io.RandomAccessFile`或`java.nio.channels.FileChannel`等类将输入流的数据写入本地文件,从上次下载结束的位置开始追加。 需要注意的是,在实际应用中,我们还需要处理一些细节问题,如检查服务器...

    java 监听本地文件自动上传服务器

    此外,对于大型文件,你可能需要使用断点续传或者分块上传等高级特性。这都是在设计高效、健壮的文件同步系统时需要考虑的因素。 通过这些Java技术,你可以构建一个本地文件系统与远程服务器之间的实时同步系统,...

    JAVA文件传输(论文+源代码)

    2. 客户端通过Socket的OutputStream发送文件内容,可以使用`java.io.FileInputStream`读取本地文件,然后用`java.io.BufferedInputStream`提高读取效率。 3. 服务器端通过Socket的InputStream接收数据,用`java.io....

    关于断点续传的相关资料,包含源代码

    在Java中,我们可以使用java.nio包中的FileChannel和MappedByteBuffer类来实现断点续传。以下是一个基本的实现框架: 1. 获取已接收的文件块信息。 2. 使用RandomAccessFile打开远程文件,然后获取其FileChannel。 ...

    java源码:网络蚂蚁Java版.rar

    4. **异步I/O**:考虑到性能优化,网络蚂蚁可能采用了Java NIO(非阻塞I/O)框架,这允许程序在等待数据时可以执行其他任务,提高效率。`Selector`、`Channel`和`Buffer`是NIO的关键组件。 5. **文件处理**:在下载...

    java大文件分块上传断点续传demo

    1. 文件分块:使用Java IO或NIO进行文件读取,根据设定的块大小对大文件进行切割。 2. 断点记录:在上传过程中,保存每个块的上传状态,通常在本地数据库或文件中记录已上传的块的ID和状态。 3. 上传逻辑:实现...

    java 文件上传下载 断点续传 断点上传

    - `java.nio`包中的`Channels`和`Buffers`:它们提供了一种高效、面向缓冲的I/O操作方式,特别适合处理大文件。 - `java.util.zip`和`java.util.concurrent`:前者用于压缩和解压缩文件,后者提供并发工具类,如`...

    JAVA 上传音乐

    同时,为了进一步提高性能,可以考虑使用异步IO(Asynchronous IO,即Java NIO.2)或者第三方库如Apache Commons Net、Rapidoid等。 总之,优化Java IO流对于提升文件上传速度至关重要,尤其在处理大文件如音乐时。...

    JAVA 版本 断点续传

    Java 断点续传技术是Java编程中一种用于文件传输的高级特性,它允许在文件传输中断后,从上次中断的位置继续传输,而无需重新开始整个过程。这在处理大文件或者网络不稳定的情况下非常有用,可以提高文件上传或下载...

    文件批处理模块java源码

    2. **NIO(New IO)与NIO.2**:Java NIO(非阻塞I/O)提供了一种不同于传统IO的机制,允许程序同时处理多个输入/输出事件。NIO.2(Java 7引入)进一步增强了这一框架,提供了文件系统路径、异步文件通道等功能,对于...

    springmvc提供视频播放功能时,手机端无法正常播放的解决办法

    import java.nio.file.attribute.FileTime; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.ZoneOffset; import java.util.ArrayList; import java.util.Arrays; import java.util....

    Java 的 HTTP 文件队列下载.rar_java http_java 下载_java 队列

    为了提高效率,可以使用Java NIO(非阻塞I/O)进行文件读写,通过`java.nio.channels.FileChannel`进行大文件分块读取和写入,避免内存溢出。 Apache HttpClient库提供了一套更强大、功能丰富的API来处理HTTP请求,...

    java工具类 ftp 文件比较 socket http

    在Java中,我们可以使用`java.io`和`java.nio`包下的类来实现文件的比较。例如,`java.io.File`类可以获取文件的基本信息,通过比较文件大小和修改时间进行初步判断。对于内容比较,可以使用`java.nio.file.Files`...

    Java多线程与线程安全实践-基于Http协议的断点续传.zip

    此外,为了提高性能和避免阻塞,可以考虑使用异步I/O(NIO)或Java 7引入的`java.nio.channels.AsynchronousSocketChannel`。这种方式允许并发处理多个连接,而无需为每个连接创建一个新线程,从而减少资源消耗。 ...

    JAVA文件传输(论文+源代码).zip

    Java NIO提供了一种更高效的数据传输方式,它允许程序在等待数据就绪时执行其他任务,从而提高了系统性能。在文件传输中,`java.nio.channels.FileChannel`可用于高效地读写大文件。 五、多线程与并发 在处理多个...

    JAVA文件传输(文档+源代码).zip

    综上所述,这个压缩包中的资料和源代码很可能会涵盖以上提到的Java文件传输相关技术,并可能通过实例演示如何使用这些技术来实现文件的上传、下载、断点续传等功能。学习和研究这些内容将有助于深入理解和应用Java在...

    QQ-JAVA.rar_java qq_qq.java_qq1666.com_qq9scom_即时通讯 Java

    在这个Java QQ项目中,客户端和服务器端都应该是用Java编写的,可能利用了Java的Socket编程或者更高级的NIO(非阻塞I/O)来实现高效的数据传输。 1. **Java Socket编程**:Java Socket是网络通信的基础,它提供了在...

    JAVA多线程断电续传下载程序

    在Java中,我们可以使用`java.nio`包中的`FileChannel`类配合`MappedByteBuffer`进行大文件的分块读写,以实现断点续传。`FileChannel`提供了随机读写文件的能力,而`MappedByteBuffer`则可以将文件的一部分映射到...

    Java文件传输

    2. **NIO(New Input/Output)**: Java 1.4引入了NIO,它提供了一种非阻塞的I/O模型,允许同时处理多个连接。`java.nio`包包含`Channels`、`Buffers`和`Selectors`等类,提高了文件传输的效率。例如,`FileChannel...

Global site tag (gtag.js) - Google Analytics