第一篇在这里: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
相关推荐
健壮和经过验证的FTP Java。 支持断点续传、主动和被动模式、二进制、ASCII。 开源,源代码包括在内。 可用于商业用途(LGPL许可 )。 可选择购买non-LGPL 许可证的产品,提供永久支持。 特性: FTP 支持所有标准和...
5. 使用`java.io.RandomAccessFile`或`java.nio.channels.FileChannel`等类将输入流的数据写入本地文件,从上次下载结束的位置开始追加。 需要注意的是,在实际应用中,我们还需要处理一些细节问题,如检查服务器...
此外,对于大型文件,你可能需要使用断点续传或者分块上传等高级特性。这都是在设计高效、健壮的文件同步系统时需要考虑的因素。 通过这些Java技术,你可以构建一个本地文件系统与远程服务器之间的实时同步系统,...
2. 客户端通过Socket的OutputStream发送文件内容,可以使用`java.io.FileInputStream`读取本地文件,然后用`java.io.BufferedInputStream`提高读取效率。 3. 服务器端通过Socket的InputStream接收数据,用`java.io....
在Java中,我们可以使用java.nio包中的FileChannel和MappedByteBuffer类来实现断点续传。以下是一个基本的实现框架: 1. 获取已接收的文件块信息。 2. 使用RandomAccessFile打开远程文件,然后获取其FileChannel。 ...
4. **异步I/O**:考虑到性能优化,网络蚂蚁可能采用了Java NIO(非阻塞I/O)框架,这允许程序在等待数据时可以执行其他任务,提高效率。`Selector`、`Channel`和`Buffer`是NIO的关键组件。 5. **文件处理**:在下载...
1. 文件分块:使用Java IO或NIO进行文件读取,根据设定的块大小对大文件进行切割。 2. 断点记录:在上传过程中,保存每个块的上传状态,通常在本地数据库或文件中记录已上传的块的ID和状态。 3. 上传逻辑:实现...
- `java.nio`包中的`Channels`和`Buffers`:它们提供了一种高效、面向缓冲的I/O操作方式,特别适合处理大文件。 - `java.util.zip`和`java.util.concurrent`:前者用于压缩和解压缩文件,后者提供并发工具类,如`...
同时,为了进一步提高性能,可以考虑使用异步IO(Asynchronous IO,即Java NIO.2)或者第三方库如Apache Commons Net、Rapidoid等。 总之,优化Java IO流对于提升文件上传速度至关重要,尤其在处理大文件如音乐时。...
Java 断点续传技术是Java编程中一种用于文件传输的高级特性,它允许在文件传输中断后,从上次中断的位置继续传输,而无需重新开始整个过程。这在处理大文件或者网络不稳定的情况下非常有用,可以提高文件上传或下载...
2. **NIO(New IO)与NIO.2**:Java NIO(非阻塞I/O)提供了一种不同于传统IO的机制,允许程序同时处理多个输入/输出事件。NIO.2(Java 7引入)进一步增强了这一框架,提供了文件系统路径、异步文件通道等功能,对于...
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 NIO(非阻塞I/O)进行文件读写,通过`java.nio.channels.FileChannel`进行大文件分块读取和写入,避免内存溢出。 Apache HttpClient库提供了一套更强大、功能丰富的API来处理HTTP请求,...
在Java中,我们可以使用`java.io`和`java.nio`包下的类来实现文件的比较。例如,`java.io.File`类可以获取文件的基本信息,通过比较文件大小和修改时间进行初步判断。对于内容比较,可以使用`java.nio.file.Files`...
此外,为了提高性能和避免阻塞,可以考虑使用异步I/O(NIO)或Java 7引入的`java.nio.channels.AsynchronousSocketChannel`。这种方式允许并发处理多个连接,而无需为每个连接创建一个新线程,从而减少资源消耗。 ...
Java NIO提供了一种更高效的数据传输方式,它允许程序在等待数据就绪时执行其他任务,从而提高了系统性能。在文件传输中,`java.nio.channels.FileChannel`可用于高效地读写大文件。 五、多线程与并发 在处理多个...
综上所述,这个压缩包中的资料和源代码很可能会涵盖以上提到的Java文件传输相关技术,并可能通过实例演示如何使用这些技术来实现文件的上传、下载、断点续传等功能。学习和研究这些内容将有助于深入理解和应用Java在...
在这个Java QQ项目中,客户端和服务器端都应该是用Java编写的,可能利用了Java的Socket编程或者更高级的NIO(非阻塞I/O)来实现高效的数据传输。 1. **Java Socket编程**:Java Socket是网络通信的基础,它提供了在...
在Java中,我们可以使用`java.nio`包中的`FileChannel`类配合`MappedByteBuffer`进行大文件的分块读写,以实现断点续传。`FileChannel`提供了随机读写文件的能力,而`MappedByteBuffer`则可以将文件的一部分映射到...
2. **NIO(New Input/Output)**: Java 1.4引入了NIO,它提供了一种非阻塞的I/O模型,允许同时处理多个连接。`java.nio`包包含`Channels`、`Buffers`和`Selectors`等类,提高了文件传输的效率。例如,`FileChannel...