关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » JAVA »Apache Commons IO入门教程

    Apache Commons IO入门教程

    2014-11-28 00:00:00 出处:Android Cool Posts
    分享

    Apache Commons IO是Apache基金会创建并维护的Java函数库。它提供了许多类使得开发者的常见任务变得简单,同时减少重复(boiler-plate)代码,这些代码可能遍布于每个独立的项目中,你却不得不重复的编写。这些类由经验丰富的开发者维护,对各种问题的边界条件考虑周到,并持续修复相关bug。

    在下面的例子中,我们会向你演示一些不同功能的方法,这些功能都是在org.apache.commons.io包下。Apache Commons IO 是一个巨大工程,我们不会深入去剖析它的底层原理,但是会演示一些比较常用的例子,不管你是不是新手,相信这些例子都会对你有所帮助。

    1. Apache Commons IO 示例

    我们分别会用几段代码来演示下面的功能,每部分功能都代表Apache Commons IO所覆盖的一个单独领域,具体如下:

    工具类 输入 输出 过滤器 比较器 文件监控器

    为了更方便读者进行理解,我们会把创建的每个类的输出进行单独展示。并且会把示例中功能演示所用到的到文件放到工程目录(ExampleFolder目录)中。

    注意:为了能使用org.apache.commons.io中的功能,你首先需要下载jar包(请点击这里),并且将jar包添加到Eclipse工程的编译路径下,右键点工程文件夹 -> Build Path -> Add external archives。

    ApacheCommonsExampleMain.java

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

    这个main方法会运行所有的示例,你可以将其他行的代码注释来执行你想要的示例。

    1.1 Utility Classes

    org.apache.commons.io包中有很多工具类,里面多数类都是完成文件操作以及字符串比较的功能,下面列举了一下常用的工具类: FilenameUtils: 这个工具类是用来处理文件名(译者注:包含文件路径)的,他可以轻松解决不同操作系统文件名称规范不同的问题(比如windows和Unix)(在Unix系统以及Linux系统中文件分隔符是“/”,不支持”“,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:UsersLilykosworkspaceApacheCommonsExampleExampleFolderexampleTxt.txt";
    
        private static final String PARENT_DIR =
                "C:UsersLilykosworkspaceApacheCommonsExample";
    
        public static void runExample() throws IOException {
            System.out.println("Utility Classes example...");
    
            // FilenameUtils
    
            System.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));
    
            // IOCase
    
            String 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));
    
            // FileSystemUtils
            System.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:UsersLilykosworkspaceApacheCommonsExampleExampleFolder
    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包下的类包含的方法可以获取文件的指定信息,不过更重要的是,它可以创建处理器(handler)来跟踪指定文件或目录的变化并且可以在文件或目录发生变化的时候进行一些操作。让我们来看看下面的代码:

    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:UsersLilykosworkspaceApacheCommonsExampleExampleFolderexampleFileEntry.txt";
    
        private static final String PARENT_DIR =
                "C:UsersLilykosworkspaceApacheCommonsExampleExampleFolder";
    
        private static final String NEW_DIR =
                "C:UsersLilykosworkspaceApacheCommonsExampleExampleFoldernewDir";
    
        private static final String NEW_FILE =
                "C:UsersLilykosworkspaceApacheCommonsExampleExampleFoldernewFile.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() {
    
                    @Override
                    public void onFileCreate(File file) {
                        System.out.println("File created: " + file.getName());
                    }
    
                    @Override
                    public void onFileDelete(File file) {
                        System.out.println("File deleted: " + file.getName());
                    }
    
                    @Override
                    public void onDirectoryCreate(File dir) {
                        System.out.println("Directory created: " + dir.getName());
                    }
    
                    @Override
                    public 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:UsersLilykosworkspaceApacheCommonsExampleExampleFolderexampleFileEntry.txt
    File name: exampleFileEntry.txt
    Is the file a directory : false
    Directory created: newDir
    File created: newFile.txt
    Directory deleted: newDir
    File deleted: newFile.tx

    让我们来看看这里发生了什么,我们使用org.apache.commons.io.monitor包下的类创建了一个处理器来监听一些特定的事件(在上面的例子中就是我们对文件或目录所做的所有操作事件),为了获得这些信息,我们需要做以下几步操作:

    1、创建一个File对象,这个对象指向我们需要监听变化的目录。

    2、创建一个FileAlterationObserver对象,这个对象会观察这些变化。

    3、通过调用addListener()方法,为observer对象添加一个 FileAlterationListenerAdaptor对象。你可以通过很多种方式来创建一个适配器,在我们的例子中我们使用内部类的方式进行创建并且只实现其中的一部分方法(只需要实现我们例子中需要用的方法即可)。

    4、创建一个FileAlterationMonitor 对象,将已经创建好的observer对象添加其中并且传入时间间隔参数(单位是毫秒)。

    5、调用start()方法即可开启监视器,如果你想停止监视器,调用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:UsersLilykosworkspaceApacheCommonsExampleExampleFolder";
    
        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 chars
            for (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:UsersLilykosworkspaceApacheCommonsExampleExampleFolder";
    
        private static final String FILE_1 =
                "C:UsersLilykosworkspaceApacheCommonsExampleExampleFolderexample";
    
        private static final String FILE_2 =
                "C:UsersLilykosworkspaceApacheCommonsExampleExampleFolderexampleTxt.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...");
            else
                System.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:UsersLilykosworkspaceApacheCommonsExampleExampleFoldercomparator1.txt
        C:UsersLilykosworkspaceApacheCommonsExampleExampleFoldercomperator2.txt
        C:UsersLilykosworkspaceApacheCommonsExampleExampleFolderexample
        C:UsersLilykosworkspaceApacheCommonsExampleExampleFolderexampleFileEntry.txt
        C:UsersLilykosworkspaceApacheCommonsExampleExampleFolderexampleTxt.txt
    Sorted by size files in parent directory: 
        example with size (kb): 0
        exampleTxt.txt with size (kb): 87
        exampleFileEntry.txt with size (kb): 503
        comperator2.txt with size (kb): 1458
        comparator1.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 2014
        example last modified on: Sun Oct 26 23:42:55 EET 2014
        comparator1.txt last modified on: Tue Oct 28 14:48:28 EET 2014
        comperator2.txt last modified on: Tue Oct 28 14:48:52 EET 2014
        exampleFileEntry.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 2014
        exampleTxt.txt last modified on: Sun Oct 26 14:02:22 EET 2014

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

    NameFileComparator:通过文件名来比较文件。

    SizeFileComparator:通过文件大小来比较文件。

    LastModifiedFileComparator:通过文件的最新修改时间来比较文件。

    在这里你需要注意,比较可以在定的文件夹中(文件夹下的文件已经被sort()方法排序过了),也可以在两个指定的文件之间(通过使用compare()方法)。

    1.5 输入

    在org.apache.commons.io.input包下有许多InputStrem类的实现,我们来测试一个最实用的类,TeeInputStream,将InputStream以及OutputStream作为参数传入其中,自动实现将输入流的数据读取到输出流中。而且,通过传入第三个参数,一个boolean类型参数,可以在数据读取完毕之后自动关闭输入流和输出流。

    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:UsersLilykosworkspaceApacheCommonsExampleInputOutputExampleFolderweb.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,它可以将输出流进行分流,换句话说我们可以用一个输入流将数据分别读入到两个不同的输出流。

    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 {
    
                // TeeOutputStream
    
                ByteArrayInputStream 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的入门指导,为开发者介绍了一些可以为你提供轻松解决方案的类。在这个庞大的函数库里面还有包含很多其他的功能,相信这些例子可以在你未来的项目开发中成为你非常有用工具!

    你可以在这里下载源代码。

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    Linux 退出 mail的命令是什么

    Linux 提醒 No space left on device,但我的空间看起来还有不少空余呢

    hiberfil.sys文件可以删除吗?了解该文件并手把手教你删除C盘的hiberfil.sys文件

    Window 10和 Windows 11哪个好?答案是:看你自己的需求

    盗版软件成公司里的“隐形炸弹”?老板们的“法务噩梦” 有救了!

    帝国CMS7.5编辑器上传图片取消宽高的三种方法

    帝国cms如何自动生成缩略图的实现方法

    Windows 12即将到来,将彻底改变人机交互

    帝国CMS 7.5忘记登陆账号密码怎么办?可以phpmyadmin中重置管理员密码

    帝国CMS 7.5 后台编辑器换行,修改回车键br换行为p标签

    IT头条

    智能手机市场风云:iPhone领跑销量榜,华为缺席引争议

    15:43

    大数据算法和“老师傅”经验叠加 智慧化收储粮食尽显“科技范”

    15:17

    严重缩水!NVIDIA将推中国特供RTX 5090 DD:只剩24GB显存

    00:17

    无线路由大厂 TP-Link突然大裁员:补偿N+3

    02:39

    Meta 千万美金招募AI高级人才

    00:22

    技术热点

    Spring基础知识汇总 Java开发必看

    SQL Server索引与其性能的描述

    SQL Server 2008数据格式修改时应注意什么?

    如何禁止windows 7网络搜索驱动?windows 7禁止网络搜索驱动的方

    SQL Server系统表中的sysconfigures表

    如何恢复windows 7、windows 8图片预览功能详细图解

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。