Java文件基本操作總結(jié)
File文件類
- java.io.File是文件和目錄的重要類(JDK6及以前是唯一)
- 目錄也使用File類進(jìn)行表示
- File類與操作系統(tǒng)無關(guān),但會(huì)受到操作系統(tǒng)的權(quán)限限制
- 常用方法createNewFile , delete , exists , getAbsolutePath , getName , getParent , getPathisDirectory , isFile , length , listFiles , mkdir , mkdirs
- File不涉及到具體的文件內(nèi)容、只會(huì)涉及屬性
public static void main(String[] args) {
// 創(chuàng)建目錄
File directory = new File("D:/temp");
boolean directoryDoesNotExists = ! directory.exists();
if (directoryDoesNotExists) {
// mkdir是創(chuàng)建單級(jí)目錄
// mkdirs是連續(xù)創(chuàng)建多級(jí)目錄
directory.mkdirs();
}
// 創(chuàng)建文件
File file = new File("D:/temp/test.txt");
boolean fileDoesNotExsits = ! file.exists();
if (fileDoesNotExsits) {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
// 遍歷directory下的所有文件消息
File[] files = directory.listFiles();
for (File file1 : files) {
System.out.println(file1.getPath());
}
}
運(yùn)行結(jié)果:
D:\temp\test.txt
Java NIO
- Java 7提出的NIO包,提出新的文件系統(tǒng)類
- Path , Files , DirectoryStream , FileVisitor , FileSystem
- 是對(duì)java.io.File的有益補(bǔ)充
- 文件復(fù)制和移動(dòng)
- 文件相對(duì)路徑
- 遞歸遍歷目錄
- 遞歸刪除目錄
Path類
public static void main(String[] args) {
// Path和java.io.File基本類似
Path path = FileSystems.getDefault().getPath("D:/temp", "abc.txt");
// D:/ 返回1 D:/temp 返回2
System.out.println(path.getNameCount());
// 用File的toPath()方法獲取Path對(duì)象
File file = new File("D:/temp/abc.txt");
Path path1 = file.toPath();
System.out.println(path.compareTo(path1)); // 結(jié)果為0 說明兩個(gè)path相等
// 獲取Path方法三
Path path3 = Paths.get("D:/temp", "abc.txt");
// 判斷文件是否可讀
System.out.println("文件是否可以讀取: " + Files.isReadable(path));
}
Files類
public static void main(String[] args) {
// 移動(dòng)文件
moveFile();
// 訪問文件屬性
fileAttributes();
// 創(chuàng)建目錄
createDirectory();
}
private static void createDirectory() {
Path path = Paths.get("D:/temp/test");
try {
// 創(chuàng)建文件夾
if (Files.notExists(path)) {
Files.createDirectory(path);
} else {
System.out.println("文件夾創(chuàng)建失敗");
}
Path path2 = path.resolve("a.java");
Path path3 = path.resolve("b.java");
Path path4 = path.resolve("c.txt");
Path path5 = path.resolve("d.jpg");
Files.createFile(path2);
Files.createFile(path3);
Files.createFile(path4);
Files.createFile(path5);
// 不帶條件的遍歷輸出
DirectoryStream<Path> listDirectory = Files.newDirectoryStream(path);
for (Path path1 : listDirectory) {
System.out.println(path1.getFileName());
}
// 創(chuàng)建一個(gè)帶有過濾器,過濾文件名以java txt結(jié)尾的文件
DirectoryStream<Path> pathsFilter = Files.newDirectoryStream(path, "*.{java,txt}");
for (Path item : pathsFilter) {
System.out.println(item.getFileName());
}
} catch (Exception e) {
e.printStackTrace();
}
}
@SuppressWarnings("all")
private static void fileAttributes() {
Path path = Paths.get("D:/temp");
// 判斷是否是目錄
System.out.println(Files.isDirectory(path, LinkOption.NOFOLLOW_LINKS));
try {
// 獲取文件的基礎(chǔ)屬性
BasicFileAttributes attributes = Files.readAttributes(path, BasicFileAttributes.class);
// 判斷是否是目錄
System.out.println(attributes.isDirectory());
// 獲取文件最后修改時(shí)間
System.out.println(new Date(attributes.lastModifiedTime().toMillis()).toLocaleString());
} catch (Exception e) {
e.printStackTrace();
}
}
private static void moveFile() {
Path from = Paths.get("D:/temp", "text.txt");
// 將文件移動(dòng)到D:/temp/test/text.txt, 如果目標(biāo)文件以存在則替換
Path to = from.getParent().resolve("test/text.txt");
try {
// 文件大小bytes
System.out.println(Files.size(from));
// 調(diào)用文件移動(dòng)方法,如果目標(biāo)文件已存在則替換
Files.move(from, to, StandardCopyOption.REPLACE_EXISTING);
} catch (Exception e) {
e.printStackTrace();
}
}
遞歸遍歷查找指定文件
public class Demo2 {
public static void main(String[] args) {
// 查找以.jpg結(jié)尾的
String ext = "*.jpg";
Path fileTree = Paths.get("D:/temp/");
Search search = new Search(ext);
EnumSet<FileVisitOption> options = EnumSet.of(FileVisitOption.FOLLOW_LINKS);
try {
Files.walkFileTree(fileTree, options, Integer.MAX_VALUE, search);
} catch (IOException e) {
e.printStackTrace();
}
}
}
class Search implements FileVisitor {
private PathMatcher matcher;
public Search(String ext) {
this.matcher = FileSystems.getDefault().getPathMatcher("glob:" + ext);
}
public void judgeFile(Path file) throws IOException {
Path name = file.getFileName();
if (name != null && matcher.matches(name)) {
// 文件名匹配
System.out.println("匹配的文件名: " + name);
}
}
// 訪問目錄前調(diào)用
@Override
public FileVisitResult preVisitDirectory(Object dir, BasicFileAttributes attrs) throws IOException {
return FileVisitResult.CONTINUE;
}
// 訪問文件時(shí)調(diào)用
@Override
public FileVisitResult visitFile(Object file, BasicFileAttributes attrs) throws IOException {
judgeFile((Path) file);
return FileVisitResult.CONTINUE;
}
// 訪問文件失敗后調(diào)用
@Override
public FileVisitResult visitFileFailed(Object file, IOException exc) throws IOException {
return FileVisitResult.CONTINUE;
}
// 訪問一個(gè)目錄后調(diào)用
@Override
public FileVisitResult postVisitDirectory(Object dir, IOException exc) throws IOException {
System.out.println("postVisit: " + (Path) dir);
return FileVisitResult.CONTINUE;
}
}
運(yùn)行結(jié)果:
匹配的文件名: d.jpg
postVisit: D:\temp\test
postVisit: D:\temp
Java的IO包
- Java讀寫文件,只能以數(shù)據(jù)流的形式進(jìn)行讀寫
- java.io包中
- 節(jié)點(diǎn)類:直接對(duì)文件進(jìn)行讀寫
- 包裝類:
- 1、轉(zhuǎn)換類:字節(jié) / 字符 / 數(shù)據(jù)類型的轉(zhuǎn)化類 。
- 2、裝飾類:裝飾節(jié)點(diǎn)類。
節(jié)點(diǎn)類
- 直接操作文件類
- InputStream,OutStream(字節(jié))
- FileInputStream , FileOutputStream
- Reader , Writer(字符)
- FileReader , FileWriter
轉(zhuǎn)換類
- 從字符到字節(jié)之間的轉(zhuǎn)化
- InputStreamReader: 文件讀取時(shí)字節(jié),轉(zhuǎn)化為Java能理解的字符
- OutputStreamWriter: Java將字符轉(zhuǎn)化為字節(jié)輸入到文件中
裝飾類
- DataInputStream , DataOutputStream :封裝數(shù)據(jù)流
- BufferedInputStream ,BufferOutputStream:緩存字節(jié)流
- BufferedReader , BufferedWriter:緩存字符流
文本文件的讀寫
寫操作
public static void main(String[] args) {
writeFile();
}
public static void writeFile(){
try (BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("D:/temp/demo3.txt")))) {
bw.write("hello world");
bw.newLine();
bw.write("Java Home");
bw.newLine();
} catch (Exception e) {
e.printStackTrace();
}
}
Demo3.txt文件內(nèi)容
hello world
Java Home
讀操作
public static void main(String[] args) {
readerFile();
}
private static void readerFile() {
String line = "";
try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("D:/temp/demo3.txt")))) {
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (Exception e) {
e.printStackTrace();
}
}
運(yùn)行結(jié)果:
hello world
Java Home
二進(jìn)制文件讀寫java
public static void main(String[] args) {
writeFile();
}
private static void writeFile() {
try (DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("D:/temp/test.dat")))) {
dos.writeUTF("hello");
dos.writeUTF("hello world is test bytes");
dos.writeInt(20);
dos.writeUTF("world");
} catch (Exception e) {
e.printStackTrace();
}
}
文件內(nèi)容
hellohello world is test bytes world
讀操作
public static void main(String[] args) {
readFile();
}
private static void readFile() {
try (DataInputStream in = new DataInputStream(new BufferedInputStream(new FileInputStream("D:/temp/test.dat")))) {
System.out.println(in.readUTF() + in.readUTF() + in.readInt() + in.readUTF());
} catch (Exception e) {
e.printStackTrace();
}
}
運(yùn)行結(jié)果:
hellohello world is test bytes20world
ZIP文件的讀寫
- zip文件操作類:java.util.zip包中
- java.io.InputStream , java.io.OutputStream的子類
- ZipInputStream , ZipOutputStream壓縮文件輸入 / 輸出流
- ZipEntry壓縮項(xiàng)
多個(gè)文件壓縮
// 多個(gè)文件壓縮
public static void main(String[] args) {
zipFile();
}
public static void zipFile() {
File file = new File("D:/temp");
File zipFile = new File("D:/temp.zip");
FileInputStream input = null;
try (ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFile))) {
// 添加注釋
zos.setComment(new String("多個(gè)個(gè)文件壓縮".getBytes(),"UTF-8"));
// 壓縮過程
int temp = 0;
// 判斷是否為文件夾
if (file.isDirectory()) {
File[] listFile = file.listFiles();
for (int i = 0; i < listFile.length; i++) {
// 定義文件的輸出流
input = new FileInputStream(listFile[i]);
// 設(shè)置Entry對(duì)象
zos.putNextEntry(new ZipEntry(file.getName() +
File.separator + listFile[i].getName() ));
System.out.println("正在壓縮: " + listFile[i].getName());
// 讀取內(nèi)容
while ((temp = input.read()) != -1) {
// 壓縮輸出
zos.write(temp);
}
// 關(guān)閉輸入流
input.close();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
注意:壓縮的文件夾不能有子目錄,否則會(huì)報(bào)FileNotFoundException: D:\temp\test (拒絕訪問。),這是由于input = new FileInputStream(listFile[i]);讀取的文件類型是文件夾導(dǎo)致的
多個(gè)文件解壓縮
// 多個(gè)文件解壓縮
public static void main(String[] args) throws Exception{
// 待解壓的zip文件,需要在zip文件上構(gòu)建輸入流,讀取數(shù)據(jù)到Java中
File file = new File("C:\\Users\\Wong\\Desktop\\test.zip");
// 輸出文件的時(shí)候要有文件夾的操作
File outFile = null;
// 實(shí)例化ZipEntry對(duì)象
ZipFile zipFile = new ZipFile(file);
// 定義解壓的文件名
OutputStream out = null;
// 定義輸入流,讀取每個(gè)Entry
InputStream input = null;
// 每一個(gè)壓縮Entry
ZipEntry entry = null;
// 定義壓縮輸入流,實(shí)例化ZipInputStream
try (ZipInputStream zipInput = new ZipInputStream(new FileInputStream(file))) {
// 遍歷壓縮包中的文件
while ((entry = zipInput.getNextEntry()) != null) {
System.out.println("解壓縮 " + entry.getName().replaceAll("/", "") + " 文件");
// 定義輸出的文件路徑
outFile = new File("D:/" + entry.getName());
boolean outputDirectoryNotExsits = !outFile.getParentFile().exists();
// 當(dāng)輸出文件夾不存在時(shí)
if (outputDirectoryNotExsits) {
// 創(chuàng)建輸出文件夾
outFile.getParentFile().mkdirs();
}
boolean outFileNotExists = !outFile.exists();
// 當(dāng)輸出文件不存在時(shí)
if (outFileNotExists) {
if (entry.isDirectory()) {
outFile.mkdirs();
} else {
outFile.createNewFile();
}
}
boolean entryNotDirctory = !entry.isDirectory();
if (entryNotDirctory) {
input = zipFile.getInputStream(entry);
out = new FileOutputStream(outFile);
int temp = 0;
while ((temp = input.read()) != -1) {
out.write(temp);
}
input.close();
out.close();
System.out.println("解壓縮成功");
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
到此這篇關(guān)于Java文件基本操作總結(jié)的文章就介紹到這了,更多相關(guān)Java文件基本操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java?Chassis3應(yīng)用視角的配置管理技術(shù)解密
這篇文章主要為大家介紹了Java?Chassis3應(yīng)用視角的配置管理相關(guān)的機(jī)制和背后故事,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
SpringBoot用JdbcTemplates操作Mysql實(shí)例代碼詳解
JdbcTemplate是Spring框架自帶的對(duì)JDBC操作的封裝,目的是提供統(tǒng)一的模板方法使對(duì)數(shù)據(jù)庫的操作更加方便、友好,效率也不錯(cuò),這篇文章主要介紹了SpringBoot用JdbcTemplates操作Mysql2022-10-10
淺談StringEntity 和 UrlEncodedFormEntity之間的區(qū)別
這篇文章主要介紹了StringEntity 和 UrlEncodedFormEntity之間的區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
SpringBoot?Profile多環(huán)境配置方式
這篇文章主要介紹了SpringBoot?Profile多環(huán)境配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06

