1.jdk1.7åjdk1.8çåºå«ï¼
2.Java中删除文件或文件夹的源码几种方法
3.Java多种文件复制方式以及效率比较
4.使用Java API进行tar.gz文件及文件夹压缩解压缩
5.Java使用输入输出流完成,剪切,源码复制,源码粘贴,源码删除的源码功能(最好是代码解决此问题,比较直观,源码哪个是指标源码谢谢)
jdk1.7åjdk1.8çåºå«ï¼
å¨JDK1.7çæ°ç¹æ§æ¹é¢ä¸»è¦æä¸é¢å æ¹é¢çå¢å¼ºï¼1.jdk7è¯æ³ä¸
1.1äºè¿å¶åéç表示,源码æ¯æå°æ´æ°ç±»åç¨äºè¿å¶æ¥è¡¨ç¤ºï¼ç¨0bå¼å¤´ã
1.2 Switchè¯å¥æ¯æstringç±»å
1.3Try-with-resourceè¯å¥
注æï¼å®ç°java.lang.AutoCloseableæ¥å£çèµæºé½å¯ä»¥æ¾å°tryä¸ï¼è·finaléé¢çå ³éèµæºç±»ä¼¼ï¼æç §å£°æéåºå ³éèµæº;Tryåæåºçå¼å¸¸éè¿Throwable.getSuppressedè·å
1.4Catchå¤ä¸ªå¼å¸¸è¯´æï¼Catchå¼å¸¸ç±»å为finalï¼çæBytecodeä¼æ¯å¤ä¸ªcatchå°ï¼Rethrowæ¶ä¿æå¼å¸¸ç±»å
1.5æ°åç±»åçä¸å线表示æ´å好ç表示æ¹å¼ï¼ä¸è¿è¦æ³¨æä¸å线添å çä¸äºæ å
1.6æ³åå®ä¾çå建å¯ä»¥éè¿ç±»åæ¨ææ¥ç®åå¯ä»¥å»æåé¢newé¨åçæ³åç±»åï¼åªç¨<>å°±å¯ä»¥äº
1.7å¨å¯ååæ°æ¹æ³ä¸ä¼ ééå ·ä½ååæ°,æ¹è¿ç¼è¯è¦ååé误
1.8ä¿¡æ¯æ´ä¸°å¯çå溯追踪就æ¯ä¸é¢tryä¸tryè¯å¥åéé¢çè¯å¥åæ¶æåºå¼å¸¸æ¶ï¼å¼å¸¸æ çä¿¡æ¯
2.NIO2çä¸äºæ°ç¹æ§
1.java.nio.fileåjava.nio.file.attributeå æ¯ææ´è¯¦ç»å±æ§ï¼æ¯å¦æéï¼ææè
2. symbolicandhardlinksæ¯æ
3.Path访é®æ件系ç»ï¼Filesæ¯æåç§æ件æä½
4.é«æç访é®metadataä¿¡æ¯
5.éå½æ¥æ¾æ件æ ï¼æ件æ©å±æç´¢
6.æ件系ç»ä¿®æ¹éç¥æºå¶
7.Fileç±»æä½APIå ¼å®¹
8.æ件éæºè®¿é®å¢å¼ºmappingaregion,loclaregion,ç»å¯¹ä½ç½®è¯»å
9.AIOReactorï¼åºäºäºä»¶ï¼åProactor
2.1IOandNewIOçå¬æ件系ç»ååéç¥
éè¿FileSystems.getDefault().newWatchService()è·åwatchServiceï¼ç¶åå°éè¦çå¬çpathç®å½æ³¨åå°è¿ä¸ªwatchserviceä¸ï¼å¯¹äºè¿ä¸ªç®å½çæ件修æ¹ï¼æ°å¢ï¼å é¤çå®è·µå¯ä»¥é ç½®ï¼ç¶åå°±èªå¨è½çå¬å°ååºçäºä»¶ã
2.2IOandNewIOéåæ件æ ï¼éè¿ç»§æ¿SimpleFileVisitorç±»ï¼å®ç°äºä»¶éåç®å½æ çæä½ï¼ç¶åéè¿Files.walkFileTree(listDir,opts,Integer.MAX_VALUE,walk);è¿ä¸ªAPIæ¥éåç®å½æ
2.3AIOå¼æ¥IOæ件åç½ç»å¼æ¥IOå¨java
NIO2å®ç°äºï¼é½æ¯ç¨AsynchronousFileChannelï¼AsynchronousSocketChanneçå®ç°ï¼å ³äºåæ¥é»å¡IOï¼åæ¥éé»å¡IOï¼å¼æ¥é»å¡IOåå¼æ¥éé»å¡IOãJavaNIO2ä¸å°±å®ç°äºæä½ç³»ç»çå¼æ¥éé»å¡IOã
3.JDBC4.1
3.1.å¯ä»¥ä½¿ç¨try-with-resourcesèªå¨å ³éConnection,ResultSet,åStatementèµæºå¯¹è±¡
3.2.RowSet1.1ï¼å¼å ¥RowSetFactoryæ¥å£åRowSetProviderç±»ï¼å¯ä»¥å建JDBCdriveræ¯æçåç§rowsetsï¼è¿éçrowsetå®ç°å ¶å®å°±æ¯å°sqlè¯å¥ä¸çä¸äºæä½è½¬ä¸ºæ¹æ³çæä½ï¼å°è£ äºä¸äºåè½ã
3.3.JDBC-ODBC驱å¨ä¼å¨jdk8ä¸å é¤
4.并åå·¥å ·å¢å¼º
4.1.fork-join
æ大çå¢å¼ºï¼å åå©ç¨å¤æ ¸ç¹æ§ï¼å°å¤§é®é¢å解æå个åé®é¢ï¼ç±å¤ä¸ªcpuå¯ä»¥åæ¶è§£å³å¤ä¸ªåé®é¢ï¼æåå并ç»æï¼ç»§æ¿RecursiveTaskï¼å®ç°computeæ¹æ³ï¼ç¶åè°ç¨fork计ç®ï¼æåç¨joinå并ç»æã
4.2.ThreadLocalRandon并åä¸éæºæ°çæç±»ï¼ä¿è¯å¹¶åä¸çéæºæ°çæç线ç¨å®å ¨ï¼å®é ä¸å°±æ¯ä½¿ç¨threadlocal
4.3.phaser类似cyclebarrieråcountdownlatchï¼ä¸è¿å¯ä»¥å¨ææ·»å èµæºåå°èµæº
5.Networkingå¢å¼º
æ°å¢URLClassLoadercloseæ¹æ³ï¼å¯ä»¥åæ¶å ³éèµæºï¼åç»éæ°å è½½classæ件æ¶ä¸ä¼å¯¼è´èµæºè¢«å ç¨æè æ æ³éæ¾é®é¢
URLClassLoader.newInstance(newURL[]{ }).close();
æ°å¢SocketsDirectProtocol
ç»è¿æä½ç³»ç»çæ°æ®æ·è´ï¼å°æ°æ®ä»ä¸å°æºå¨çå åæ°æ®éè¿ç½ç»ç´æ¥ä¼ è¾å°å¦å¤ä¸å°æºå¨çå åä¸
6.MultithreadedCustomClassLoaders
解å³å¹¶åä¸å è½½classå¯è½å¯¼è´çæ»éé®é¢ï¼è¿ä¸ªæ¯jdk1.6çä¸äºæ°çæ¬å°±è§£å³äºï¼jdk7ä¹åäºä¸äºä¼åãæå ´è¶£å¯ä»¥ä»ç»ä»å®æ¹æ档详ç»äºè§£
JDK1.8çæ°ç¹æ§
ä¸ãæ¥å£çé»è®¤æ¹æ³
Java8å 许æ们ç»æ¥å£æ·»å ä¸ä¸ªéæ½è±¡çæ¹æ³å®ç°ï¼åªéè¦ä½¿ç¨defaultå ³é®åå³å¯ï¼è¿ä¸ªç¹å¾åå«åæ©å±æ¹æ³ã
äºãLambda表达å¼
å¨Java8ä¸ä½ å°±æ²¡å¿ è¦ä½¿ç¨è¿ç§ä¼ ç»çå¿å对象çæ¹å¼äºï¼Java8æä¾äºæ´ç®æ´çè¯æ³ï¼lambda表达å¼ï¼
Collections.sort(names,(Stringa,Stringb)->{
returnb.compareTo(a);
});
ä¸ãå½æ°å¼æ¥å£
Lambda表达å¼æ¯å¦ä½å¨javaçç±»åç³»ç»ä¸è¡¨ç¤ºçå¢ï¼æ¯ä¸ä¸ªlambda表达å¼é½å¯¹åºä¸ä¸ªç±»åï¼é常æ¯æ¥å£ç±»åãèâå½æ°å¼æ¥å£âæ¯æä» ä» åªå å«ä¸ä¸ªæ½è±¡æ¹æ³çæ¥å£ï¼æ¯ä¸ä¸ªè¯¥ç±»åçlambda表达å¼é½ä¼è¢«å¹é å°è¿ä¸ªæ½è±¡æ¹æ³ãå 为é»è®¤æ¹æ³ä¸ç®æ½è±¡æ¹æ³ï¼æä»¥ä½ ä¹å¯ä»¥ç»ä½ çå½æ°å¼æ¥å£æ·»å é»è®¤æ¹æ³ã
åãæ¹æ³ä¸æé å½æ°å¼ç¨
Java8å è®¸ä½ ä½¿ç¨::å ³é®åæ¥ä¼ éæ¹æ³æè æé å½æ°å¼ç¨ï¼ä¸é¢ç代ç å±ç¤ºäºå¦ä½å¼ç¨ä¸ä¸ªéææ¹æ³ï¼æ们ä¹å¯ä»¥å¼ç¨ä¸ä¸ªå¯¹è±¡çæ¹æ³ï¼
converter=something::startsWith;
Stringconverted=converter.convert("Java");
System.out.println(converted);
äºãLambdaä½ç¨å
å¨lambda表达å¼ä¸è®¿é®å¤å±ä½ç¨ååèçæ¬çå¿å对象ä¸çæ¹å¼å¾ç¸ä¼¼ãä½ å¯ä»¥ç´æ¥è®¿é®æ è®°äºfinalçå¤å±å±é¨åéï¼æè å®ä¾çå段以åéæåéã
å ã访é®å±é¨åé
å¯ä»¥ç´æ¥å¨lambda表达å¼ä¸è®¿é®å¤å±çå±é¨åéï¼
ä¸ã访é®å¯¹è±¡å段ä¸éæåé
åæ¬å°åéä¸åçæ¯ï¼lambdaå é¨å¯¹äºå®ä¾çå段以åéæåéæ¯å³å¯è¯»åå¯åã该è¡ä¸ºåå¿å对象æ¯ä¸è´çï¼
å «ã访é®æ¥å£çé»è®¤æ¹æ³
JDK1.8APIå å«äºå¾å¤å 建çå½æ°å¼æ¥å£ï¼å¨èJavaä¸å¸¸ç¨å°çæ¯å¦Comparatoræè Runnableæ¥å£ï¼è¿äºæ¥å£é½å¢å äº@FunctionalInterface注解以便è½ç¨å¨lambdaä¸ã
Java8APIåæ ·è¿æä¾äºå¾å¤å ¨æ°çå½æ°å¼æ¥å£æ¥è®©å·¥ä½æ´å æ¹ä¾¿ï¼æä¸äºæ¥å£æ¯æ¥èªGoogleGuavaåºéçï¼å³ä¾¿ä½ 对è¿äºå¾çæäºï¼è¿æ¯æå¿ è¦ççè¿äºæ¯å¦ä½æ©å±å°lambdaä¸ä½¿ç¨çã
Java中删除文件或文件夹的几种方法
在Java中,有几种方法可以删除文件或文件夹,源码尽管它们的源码共同点是仅能删除空文件夹。首先,源码File类的源码delete()方法和NIO中的Files.delete(Path path)方法都是基础操作,它们的源码区别在于File.delete()适用于传统的IO操作,而Files.delete()则对应于NIO。源码删除整个目录或部分文件时,源码可以使用walkFileTree方法配合FileVisitor,源码这样可以确保先处理文件,避免因文件夹内容未清空而引发的cstd源码异常。
例如,通过walkFileTree,我们可以根据文件名、创建时间、修改时间或文件大小等条件进行筛选和删除。Files.walk方法利用Stream流处理,虽然可能需要对Stream语法有一定理解,但操作相对直观。通过reverseOrder()排序,可以确保文件先于其父文件夹被删除。
传统的递归方法也是常见的删除策略,但需注意listFiles()仅列出一级子文件和子文件夹,需递归地先删除子文件夹,再处理主文件夹。
下面是一段简化后的代码示例,展示了如何通过这些方法实现文件和文件夹的awx源码删除顺序:
1. 使用File类的delete()或Files.delete()删除空文件夹。
2. 利用walkFileTree和FileVisitor删除文件和文件夹,确保顺序:先文件后文件夹。
3. 通过Files.walk和条件筛选删除,如按名称、时间或大小。
4. 传统递归方法,注意listFiles()的限制,需先删除子文件夹再删除文件夹。
这四个方法分别演示了从不同角度处理文件和文件夹删除操作的逻辑,确保了删除过程的准确性。
Java多种文件复制方式以及效率比较
Java复制文件的方式有很多种,可以分为以下几种:
接下来,我们来探讨一下这些方法的效率,主要衡量标准是时间,还有大文件复制时的内存溢出等问题。
由于复制文件往往需要包括文件夹下的skpan源码所有子目录及文件,所以作者采用了遍历+复制的方法。这个过程分为先遍历,遍历过程中遇到文件夹就创建,遇到文件就调用不同的复制方法。
遍历的5种方法有:
复制的8种方法有:
另外,作者不太想看控制台,所以配合了一点Swing使用。
遍历的具体方法如下:
1. listFiles():通过srcFile的listFiles()获取所有的子文件与子文件夹,然后判断是否是目录。
2. list():与listFiles()类似,不过是String[],也是先判断目录,创建目录,不是目录直接复制。
3. org.codehaus.plexus.util.FileUtils.getFiles:这是使用了别人的工具类进行遍历。
4. Commons.io:使用org.apache.commons.io.FileUtils的aii源码listFiles方法,参数为要遍历的目录,一个null和一个false,第二个参数表示过滤器,表示过滤出特定后缀名的文件,类型为String [],第三个布尔参数表示是否递归访问子目录。
5. walkFileTree:利用FileVisitor这个接口,实际中常用SimpleFileVisitor。
复制的具体方法如下:
1. FileInputStream+FileOutputStream:经典的字节流方式,使用FileInputStream读取后使用FileOutputStream写入,但效率一般。
2. BufferedInputStream+BufferedOutputStream:缓冲字节流,相比FileInputStream,BufferedInputStream读取时会先从缓冲区读取数据,缓冲区无可读数据再从文件读取,所以会比FileInputStream快。
3. FileReader+FileWriter:字符流读写,相比字节流的read,基本上把byte[]换成char[]即可,因为是逐个字符读取,而字节流是逐个字节读取。
4. BufferedReader+BufferedWriter:缓冲字符流读写,BufferedReader相比FileReader有一个readLine()方法,可以每行读入,会比FileReader快。
5. FileChannel:通过FileChannel复制,首先通过FileInputStream与FileOutputStream打开流,再用getChannel()方法。最后使用transferTo()或transferFrom()进行复制,一条语句即可,十分方便,而且效率很高。
6. FileChannel+ByteBuffer:在利用了FileInputStream与FileOutputStream打开了FileChannel的基础上,配合ByteBuffer使用。
7. FileUtils.copyFile():这是工具类,参数是两个File,分别表示源与目标。
8. Files.copy():这是官方提供的Files工具类,前两个参数为Path,分别表示源与目标,可以设置第三个参数(或者省略),表示选项。
至于具体使用哪种方法,还需要根据具体环境和需求进行测试和选择。
使用Java API进行tar.gz文件及文件夹压缩解压缩
在Java(JDK)环境中,可以通过ZipOutputStream创建zip格式的压缩文件,或者使用GZIPOutputStream创建gzip(gz)格式的压缩文件。然而,Java官方并没有提供创建tar.gz文件的API,因此需要借助第三方库,例如Apache Commons Compress,来创建tar.gz文件。
在pom.xml文件中,可以通过以下Maven坐标引入commons-compress库:
解释说明
如果您觉得这篇文章对您有所帮助,请给予点赞,您的支持将是我持续创作的动力!
一、将两个文件打包到tar.gz
以下示例展示了如何将两个文件打包成tar.gz压缩文件。代码中使用的try-with-resources语法确保流在使用完毕后自动关闭,无需手动操作。
将file-a.xml和file-b.txt打包到output.tar文件中,并使用gzip进行压缩。可以使用以下命令查看tar包中包含的文件。
二、将一个文件夹压缩为tar.gz
以下示例展示了如何将一个包含子文件夹的文件夹压缩为tar文件,并使用gzip进行压缩,最终生成tar.gz压缩文件。其核心原理是使用Files.walkFileTree遍历文件目录树中的文件,并将其逐个添加到TarArchiveOutputStream输出流中。
三、解压tar.gz压缩文件
以下示例说明了如何解压一个tar.gz文件,具体操作请参考代码注释。
欢迎关注我的博客,那里有更多精品内容。
如果觉得文章有帮助,请点赞和分享!您的支持是我不断前进的动力。此外,我近期还发布了以下精品内容,期待您的关注。
Java使用输入输出流完成,剪切,复制,粘贴,删除的功能(最好是代码解决此问题,比较直观,谢谢)
你可以看看Java的NIO的包和FileVisitor interface以及walkFileTree方法,这里写两个例子,一个删除一个复制,代码来自于oracle删除
Path start = ...Files.walkFileTree(start, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
throws IOException
{
Files.delete(file);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException e)
throws IOException
{
if (e == null) {
Files.delete(dir);
return FileVisitResult.CONTINUE;
} else {
// directory iteration failed
throw e;
}
}
});
复制
final Path source = ...final Path target = ...
Files.walkFileTree(source, EnumSet.of(FileVisitOption.FOLLOW_LINKS), Integer.MAX_VALUE,
new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs)
throws IOException
{
Path targetdir = target.resolve(source.relativize(dir));
try {
Files.copy(dir, targetdir);
} catch (FileAlreadyExistsException e) {
if (!Files.isDirectory(targetdir))
throw e;
}
return CONTINUE;
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
throws IOException
{
Files.copy(file, target.resolve(source.relativize(file)));
return CONTINUE;
}
});