Apache Commons IO是由Apache Foundation创建和维护的Java库。 它提供了许多类,使开发人员可以轻松地完成常见任务,并且减少样板代码 ,而每个项目都需要一遍又一遍地编写此类库的重要性是巨大的,因为它们已经成熟由经验丰富的开发人员进行维护 ,他们已经考虑了每种可能的情况,或者修复了各种错误。

在此示例中,我们将根据功能所属的org.apache.commons.io包介绍一些具有不同功能的方法。 我们不会在库中深入研究,因为它巨大,但是我们将提供一些常见用法的示例,这些示例对于每个开发人员(无论初学者或不入门)都可以派上用场。

1. Apache Commons IO示例

该示例的代码将分为几个类,并且每个类都代表Apache Commons IO涵盖的特定领域。 这些区域是:

  • 实用程序类
  • 输入项
  • 输出量
  • 筛选器
  • 比较器
  • 文件监控

为了使事情更清楚,我们将输出分成多个 ,每个创建的类一个。 我们还在项目文件夹(名为ExampleFolder )内创建了一个目录,其中包含将在此示例中使用的各种文件,以显示各种类的功能。

注意:为了使用org.apache.commons.io ,您需要下载jar文件(在此处找到),并通过右键单击项目文件夹-> Build Path->将它们添加到Eclipse项目的构建路径中。添加外部档案。

ApacheCommonsExampleMain.java

public class ApacheCommonsExampleMain {public static void main(String[] args) {UtilityExample.runExample();FileMonitorExample.runExample();FiltersExample.runExample();InputExample.runExample();OutputExample.runExample();ComparatorExample.runExample();}
}

这是将用于运行示例中其他类的方法的主要类。 您可以注释某些类以查看所需的输出。

1.1实用程序类

org.apache.commons.io内有各种实用程序类,其中大多数与文件操作和字符串比较有关。 我们在这里使用了一些最重要的方法:

  • FilenameUtils :此类具有使用文件名的方法,主要要点是使每个OS的工作更轻松(在Unix和Windows系统中同样有效)。
  • FileUtils :它提供用于文件操作 (移动,打开和读取文件,检查文件是否存在等)的方法。
  • IOCase :字符串操作和比较方法。
  • FileSystemUtils :其方法返回指定驱动器的可用空间。

UtilityExample.java

import java.io.File;
import java.io.IOException;import org.apache.commons.io.FileSystemUtils;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.LineIterator;
import org.apache.commons.io.IOCase;public final class UtilityExample {// We are using the file exampleTxt.txt in the folder ExampleFolder,// and we need to provide the full path to the Utility classes.private static final String EXAMPLE_TXT_PATH ="C:\\Users\\Lilykos\\workspace\\ApacheCommonsExample\\ExampleFolder\\exampleTxt.txt";private static final String PARENT_DIR ="C:\\Users\\Lilykos\\workspace\\ApacheCommonsExample";public static void runExample() throws IOException {System.out.println("Utility Classes example...");// FilenameUtilsSystem.out.println("Full path of exampleTxt: " +FilenameUtils.getFullPath(EXAMPLE_TXT_PATH));System.out.println("Full name of exampleTxt: " +FilenameUtils.getName(EXAMPLE_TXT_PATH));System.out.println("Extension of exampleTxt: " +FilenameUtils.getExtension(EXAMPLE_TXT_PATH));System.out.println("Base name of exampleTxt: " +FilenameUtils.getBaseName(EXAMPLE_TXT_PATH));// FileUtils// We can create a new File object using FileUtils.getFile(String)// and then use this object to get information from the file.File exampleFile = FileUtils.getFile(EXAMPLE_TXT_PATH);LineIterator iter = FileUtils.lineIterator(exampleFile);System.out.println("Contents of exampleTxt...");while (iter.hasNext()) {System.out.println("\t" + iter.next());}iter.close();// We can check if a file exists somewhere inside a certain directory.File parent = FileUtils.getFile(PARENT_DIR);System.out.println("Parent directory contains exampleTxt file: " +FileUtils.directoryContains(parent, exampleFile));// IOCaseString str1 = "This is a new String.";String str2 = "This is another new String, yes!";System.out.println("Ends with string (case sensitive): " +IOCase.SENSITIVE.checkEndsWith(str1, "string."));System.out.println("Ends with string (case insensitive): " +IOCase.INSENSITIVE.checkEndsWith(str1, "string."));System.out.println("String equality: " +IOCase.SENSITIVE.checkEquals(str1, str2));// FileSystemUtilsSystem.out.println("Free disk space (in KB): " + FileSystemUtils.freeSpaceKb("C:"));System.out.println("Free disk space (in MB): " + FileSystemUtils.freeSpaceKb("C:") / 1024);}
}

输出量

Utility Classes example...
Full path of exampleTxt: C:\Users\Lilykos\workspace\ApacheCommonsExample\ExampleFolder\
Full name of exampleTxt: exampleTxt.txt
Extension of exampleTxt: txt
Base name of exampleTxt: exampleTxt
Contents of exampleTxt...This is an example text file.We will use it for experimenting with Apache Commons IO.
Parent directory contains exampleTxt file: true
Ends with string (case sensitive): false
Ends with string (case insensitive): true
String equality: false
Free disk space (in KB): 32149292
Free disk space (in MB): 31395

1.2文件监控器

org.apache.commons.io.monitor软件包包含可以获取有关文件的特定信息的方法,但更重要的是,它可以创建可用于跟踪特定文件或文件夹中的更改并根据更改执行操作的处理程序。 。 让我们看一下代码:

FileMonitorExample.java

import java.io.File;
import java.io.IOException;import org.apache.commons.io.FileDeleteStrategy;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.monitor.FileAlterationListenerAdaptor;
import org.apache.commons.io.monitor.FileAlterationMonitor;
import org.apache.commons.io.monitor.FileAlterationObserver;
import org.apache.commons.io.monitor.FileEntry;public final class FileMonitorExample {private static final String EXAMPLE_PATH ="C:\\Users\\Lilykos\\workspace\\ApacheCommonsExample\\ExampleFolder\\exampleFileEntry.txt";private static final String PARENT_DIR ="C:\\Users\\Lilykos\\workspace\\ApacheCommonsExample\\ExampleFolder";private static final String NEW_DIR ="C:\\Users\\Lilykos\\workspace\\ApacheCommonsExample\\ExampleFolder\\newDir";private static final String NEW_FILE ="C:\\Users\\Lilykos\\workspace\\ApacheCommonsExample\\ExampleFolder\\newFile.txt";public static void runExample() {System.out.println("File Monitor example...");// FileEntry// We can monitor changes and get information about files// using the methods of this class.FileEntry entry = new FileEntry(FileUtils.getFile(EXAMPLE_PATH));System.out.println("File monitored: " + entry.getFile());System.out.println("File name: " + entry.getName());System.out.println("Is the file a directory?: " + entry.isDirectory());// File Monitoring// Create a new observer for the folder and add a listener// that will handle the events in a specific directory and take action.File parentDir = FileUtils.getFile(PARENT_DIR);FileAlterationObserver observer = new FileAlterationObserver(parentDir);observer.addListener(new FileAlterationListenerAdaptor() {@Overridepublic void onFileCreate(File file) {System.out.println("File created: " + file.getName());}@Overridepublic void onFileDelete(File file) {System.out.println("File deleted: " + file.getName());}@Overridepublic void onDirectoryCreate(File dir) {System.out.println("Directory created: " + dir.getName());}@Overridepublic void onDirectoryDelete(File dir) {System.out.println("Directory deleted: " + dir.getName());}});// Add a monior that will check for events every x ms,// and attach all the different observers that we want.FileAlterationMonitor monitor = new FileAlterationMonitor(500, observer);try {monitor.start();// After we attached the monitor, we can create some files and directories// and see what happens!File newDir = new File(NEW_DIR);File newFile = new File(NEW_FILE);newDir.mkdirs();newFile.createNewFile();Thread.sleep(1000);FileDeleteStrategy.NORMAL.delete(newDir);FileDeleteStrategy.NORMAL.delete(newFile);Thread.sleep(1000);monitor.stop();} catch (IOException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}
}

输出量

File Monitor example...
File monitored: C:\Users\Lilykos\workspace\ApacheCommonsExample\ExampleFolder\exampleFileEntry.txt
File name: exampleFileEntry.txt
Is the file a directory?: false
Directory created: newDir
File created: newFile.txt
Directory deleted: newDir
File deleted: newFile.txt

让我们看看这里发生了什么。 我们使用了org.apache.commons.io.monitor包中的某些类,这些类使我们能够创建侦听特定事件的处理程序 (在本例中,该处理程序与文件,文件夹,目录等有关)。 为了实现这一点,需要采取某些步骤:

  1. 创建一个File对象,该对象是我们要侦听更改的目录的引用。
  2. 创建一个FileAlterationObserver对象,该对象将观察这些更改。
  3. 使用addListener()方法将FileAlterationListenerAdaptor添加到观察器。 您可以使用多种方法来创建适配器,但是在我们的示例中,我们使用了一个嵌套类,该类仅实现某些方法(示例要求所需要的方法)。
  4. 创建一个FileAlterationMonitor并添加您拥有的观察者以及间隔(以毫秒为单位)。
  5. 使用start()方法启动监视器,并在必要时使用stop()方法将其stop()

1.3过滤器

过滤器可以多种组合方式使用 。 他们的工作是使我们能够轻松区分文件,并获得满足特定条件的文件。 我们还可以结合使用过滤器来执行逻辑比较并更精确地获取文件,而无需在以后使用繁琐的字符串比较。

FiltersExample.java

import java.io.File;import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOCase;
import org.apache.commons.io.filefilter.AndFileFilter;
import org.apache.commons.io.filefilter.NameFileFilter;
import org.apache.commons.io.filefilter.NotFileFilter;
import org.apache.commons.io.filefilter.OrFileFilter;
import org.apache.commons.io.filefilter.PrefixFileFilter;
import org.apache.commons.io.filefilter.SuffixFileFilter;
import org.apache.commons.io.filefilter.WildcardFileFilter;public final class FiltersExample {private static final String PARENT_DIR ="C:\\Users\\Lilykos\\workspace\\ApacheCommonsExample\\ExampleFolder";public static void runExample() {System.out.println("File Filter example...");// NameFileFilter// Right now, in the parent directory we have 3 files://      directory example//      file exampleEntry.txt//      file exampleTxt.txt// Get all the files in the specified directory// that are named "example".File dir = FileUtils.getFile(PARENT_DIR);String[] acceptedNames = {"example", "exampleTxt.txt"};for (String file: dir.list(new NameFileFilter(acceptedNames, IOCase.INSENSITIVE))) {System.out.println("File found, named: " + file);}//WildcardFileFilter// We can use wildcards in order to get less specific results//      ? used for 1 missing char//      * used for multiple missing charsfor (String file: dir.list(new WildcardFileFilter("*ample*"))) {System.out.println("Wildcard file found, named: " + file);}// PrefixFileFilter // We can also use the equivalent of startsWith// for filtering files.for (String file: dir.list(new PrefixFileFilter("example"))) {System.out.println("Prefix file found, named: " + file);}// SuffixFileFilter// We can also use the equivalent of endsWith// for filtering files.for (String file: dir.list(new SuffixFileFilter(".txt"))) {System.out.println("Suffix file found, named: " + file);}// OrFileFilter // We can use some filters of filters.// in this case, we use a filter to apply a logical // or between our filters.for (String file: dir.list(new OrFileFilter(new WildcardFileFilter("*ample*"), new SuffixFileFilter(".txt")))) {System.out.println("Or file found, named: " + file);}// And this can become very detailed.// Eg, get all the files that have "ample" in their name// but they are not text files (so they have no ".txt" extension.for (String file: dir.list(new AndFileFilter( // we will match 2 filters...new WildcardFileFilter("*ample*"), // ...the 1st is a wildcard...new NotFileFilter(new SuffixFileFilter(".txt"))))) { // ...and the 2nd is NOT .txt.System.out.println("And/Not file found, named: " + file);}}
}

输出量

File Filter example...
File found, named: example
File found, named: exampleTxt.txt
Wildcard file found, named: example
Wildcard file found, named: exampleFileEntry.txt
Wildcard file found, named: exampleTxt.txt
Prefix file found, named: example
Prefix file found, named: exampleFileEntry.txt
Prefix file found, named: exampleTxt.txt
Suffix file found, named: exampleFileEntry.txt
Suffix file found, named: exampleTxt.txt
Or file found, named: example
Or file found, named: exampleFileEntry.txt
Or file found, named: exampleTxt.txt
And/Not file found, named: example

1.4比较器

org.apache.commons.io.comparator软件包包含一些类,这些类使我们可以轻松地对文件和目录进行比较和排序。 我们只需要提供文件列表,并根据类,以各种方式对它们进行比较。

ComparatorExample.java

import java.io.File;
import java.util.Date;import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOCase;
import org.apache.commons.io.comparator.LastModifiedFileComparator;
import org.apache.commons.io.comparator.NameFileComparator;
import org.apache.commons.io.comparator.SizeFileComparator;public final class ComparatorExample {private static final String PARENT_DIR ="C:\\Users\\Lilykos\\workspace\\ApacheCommonsExample\\ExampleFolder";private static final String FILE_1 ="C:\\Users\\Lilykos\\workspace\\ApacheCommonsExample\\ExampleFolder\\example";private static final String FILE_2 ="C:\\Users\\Lilykos\\workspace\\ApacheCommonsExample\\ExampleFolder\\exampleTxt.txt";public static void runExample() {System.out.println("Comparator example...");//NameFileComparator// Let's get a directory as a File object// and sort all its files.File parentDir = FileUtils.getFile(PARENT_DIR);NameFileComparator comparator = new NameFileComparator(IOCase.SENSITIVE);File[] sortedFiles = comparator.sort(parentDir.listFiles());System.out.println("Sorted by name files in parent directory: ");for (File file: sortedFiles) {System.out.println("\t"+ file.getAbsolutePath());}// SizeFileComparator// We can compare files based on their size.// The boolean in the constructor is about the directories.//      true: directory's contents count to the size.//      false: directory is considered zero size.SizeFileComparator sizeComparator = new SizeFileComparator(true);File[] sizeFiles = sizeComparator.sort(parentDir.listFiles());System.out.println("Sorted by size files in parent directory: ");for (File file: sizeFiles) {System.out.println("\t"+ file.getName() + " with size (kb): " + file.length());}// LastModifiedFileComparator// We can use this class to find which file was more recently modified.LastModifiedFileComparator lastModified = new LastModifiedFileComparator();File[] lastModifiedFiles = lastModified.sort(parentDir.listFiles());System.out.println("Sorted by last modified files in parent directory: ");for (File file: lastModifiedFiles) {Date modified = new Date(file.lastModified());System.out.println("\t"+ file.getName() + " last modified on: " + modified);}// Or, we can also compare 2 specific files and find which one was last modified.//      returns > 0 if the first file was last modified.//      returns  0)System.out.println("File " + file1.getName() + " was modified last because...");elseSystem.out.println("File " + file2.getName() + "was modified last because...");System.out.println("\t"+ file1.getName() + " last modified on: " +new Date(file1.lastModified()));System.out.println("\t"+ file2.getName() + " last modified on: " +new Date(file2.lastModified()));}
}

输出量

Comparator example...
Sorted by name files in parent directory: C:\Users\Lilykos\workspace\ApacheCommonsExample\ExampleFolder\comparator1.txtC:\Users\Lilykos\workspace\ApacheCommonsExample\ExampleFolder\comperator2.txtC:\Users\Lilykos\workspace\ApacheCommonsExample\ExampleFolder\exampleC:\Users\Lilykos\workspace\ApacheCommonsExample\ExampleFolder\exampleFileEntry.txtC:\Users\Lilykos\workspace\ApacheCommonsExample\ExampleFolder\exampleTxt.txt
Sorted by size files in parent directory: example with size (kb): 0exampleTxt.txt with size (kb): 87exampleFileEntry.txt with size (kb): 503comperator2.txt with size (kb): 1458comparator1.txt with size (kb): 4436
Sorted by last modified files in parent directory: exampleTxt.txt last modified on: Sun Oct 26 14:02:22 EET 2014example last modified on: Sun Oct 26 23:42:55 EET 2014comparator1.txt last modified on: Tue Oct 28 14:48:28 EET 2014comperator2.txt last modified on: Tue Oct 28 14:48:52 EET 2014exampleFileEntry.txt last modified on: Tue Oct 28 14:53:50 EET 2014
File example was modified last because...example last modified on: Sun Oct 26 23:42:55 EET 2014exampleTxt.txt last modified on: Sun Oct 26 14:02:22 EET 2014

让我们看看这里使用了哪些类:

  • NameFileComparator :根据文件名比较文件。
  • SizeFileComparator :根据文件大小比较文件。
  • LastModifiedFileComparator :根据文件的最后修改日期比较文件。

您还应该在这里注意,比较可以在整个目录中进行(使用sort()方法sort()它们进行排序),也可以在两个文件中分别进行compare()使用compare() )。

1.5输入

org.apache.commons.io.input包中有InputStream各种实现。 我们将研究最有用的一个TeeInputStream ,它同时使用InputStreamOutputStream作为参数,并自动将从输入中读取的字节复制到输出中。 此外,通过使用第三个布尔值参数,最后只关闭TeeInputStream ,两个附加流也将关闭。

InputExample.java

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;import org.apache.commons.io.FileUtils;
import org.apache.commons.io.input.TeeInputStream;
import org.apache.commons.io.input.XmlStreamReader;public final class InputExample {private static final String XML_PATH ="C:\\Users\\Lilykos\\workspace\\ApacheCommonsExample\\InputOutputExampleFolder\\web.xml";private static final String INPUT = "This should go to the output.";public static void runExample() {System.out.println("Input example...");XmlStreamReader xmlReader = null;TeeInputStream tee = null;try {// XmlStreamReader// We can read an xml file and get its encoding.File xml = FileUtils.getFile(XML_PATH);xmlReader = new XmlStreamReader(xml);System.out.println("XML encoding: " + xmlReader.getEncoding());// TeeInputStream// This very useful class copies an input stream to an output stream// and closes both using only one close() method (by defining the 3rd// constructor parameter as true).ByteArrayInputStream in = new ByteArrayInputStream(INPUT.getBytes("US-ASCII"));ByteArrayOutputStream out = new ByteArrayOutputStream();tee = new TeeInputStream(in, out, true);tee.read(new byte[INPUT.length()]);System.out.println("Output stream: " + out.toString());         } catch (IOException e) {e.printStackTrace();} finally {try { xmlReader.close(); }catch (IOException e) { e.printStackTrace(); }try { tee.close(); }catch (IOException e) { e.printStackTrace(); }}}
}

输出量

Input example...
XML encoding: UTF-8
Output stream: This should go to the output.

1.6输出

org.apache.commons.io.input相似, org.apache.commons.io.output具有OutputStream实现,可以在许多情况下使用。 一个非常有趣的是TeeOutputStream ,它允许将输出流进行分支,换句话说,我们可以将输入流发送到2个不同的输出。

OutputExample.java

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;import org.apache.commons.io.input.TeeInputStream;
import org.apache.commons.io.output.TeeOutputStream;public final class OutputExample {private static final String INPUT = "This should go to the output.";public static void runExample() {System.out.println("Output example...");TeeInputStream teeIn = null;TeeOutputStream teeOut = null;try {// TeeOutputStreamByteArrayInputStream in = new ByteArrayInputStream(INPUT.getBytes("US-ASCII"));ByteArrayOutputStream out1 = new ByteArrayOutputStream();ByteArrayOutputStream out2 = new ByteArrayOutputStream();teeOut = new TeeOutputStream(out1, out2);teeIn = new TeeInputStream(in, teeOut, true);teeIn.read(new byte[INPUT.length()]);System.out.println("Output stream 1: " + out1.toString());System.out.println("Output stream 2: " + out2.toString());} catch (IOException e) {e.printStackTrace();} finally {// No need to close teeOut. When teeIn closes, it will also close its// Output stream (which is teeOut), which will in turn close the 2// branches (out1, out2).try { teeIn.close(); }catch (IOException e) { e.printStackTrace(); }}}
}

输出量

Output example...
Output stream 1: This should go to the output.
Output stream 2: This should go to the output.

2.下载完整示例

这是Apache Commons IO的简介 ,涵盖了大多数为开发人员提供简单解决方案的重要类。 这个庞大的软件包中还有许多其他功能,但是通过使用此介绍,您可以了解将来的项目的总体思路和一些有用的工具!

下载
您可以在此处下载此示例的完整源代码: ApacheCommonsIOExample.rar

翻译自: https://www.javacodegeeks.com/2014/10/apache-commons-io-tutorial.html

Apache Commons IO教程:初学者指南相关推荐

  1. [转]Apache Commons IO入门教程

    Apache Commons IO是Apache基金会创建并维护的Java函数库.它提供了许多类使得开发者的常见任务变得简单,同时减少重复(boiler-plate)代码,这些代码可能遍布于每个独立的 ...

  2. java.lang.NoClassDefFoundError:org/apache/commons/io/Charsets (jsoup配合htmlunit 爬取异步加载的网页遇到的)

    最近用jsoup配合htmlunit 爬取异步加载的网页运行代码的时候,报错java.lang.NoClassDefFoundError:org/apache/commons/io/Charsets ...

  3. 使用org.apache.commons.io.FileUtils,IOUtils工具类操作文件

    转载自 使用org.apache.commons.io.FileUtils,IOUtils;工具类操作文件 File src = new File("G:/2012/portal/login ...

  4. 使用Apache Commons IO组件读取大文件

    Apache Commons IO读取文件代码如下: Files.readLines(new File(path), Charsets.UTF_8); FileUtils.readLines(new ...

  5. IO与文件读写---使用Apache commons io包提高读写效率

    [一]Apache commons IO简介 首先贴一段Apache commons IO官网上的介绍,来对这个著名的开源包有一个基本的了解: Commons IO is a library of u ...

  6. Apache Commons CSV 教程

    Apache Commons CSV 教程 Apache Commons CSV 库很容易实现创建和读取CSV文件.本文我们通过示例进行详细学习. maven 依赖 首先增加合适的版本依赖: < ...

  7. Apache Commons IO

    1.介绍 Apache Commons 项目旨在为开发人员提供一组可以在日常代码中使用的公共库. 本篇文章中将了解 Commons IO 模块的一些关键实用程序类及功能. 2.Maven依赖 要使用该 ...

  8. Apache Solr入门教程(初学者之旅)

    2019独角兽企业重金招聘Python工程师标准>>> 写在前面:本文涉及solr入门的各方面,请逐行阅读,相信能帮助你对solr有个清晰全面的了解并能简单实用. 在Apache S ...

  9. org.apache.commons.io——FileUtils学习笔记

    FileUtils类的应用 1.写入一个文件: 2.从文件中读取: 3.创建一个文件夹,包括文件夹: 4.复制文件和文件夹: 5.删除文件和文件夹: 6.从URL地址中获取文件: 7.通过文件过滤器和 ...

最新文章

  1. SyntaxError: Missing parentheses in call to ‘print‘. Did you mean print(i, colour[i])?
  2. 自定义View 实现软键盘实现搜索
  3. mstsc局域网远程 要预先做的设置
  4. 实现文件中名词的统计计数_Python中的统计数据展示
  5. NET4.0新功能之String.IsNullOrWhiteSpace() 方法
  6. 架构之路 参考MySpace
  7. View.Post()保证UI带你装逼带你飞
  8. 区块链 以太坊 合约 创建、执行 详解
  9. php7.4报错:Trying to access array offset on value of type null
  10. 网格搜索、随机搜索和贝叶斯调参总结与python代码实践
  11. java 中阶乘如何表示_Java阶乘实例
  12. linux嵌入式入门到精通视频教程 Linux开发工程师培训教程
  13. python做excel表格教程视频_Python玩转excel表格
  14. 字节跳动面试真题:2021新一波程序员跳槽季,系列篇
  15. 商业智能BI财务分析,如何从财务指标定位到业务问题
  16. 基于GEE的制作全球任意地方时间序列数据动画的方法
  17. 米家APP又崩了,智能家居还可靠吗?
  18. Java垃圾回收(清除内存),监控内存
  19. 教你使用免费的BMFont工具和Photoshop来制作纹理贴图和fnt文件
  20. HTML 创建按钮实现跳转链接

热门文章

  1. struts+hibernate+oracle+easyui实现lazyout组件的简单案例——EmpDao层代码
  2. 迪杰斯特拉算法(最短路径)
  3. 2015蓝桥杯省赛---java---B---1(三角形面积)
  4. 基本属性---Linux
  5. 基于持久化的wordcount程序 foreachRDD
  6. android输入时背景颜色,Button根据EditText输入状态改变背景颜色
  7. 页面复杂对象传递参数 开发中遇到的问题
  8. 系统架构师5 ***********那就给个合格分了。111
  9. Java秒杀系统实战系列~RabbitMQ死信队列处理超时未支付的订单(转)
  10. JDBC元数据操作(一)-- DatabaseMetaData接口详解