- 浏览: 131611 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
qq466862016:
不错的文章
JDK动态代理与CGLIB代理的对比 -
jinxiongyi:
你好,jpedal pdf转换图片的 画质,怎么提高。。我转 ...
介绍几款PDF转图片的开源工具 -
qqdwll:
转图片消耗的内存还是不小。 有时间得找找有没有更好的办法, 把 ...
介绍几款PDF转图片的开源工具 -
xiaoyao3857:
Thanks for your work!It's help ...
Keeping Eclipse running clean (转载) -
iceside:
图片讲解非常详细,说清了引用复制是怎么回事
Java 值传递的终极解释
我们用例子说明java怎样通过不同的方式移动文件或文件夹。
首先, 我们先介绍通过流的例子,你可以很容易把指定的源文件或文件夹移动到目标文件夹中。
程序中, 你需要指定源文件/文件夹和目标文件夹的绝对路径。 如果指定的源文件(夹)不存在, 程序打印出提示信息"File or directory does not exist.", 然后从控制台中推出程序。 如果指定的目标文件夹不存在,程序会提示你是否创建一个新的文件夹。 通过输入"y", 程序就会为你创建一个新的文件夹并且把源文件全部移动到目标文件夹中。 当目标文件夹存在时, 它会征询你是否替换掉已经存在的文件夹。
File object 有个方法叫renameTo, 但这个方法是平台相关的。 我在windows 平台上测试过可以成功。 但没在linux上测试, 所以不清楚这个方法在其它平台上运行的结果。 要是有测试过的朋友, 可以给我留言。 谢谢。
如果可以用这个方法的话, 那方法 copyFile(File source, File dest) 就很简单了, 只需写成:
通过NIO的方。
流移动文件, 有个潜在的性能问题, 主要是缓存的原因。 在实际情况下, 需要优化缓存的大小以达到最优的情况。 一般文件不是很大的情况, 在windons下, 2k比较快。NIO就不需要人为的设置缓存了。 但nio的话, 对于超大文件, 几百M或者上G的话, 性能不是很乐观。 但小文件的话, 如果流的缓存没有配置好。nio 的性能是很快的。下面我们用nio的方式新建一个方法替换 copyFile(File source, File dest):
但是, Windows, based on configuration, uses either executes a native copy or does the Stream-based copy. Solaris and AIX always uses the Channel implementation.
所以, 对于移动大文件的话, 最好是用流的方式。 那我们干脆判断一下, 如果是大文件, 就用流, 否则就用nio的方式。 我们对copyDirectory(File sourceDir, File destDir)方法改造下:
首先, 我们先介绍通过流的例子,你可以很容易把指定的源文件或文件夹移动到目标文件夹中。
程序中, 你需要指定源文件/文件夹和目标文件夹的绝对路径。 如果指定的源文件(夹)不存在, 程序打印出提示信息"File or directory does not exist.", 然后从控制台中推出程序。 如果指定的目标文件夹不存在,程序会提示你是否创建一个新的文件夹。 通过输入"y", 程序就会为你创建一个新的文件夹并且把源文件全部移动到目标文件夹中。 当目标文件夹存在时, 它会征询你是否替换掉已经存在的文件夹。
package io; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import javax.swing.JOptionPane; public class MovingFile { public static void main(String[] args) throws IOException { int a = 0; BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); System.out .print("Enter the file or directory name that has to be moved : "); String src = in.readLine(); if (src.equals("")) { System.out.println("Invalid directory or file name."); System.exit(0); } File source = new File(src); if (!source.exists()) { System.out.println("File or directory does not exist."); System.exit(0); } System.out .print("Enter the complete path where file or directory has to be moved: "); String dest = in.readLine(); if (dest.equals("")) { System.out.println("Invalid directory or file name."); System.exit(0); } File destination = new File(dest); if (!destination.exists()) { System.out .print("Mentioned directory does not exist. \nDo you want to create a new directory(Y/N)? "); String chk = in.readLine(); if (chk.equals("Y") || chk.equals("y")) { destination.mkdir(); copyDirectory(source, destination); a = 1; } else if (chk.equals("N") || chk.equals("n")) { System.exit(0); } else { System.out.println("Invalid Entry!"); System.exit(0); } } else { int num = JOptionPane .showConfirmDialog(null, "Given file or folder name already exists. \nDo you want to replace now?"); if (num == 0) { copyDirectory(source, destination); a = 1; } } if (a == 1) { System.out.println("File or directory moved successfully."); if (!delete(source)) { throw new IOException("Unable to delete original folder"); } } else if (a == 0) { System.exit(0); } } public static void copyDirectory(File sourceDir, File destDir) throws IOException { if (!destDir.exists()) { destDir.mkdir(); } File[] children = sourceDir.listFiles(); for (File sourceChild : children) { String name = sourceChild.getName(); File destChild = new File(destDir, name); if (sourceChild.isDirectory()) { copyDirectory(sourceChild, destChild); } else { copyFile(sourceChild, destChild); } } } public static void copyFile(File source, File dest) throws IOException { if (!dest.exists()) { dest.createNewFile(); } InputStream in = null; OutputStream out = null; try { in = new FileInputStream(source); out = new FileOutputStream(dest); byte[] buf = new byte[1024]; int len; while ((len = in.read(buf)) > 0) { out.write(buf, 0, len); } } finally { in.close(); out.close(); } } public static boolean delete(File resource) throws IOException { if (resource.isDirectory()) { File[] childFiles = resource.listFiles(); for (File child : childFiles) { delete(child); } } return resource.delete(); } }
File object 有个方法叫renameTo, 但这个方法是平台相关的。 我在windows 平台上测试过可以成功。 但没在linux上测试, 所以不清楚这个方法在其它平台上运行的结果。 要是有测试过的朋友, 可以给我留言。 谢谢。
如果可以用这个方法的话, 那方法 copyFile(File source, File dest) 就很简单了, 只需写成:
public static void copyFile(File source, File dest) throws IOException { source.renameTo(dest); }
通过NIO的方。
流移动文件, 有个潜在的性能问题, 主要是缓存的原因。 在实际情况下, 需要优化缓存的大小以达到最优的情况。 一般文件不是很大的情况, 在windons下, 2k比较快。NIO就不需要人为的设置缓存了。 但nio的话, 对于超大文件, 几百M或者上G的话, 性能不是很乐观。 但小文件的话, 如果流的缓存没有配置好。nio 的性能是很快的。下面我们用nio的方式新建一个方法替换 copyFile(File source, File dest):
public static void copyFileWithNIO(File sourceFile, File destFile) throws IOException { if (!destFile.exists()) { destFile.createNewFile(); } FileChannel source = null; FileChannel destination = null; long count = 0; try { source = new FileInputStream(sourceFile).getChannel(); long size = source.size(); destination = new FileOutputStream(destFile).getChannel(); while( (count += destination.transferFrom(source, count, size-count)) < size ); } finally { if (source != null) { source.close(); } if (destination != null) { destination.close(); } } }
但是, Windows, based on configuration, uses either executes a native copy or does the Stream-based copy. Solaris and AIX always uses the Channel implementation.
所以, 对于移动大文件的话, 最好是用流的方式。 那我们干脆判断一下, 如果是大文件, 就用流, 否则就用nio的方式。 我们对copyDirectory(File sourceDir, File destDir)方法改造下:
public static void copyDirectory(File sourceDir, File destDir) throws IOException { if (!destDir.exists()) { destDir.mkdir(); } File[] children = sourceDir.listFiles(); for (File sourceChild : children) { String name = sourceChild.getName(); File destChild = new File(destDir, name); if (sourceChild.isDirectory()) { copyDirectory(sourceChild, destChild); } else { long fileSize = sourceChild.length(); // for larger files (20Mb) use streams if ( fileSize > 20971520l ) copyFile(sourceChild, destChild); else copyFileWithNIO (sourceChild, destChild); } } }
发表评论
-
介绍几款PDF转图片的开源工具
2011-09-09 00:40 4493最近项目中有个需求需要把PDF转成一张图。经过调查,有 ... -
jadclipse(反编译Eclipse插件)
2011-07-19 19:13 1620Jad Java decompiler plugin for ... -
Java开发时候的内存溢出
2011-07-13 17:33 1159这里以tomcat环境为例, ... -
class loader
2011-07-08 17:23 0Because Class.getResource() eve ... -
Jakarta-Common-BeanUtils使用笔记
2011-07-06 16:55 1302原文转发http://blog.csdn.net/fa ... -
基于MVC模式Struts框架研究
2011-04-13 20:02 1299不做web开发多年了, 可偶尔去面试的时候, 还是 ... -
Java反射与动态代理
2011-04-13 15:08 938这篇文章是 成富 先生在InfoQ上Java 深度历险系列的一 ... -
Java枚举类型
2011-04-04 19:50 754Tiger中的一个重要新特性是枚举构造,它是一种新的Java枚 ... -
Java 值传递的终极解释
2011-03-21 22:49 1940对于Java的值传递, 你真的了解么? Ja ... -
六种异常处理的陋习
2011-03-20 03:21 732你觉得自己是一个Java专 ... -
数组初始化
2011-03-20 02:40 835数组初始化,你觉得简单吗? a.如果你觉得简单,那请看下面的 ... -
Java 实现 hashCode 方法
2011-03-11 17:07 1132原文 http://www.javapractices.com ... -
Java 中 immutable class 以及怎样实现immutable 类
2011-03-11 16:47 1330原文 http://www.javapractices.com ... -
Java 内部类介绍
2011-02-16 17:14 949转载: http://zhidao.baidu.com/que ... -
Java 中的Clone 学习总结
2011-01-25 18:22 26971. 一个类需要实现clone. 一个最佳实践是它需要实现 C ... -
转 深入探讨SOAP、RPC和RMI
2010-12-17 00:34 1009这篇文章是从网上转下来的。 原文应该是写于2001年。 10 ... -
java 6 中的性能优化
2010-12-07 15:30 1408文章转载自: http://www ... -
创建强健,稳定的 JMS 系统
2010-12-07 15:21 950The most reliable way to produc ... -
Java Modifier Summary
2010-11-12 15:10 844<tbody> <tr> ... -
[ZT] 怎样停止一个线程或者任务
2010-11-12 15:08 962source file http://forward.com. ...
相关推荐
Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据...
java nio 读文件,java nio 读文件
简单的用Java的NIO读取文件的程序,给大家参考。
java nio 写文件,java nio 写文件
java nio 写文件样例,java写大数据文件时提高性能
设计思想: 每次通过nio读取字节到 fbb中 然后对fbb自己中的内容进行行判断即 10 回车 13 行号 0 文件结束 这样字节的判断,然后 返回行 如果 到达 fbb的结尾 还没有结束,就再通过nio读取一段字节,继续处理...
java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现...
java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java...
Java语言基础教程-Java NIO流篇2Java语言基础教程-Java NIO流篇2
设计思想: 每次通过nio读取字节到 fbb中 然后对fbb自己中的内容进行行判断即 10 回车 13 行号 0 文件结束 这样字节的判断,然后 返回行 如果 到达 fbb的结尾 还没有结束,就再通过nio读取一段字节,继续处理。 ...
Java NIO系列教程(一) Java NIO 概述 Java NIO系列教程(二) Channel Java NIO系列教程(三) Buffer Java NIO系列教程(四) Scatter/Gather Java NIO系列教程(五) 通道之间的数据传输 Java NIO系列教程(六)...
JAVA NIO 简单PFT 文件服务 上传 下载 列表
Java NIO 源码适合初学者,里面包括通道和Buffer的基本适用,以及文件锁,和内存文件映射等等
io/nio各种文件读写方法。文件压缩成jar包。
Java语言基础教程-Java NIO流篇1Java语言基础教程-Java NIO流篇1
这是一本介绍java io以及nio相关知识的书,书中对知识的讲解通俗易懂,是学习java nio以及复习java io相关知识的必备书籍。注意:本书为英文版!!!
Java NIO 深入探讨了 1.4 版的 I/O 新特性,并告诉您如何使用这些特性来极大地提升您所写的 Java 代码的执行效率。这本小册子就程序员所面临的有代表性的 I/O 问题作了详尽阐述,并讲解了 如何才能充分利用新的 I/O ...
java nio 实现socketjava nio 实现socketjava nio 实现socketjava nio 实现socketjava nio 实现socket
java NIO.zip
java nio和零拷贝 方面知识,适合对nio和零拷贝感兴趣的开发人员