Java文件操作是指在Java程序中对文件的操作,它可以帮助我们实现对文件的读写、复制、删除等操作。本文将详细讲解Java文件操作的基本原理,并通过实例来展示如何使用Java代码来实现文件操作。
首先,我们需要了解一些基本的概念,如File、InputStream、OutputStream、Reader和Writer。File是用于表示文件或目录的对象;InputStream和OutputStream是用于读写字节流的对象;Reader和Writer是用于读写字符流的对象。
// 创建一个File对象 File file = new File("test.txt"); // 创建一个InputStream对象 InputStream in = new FileInputStream(file); // 创建一个OutputStream对象 OutputStream out = new FileOutputStream(file); // 创建一个Reader对象 Reader reader = new FileReader(file); // 创建一个Writer对象 Writer writer = new FileWriter(file);
其次,我们可以使用上述几个对象来实现不同的文件操作。例如:使用InputStream可以实现读取文件内容:
// 读取文件内容 byte[] bytes = new byte[1024]; int len; while ((len = in.read(bytes)) != -1) { System.out.println(new String(bytes, 0, len)); }
使用OutputStream可以实现将数据写入到文件中:
// 写入数据到文件 String str = "Hello World!"; out.write(str.getBytes());
此外,还可以使用Reader/Writer来读写字符流数据。例如:使用Reader来读取字符流数据:
// 读取字符流数据 char[] chars = new char[1024]; int len; while ((len = reader.read(chars)) != -1) { System.out.println(new String(chars, 0, len)); }
最后,我们还可以使用File来执行其它常用的文件操作。例如判断是否存在某个目录/文件、复制/重命名/删除目录/文
我们可以使用File类的createNewFile()方法创建一个新文件:
File dummyFile = new File("test.txt"); boolean fileCreated = dummyFile.createNewFile();
该createNewFile()方法创建一个新的空文件,如果有指定名称的文件不存在。
如果文件已成功创建,则返回true;否则,返回false。如果发生I/O错误,该方法将抛出IOException。
我们还可以在默认的临时文件目录或目录中创建一个临时文件。要在默认临时目录中创建临时文件,请使用File类的createTempFile()静态方法,该方法接受前缀和后缀以生成临时文件名。
File tempFile = File.createTempFile("abc", ".txt");
我们可以使用mkdir()或mkdirs()方法创建一个新目录。
仅当路径名中指定的父目录已存在时,mkdir()方法才创建目录。
File newDir = new File("C:usershome");
只有当C:users目录已经存在时,newDir.mkdir()方法才会创建主目录。
newDir.mkdirs()方法将创建users目录(如果它不存在于C:驱动器中),它将在C:users目录下创建主目录。
我们需要使用File类的delete()方法来删除文件/目录。
目录必须为空,我们才能删除它。
如果文件/目录被删除,该方法返回true; 否则,返回false。
我们还可以延迟删除文件,直到JVM通过使用deleteOnExit()方法终止。
如果我们在程序中创建临时文件,当程序退出时要删除,这将非常有用。
立即删除dummy.txt文件
File dummyFile = new File("dummy.txt"); dummyFile.delete();
在JVM终止时删除dummy.txt文件
File dummyFile = new File("dummy.txt"); dummyFile.deleteOnExit();
要重命名文件,我们可以使用renameTo()方法,它使用一个File对象来表示新文件:
boolean fileRenamed = oldFile.renameTo(newFile);
完整的源代码
import java.io.File; public class Main { public static void main(String[] argv) { // Rename old-dummy.txt to new_dummy.txt File oldFile = new File("old_dummy.txt"); File newFile = new File("new_dummy.txt"); boolean fileRenamed = oldFile.renameTo(newFile); if (fileRenamed) { System.out.println(oldFile + " renamed to " + newFile); } else { System.out.println("Renaming " + oldFile + " to " + newFile + " failed."); } } }
如果文件的重命名成功,renameTo()方法返回true;否则,返回false。
我们需要检查返回值,以确保重命名成功。
上面的代码生成以下结果。
File对象是不可变的。创建后,它始终表示相同的路径名。当我们重命名文件时,旧的File对象仍然代表原始的路径名。
File对象表示路径名,而不是文件系统中的实际文件。
以下代码显示了如何进行文件创建,删除和重命名。
import java.io.File; public class Main { public static void main(String[] args) throws Exception { File newFile = new File("my_new_file.txt"); printFileDetails(newFile); // Create a new file boolean fileCreated = newFile.createNewFile(); if (!fileCreated) { System.out.println(newFile + " could not be created."); } printFileDetails(newFile); // Delete the new file newFile.delete(); System.out.println("After deleting the new file:"); printFileDetails(newFile); // recreate the file newFile.createNewFile(); printFileDetails(newFile); // Let"s tell the JVM to delete this file on exit newFile.deleteOnExit(); System.out.println("After using deleteOnExit() method:"); printFileDetails(newFile); // Create a new file and rename it File firstFile = new File("my_first_file.txt"); File secondFile = new File("my_second_file.txt"); fileCreated = firstFile.createNewFile(); if (fileCreated || firstFile.exists()) { printFileDetails(firstFile); printFileDetails(secondFile); boolean renamedFlag = firstFile.renameTo(secondFile); if (!renamedFlag) { System.out.println("Could not rename " + firstFile); } printFileDetails(firstFile); printFileDetails(secondFile); } } public static void printFileDetails(File f) { System.out.println("Absolute Path: " + f.getAbsoluteFile()); System.out.println("File exists: " + f.exists()); } }
上面的代码生成以下结果。
File类包含让我们获取/设置文件和目录的属性的方法。
我们可以设置分别使用setReadOnly(),setReadable(),setWritable()和setExecutable()方法将文件设置为只读,可读,可写和可执行。
我们可以使用lastModified()和setLastModified()方法来获取和设置文件的最后修改日期和时间。
我们可以使用isHidden()方法检查文件是否被隐藏。
我们可以使用File类的length()方法获取文件的大小(以字节为单位)。
File myFile = new File("myfile.txt"); long fileLength = myFile.length();
如果File对象表示不存在的文件,则length()方法返回零。
length()方法的返回类型是long,而不是int。
我们可以使用File类的listRoots()静态方法获取文件系统中可用根目录的列表。 它返回一个File对象数组。
File[] roots = File.listRoots();
以下代码显示如何列出所有可用的根目录。
import java.io.File; public class Main { public static void main(String[] args) { File[] roots = File.listRoots(); System.out.println("List of root directories:"); for (File f : roots) { System.out.println(f.getPath()); } } }
我们可以使用File类的list()或listFiles()方法列出目录中的所有文件和目录。
list()方法返回一个String数组,而listFiles()方法返回一个File数组。
我们还可以使用这些方法的文件过滤器从返回的结果中排除一些文件和目录。
以下代码显示如何列出目录中的所有文件和目录。
import java.io.File; public class Main { public static void main(String[] args) { // Change the dirPath value to list files from your directory String dirPath = "C:"; File dir = new File(dirPath); File[] list = dir.listFiles(); for (File f : list) { if (f.isFile()) { System.out.println(f.getPath() + " (File)"); } else if (f.isDirectory()) { System.out.println(f.getPath() + " (Directory)"); } } } }
上面的代码生成以下结果。
要从列表中排除扩展名为.SYS的所有文件,我们可以使用由功能接口FileFilter的实例表示的文件过滤器来实现。
它包含一个accept()方法,它将File作为参数列出,如果应该列出文件,则返回true。返回false不会列出文件。
以下代码创建一个文件过滤器,将过滤扩展名为.SYS的文件。
FileFilter filter = file -> { if (file.isFile()) { String fileName = file.getName().toLowerCase(); if (fileName.endsWith(".sys")) { return false; } } return true; };
以下代码创建两个文件过滤器 - 一个仅过滤文件,另一个仅过滤目录:
// Filters only files FileFilter fileOnlyFilter = File::isFile; // Filters only directories FileFilter dirOnlyFilter = File::isDirectory;
以下代码显示如何使用FileFilter过滤文件。
import java.io.File; import java.io.FileFilter; public class Main { public static void main(String[] args) { String dirPath = "C:"; File dir = new File(dirPath); // Create a file filter to exclude any .SYS file FileFilter filter = file -> { if (file.isFile()) { String fileName = file.getName().toLowerCase(); if (fileName.endsWith(".sys")) { return false; } } return true; }; File[] list = dir.listFiles(filter); for (File f : list) { if (f.isFile()) { System.out.println(f.getPath() + " (File)"); } else if (f.isDirectory()) { System.out.println(f.getPath() + " (Directory)"); } } } }
上面的代码生成以下结果。
Java toUpperCase() 方法JavaCharacter类toUpperCase() 方法用于将小写字符转换为大写。语法char toUpperCase(char ch)参数ch --...
Java IO教程 -Java文件系统Java 7引入了新的输入/输出2(NIO.2)API并提供了一个新的 I/O API。它向Java类库添加了三个包:java....
Java 实例 - 测试两个字符串区域是否相等 Java 实例以下实例使用了 regionMatches() 方法测试两个字符串区域是否相等://StringR...