亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

JavaSE中IO文件操作詳細(xì)指南

 更新時(shí)間:2025年02月24日 09:10:19   作者:鴿鴿程序猿  
這篇文章主要介紹了計(jì)算機(jī)文件系統(tǒng)的基本概念、路徑操作、文件分類(lèi)以及在Java中的應(yīng)用,包括文件屬性、路徑操作方法、文件判斷、創(chuàng)建刪除操作,以及字節(jié)流和字符流的讀寫(xiě)操作,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下

一、文件

1.1 文件的概念

在操作系統(tǒng)中會(huì)將“硬盤(pán)設(shè)備”和“軟件資源”都抽象成文件。

在生活中提到的文件大多指硬盤(pán)的文件(像c盤(pán)里面的文件),就是硬盤(pán)上的數(shù)據(jù)抽象而成的。

1.2 文件的操作

在計(jì)算機(jī)上文件是由操作系統(tǒng)提供的“文件系統(tǒng)”來(lái)組織管理的,操作系統(tǒng)使用“目錄”(也就是常說(shuō)的文件夾)來(lái)管理文件的。目錄是一種樹(shù)形結(jié)構(gòu)

1.3 路徑

  • 絕對(duì)路徑:就是以C盤(pán)D盤(pán)(C: D:)這種盤(pán)符開(kāi)頭的路徑。如"E:\植物大戰(zhàn)僵尸"。
  • 相對(duì)路徑:此時(shí)需要先指定一個(gè)基準(zhǔn)目錄,然后看通過(guò)什么樣的路徑來(lái)到指定文件,這個(gè)路徑就是相對(duì)路徑,用點(diǎn)開(kāi)頭。此時(shí)用一個(gè)點(diǎn)表示當(dāng)前目錄,兩個(gè)點(diǎn)表示當(dāng)前目錄上一級(jí)目錄。

舉例:
假如我們要找“E:\植物大戰(zhàn)僵尸\pvzHE"目錄下的"fonts"文件。

  • 如果我們當(dāng)前在“E:\植物大戰(zhàn)僵尸\pvzHE"目錄下,直接使用“.\fonts”
  • 如果我們?cè)?ldquo;E:\植物大戰(zhàn)僵尸”目錄下,使用“.\pvzHE\fonts”
  • 如果我們?cè)?quot;E:\植物大戰(zhàn)僵尸\pvzHE\新建文件夾"目錄下,使用“…\fonts”

不同場(chǎng)景下的基準(zhǔn)目錄:

  • 在命令行操作,當(dāng)前目錄就是基準(zhǔn)目錄。
  • 在idea操作項(xiàng)目目錄就是基準(zhǔn)目錄(打jar包等另行考慮)。
  • 在圖形化工具上就要看實(shí)際情況了。

1.4 文件分類(lèi)

在編程角度上將文件分為兩類(lèi):

  • 文本文件:文件中保存的都是字符串,保存的都是合法的字符(合法的字符就是符合當(dāng)前字符集編碼的字符)。
  • 二進(jìn)制文件:文件中保存的僅僅是二進(jìn)制數(shù)據(jù)。

二、Java中的文件元信息、路徑操作

Java 中通過(guò) java.io.File 類(lèi)來(lái)對(duì)一個(gè)文件(包括目錄)進(jìn)行抽象的描述。

2.1 屬性

修飾符及類(lèi)型屬性說(shuō)明
static StringpathSeparator依賴(lài)于系統(tǒng)的路徑分隔符,String 類(lèi)型的表示
static charpathSeparator依賴(lài)于系統(tǒng)的路徑分隔符,char 類(lèi)型的表示

2.2 構(gòu)造方法

簽名說(shuō)明
File(File parent, String child)根據(jù)父目錄 + 孩子文件路徑,創(chuàng)建一個(gè)新的 File 實(shí)例
File(String pathname)根據(jù)文件路徑創(chuàng)建一個(gè)新的 File 實(shí)例,路徑可以是絕對(duì)路徑或者相對(duì)路徑
File(String parent, String child)根據(jù)父目錄 + 孩子文件路徑,創(chuàng)建一個(gè)新的 File 實(shí)例,父目錄用路徑表示

2.3 方法

2.3.1 文件路徑

修飾符及返回值類(lèi)型方法簽名說(shuō)明
StringgetParent()返回 File 對(duì)象的父目錄文件路徑
StringgetName()返回 FIle 對(duì)象的純文件名稱(chēng)
StringgetPath()返回 File 對(duì)象的文件路徑
StringgetAbsolutePath()返回 File 對(duì)象的絕對(duì)路徑
StringgetCanonicalPath()返回 File 對(duì)象的修飾過(guò)的絕對(duì)路徑

2.3.2 文件判斷

修飾符及返回值類(lèi)型方法簽名說(shuō)明
booleanexists()判斷 File 對(duì)象描述的文件是否真實(shí)存在
booleanisDirectory()判斷 File 對(duì)象代表的文件是否是一個(gè)目錄
booleanisFile()判斷 File 對(duì)象代表的文件是否是一個(gè)普通文件
booleancanRead()判斷用戶(hù)是否對(duì)文件有可讀權(quán)限
booleancanWrite()判斷用戶(hù)是否對(duì)文件有可寫(xiě)權(quán)限

2.3.3 文件創(chuàng)建刪除

修飾符及返回值類(lèi)型方法簽名說(shuō)明
booleancreateNewFile()根據(jù) File 對(duì)象,自動(dòng)創(chuàng)建一個(gè)空文件。成功創(chuàng)建后返回 true
booleandelete()根據(jù) File 對(duì)象,刪除該文件。成功刪除后返回 true
voiddeleteOnExit()根據(jù) File 對(duì)象,標(biāo)注文件將被刪除,刪除動(dòng)作會(huì)到JVM 運(yùn)行結(jié)束時(shí)才會(huì)進(jìn)行

2.3.4 其他操作

修飾符及返回值類(lèi)型方法簽名說(shuō)明
String[ ]list()返回 File 對(duì)象代表的目錄下的所有文件名
File[ ]listFiles()返回 File 對(duì)象代表的目錄下的所有文件,以 File 對(duì)象表示
booleanmkdir()創(chuàng)建 File 對(duì)象代表的目錄
booleanmkdirs()創(chuàng)建 File 對(duì)象代表的目錄,如果必要,會(huì)創(chuàng)建中間目錄
booleanrenameTo(Filedest)進(jìn)行文件改名,也可以視為我們平時(shí)的剪切、粘貼操作

三、文件讀寫(xiě)操作

在Java中對(duì)文件的讀寫(xiě)操作使用流對(duì)象(stream)

3.1 流(Stream)

在標(biāo)準(zhǔn)庫(kù)中提供的文件讀寫(xiě)操作的類(lèi)有很多,但可以分為兩類(lèi)。

3.1.1 字節(jié)流

字節(jié)流對(duì)應(yīng)著二進(jìn)制文件,每次讀寫(xiě)的最小單位都是字節(jié)(Byte)。

字節(jié)流提供了兩個(gè)父類(lèi)(InputStream)(OutputStream)來(lái)供繼承。

3.1.1.1 InputStream

InputStream在源碼中是一個(gè)抽象類(lèi),不能直接new對(duì)象。提供了一個(gè)子類(lèi)FileInputStream。

類(lèi)需要傳文件路徑,如果文件沒(méi)找到還會(huì)拋出FileNotFoundException異常。

方法簡(jiǎn)介

返回值方法簽名說(shuō)明
intread()讀取一個(gè)字節(jié)的數(shù)據(jù),返回 -1 代表已經(jīng)完全讀完了
intread(byte[ ] b)最多讀取 b.length 字節(jié)的數(shù)據(jù)到 b 中,返回實(shí)際讀到的數(shù)量;-1 代表以及讀完了
intread(byte[ ] b, int off, int len)最多讀取 len - off 字節(jié)的數(shù)據(jù)到 b 中,放在從 off 開(kāi)始,返回實(shí)際讀到的數(shù)量;-1 代表以及讀完了
voidclose()關(guān)閉字節(jié)流

3.1.1.2 OutputStream

默認(rèn)打開(kāi)一個(gè)文件會(huì)先清空,要繼續(xù)寫(xiě)不清空在創(chuàng)建對(duì)象時(shí)傳入true作為第二個(gè)參數(shù)。

OutputStream在源碼中是一個(gè)抽象類(lèi),不能直接new對(duì)象。提供了一個(gè)子類(lèi)FileOutputStream。

類(lèi)需要傳文件路徑,如果文件沒(méi)找到還會(huì)拋出FileNotFoundException異常。

方法

返回值方法簽名說(shuō)明
voidwrite(int b)寫(xiě)入要給字節(jié)的數(shù)據(jù)
voidwrite(byte[ ] b)將 b 這個(gè)字符數(shù)組中的數(shù)據(jù)全部寫(xiě)入 os 中
intwrite(byte[ ] b, int off, int len)將 b 這個(gè)字符數(shù)組中從 off 開(kāi)始的數(shù)據(jù)寫(xiě)入 os 中,一共寫(xiě) len 個(gè)
voidclose()關(guān)閉字節(jié)流
voidflush()重要:我們知道 I/O 的速度是很慢的,所以,大多的 OutputStream 為了減少設(shè)備操作的次數(shù),在寫(xiě)數(shù)據(jù)的時(shí)候都會(huì)將數(shù)據(jù)先暫時(shí)寫(xiě)入內(nèi)存的一個(gè)指定區(qū)域里,直到該區(qū)域滿(mǎn)了或者其他指定條件時(shí)才真正將數(shù)據(jù)寫(xiě)入設(shè)備中,這個(gè)區(qū)域一般稱(chēng)為緩沖區(qū)。但造成一個(gè)結(jié)果,就是我們寫(xiě)的數(shù)據(jù),很可能會(huì)遺留一部分在緩沖區(qū)中。需要在最后或者合適的位置,調(diào)用 flush(刷新)操作,將數(shù)據(jù)刷到設(shè)備中。

3.1.2 字符流

字符流對(duì)應(yīng)著文本文件,每次讀寫(xiě)的最小單位是字符(根據(jù)當(dāng)前字符集來(lái),一個(gè)中文字符在utf8就是3字節(jié),GBK就是兩字節(jié))。
字符流就相當(dāng)于對(duì)字節(jié)流進(jìn)行了一個(gè)封裝,自動(dòng)幫我們把字節(jié)流中相鄰幾個(gè)字節(jié)轉(zhuǎn)換成字符。

字符流提供了兩個(gè)父類(lèi)(Reader)(Writer)來(lái)供繼承。

3.1.2.1 Reader

Reader在源碼中是一個(gè)抽象類(lèi),不能直接new對(duì)象。提供了一個(gè)子類(lèi)FileReader。

FileReader類(lèi)需要傳文件路徑,如果文件沒(méi)找到還會(huì)拋出FileNotFoundException異常。

Reader中讀取字符常用是read方法,都會(huì)拋出IOException異常,介紹常用3種。

返回值分法簽名說(shuō)明
intread()讀取一個(gè)字符,讀取到返回ASCII值或者字符集編碼值,沒(méi)讀取到返回-1
intread(char[ ] cbuf)讀取多個(gè)字符,盡量將cbuf數(shù)組填滿(mǎn),返回讀取到的字符個(gè)數(shù),如果讀完文件返回-1
intread(char[ ] cbuf, int off, int len)l最多讀len-off個(gè),從數(shù)組off下標(biāo)開(kāi)始儲(chǔ)存,返回讀到的個(gè)數(shù),如果讀完文件返回-1

返回值說(shuō)明:

int作為返回值時(shí),返回的是一個(gè)2字節(jié)表示的,這時(shí)因?yàn)樵贘ava中char類(lèi)型是Unicode編碼,而String是由utf8編碼(String的編碼集可改)。

創(chuàng)建了一個(gè)Reader對(duì)象要釋放:對(duì)象名.close();主要釋放的是文件描述符表(在進(jìn)程介紹PCB的主要屬性),文件描述符表里面主要用順序表(數(shù)組)來(lái)儲(chǔ)存,如果一直不釋放,里面數(shù)組被占滿(mǎn)就會(huì)發(fā)生內(nèi)存泄露。

但是如果直接就這么寫(xiě),那如果上面代碼拋出異常,就執(zhí)行不到close,改進(jìn)方法:

  • try-finally處理:
Reader reader = new FileReader("d:/test.txt");
try {
	int n = reader.read();
} finally {
	reader.close();
  }
  • try with resource
    在定義對(duì)象時(shí)放入,出了try語(yǔ)句就會(huì)自動(dòng)調(diào)用類(lèi)實(shí)現(xiàn)的close方法(必須是實(shí)現(xiàn)了closeable接口的)。
try( Reader reader = new FileReader("d:/test.txt") ) {
    int n = reader.read();
}

3.1.2.2 Writer

默認(rèn)打開(kāi)一個(gè)文件會(huì)先清空,要繼續(xù)寫(xiě)不清空在創(chuàng)建對(duì)象時(shí)傳入true作為第二個(gè)參數(shù)。

InputStream在源碼中是一個(gè)抽象類(lèi),不能直接new對(duì)象。提供了一個(gè)子類(lèi)FileInputStream。

類(lèi)需要傳文件路徑,如果文件沒(méi)找到還會(huì)拋出IOException異常。

方法

返回值方法簽名說(shuō)明
voidwrite(int c)寫(xiě)入要給文件的數(shù)據(jù)
voidwrite(char[ ] cbuf)將 cbuf 這個(gè)字符數(shù)組中的數(shù)據(jù)全部寫(xiě)入 os 中
intwrite(byte[ ] cbuf, int off, int len)將 cbuf 這個(gè)字符數(shù)組中從 off 開(kāi)始的數(shù)據(jù)寫(xiě)入 os 中,一共寫(xiě) len 個(gè)
voidwrite(String str)將 str 這個(gè)字符串中的數(shù)據(jù)全部寫(xiě)入 os 中
voidwrite(String str, int off, int len)將 str 這個(gè)字符串中的數(shù)據(jù)從 off 開(kāi)始的數(shù)據(jù)寫(xiě)入 os 中,一共寫(xiě) len 個(gè)
voidclose()關(guān)閉字節(jié)流
voidflush()重要:我們知道 I/O 的速度是很慢的,所以,大多的 OutputStream 為了減少設(shè)備操作的次數(shù),在寫(xiě)數(shù)據(jù)的時(shí)候都會(huì)將數(shù)據(jù)先暫時(shí)寫(xiě)入內(nèi)存的一個(gè)指定區(qū)域里,直到該區(qū)域滿(mǎn)了或者其他指定條件時(shí)才真正將數(shù)據(jù)寫(xiě)入設(shè)備中,這個(gè)區(qū)域一般稱(chēng)為緩沖區(qū)。但造成一個(gè)結(jié)果,就是我們寫(xiě)的數(shù)據(jù),很可能會(huì)遺留一部分在緩沖區(qū)中。需要在最后或者合適的位置,調(diào)用 flush(刷新)操作,將數(shù)據(jù)刷到設(shè)備中。

3.2 字節(jié)流字符流轉(zhuǎn)換

使用Scanner工具類(lèi)去讀取文件中的字符。

try(InputStream inputStream = new FileInputStream("D:/test.txt")) {
            Scanner scanner = new Scanner(inputStream);
            String s = scanner.next();
        }

使用PrintWriter工具類(lèi)去寫(xiě)入文件中的字符。

try(OutputStream outputStream = new FileOutputStream("D:/test.txt",true)) {
            PrintWriter printWriter = new PrintWriter(outputStream);
            printWriter.println();
        }

四、自定義快讀類(lèi)

自定義快讀類(lèi)來(lái)解決我們做算法題的時(shí)候由于數(shù)據(jù)量過(guò)大的時(shí)候引起的超時(shí)問(wèn)題。

4.1 自定義快速讀入

我們使用Scanner去讀IO設(shè)備文件,,而我們現(xiàn)在使用BufferedReader來(lái)開(kāi)辟一個(gè)內(nèi)存緩沖區(qū),在內(nèi)存中拿數(shù)據(jù)比IO設(shè)備要快得多。

步驟:

  • 字節(jié)流轉(zhuǎn)變?yōu)樽址?,在存入?nèi)存緩沖區(qū)中。
BufferedReader bf = new BufferedReader(new InputStreamReader(system.in));
  • 字符串裁剪對(duì)象,拿到內(nèi)存緩沖區(qū)的字符串的必要對(duì)象。
StringTokenizer st = new StringTokenizer("");
  • 詳解next方法:相當(dāng)于在內(nèi)存緩沖區(qū)中拿一行數(shù)據(jù),使用while循環(huán)來(lái)處理多行輸入。
String next() throws IOException {
	while(!st.hasMoreTokens()) {
		st = new StringTokenizer(bf.readLine());
	}
	return st.nextToken();
}
  • 其他直接返回對(duì)應(yīng)的parse轉(zhuǎn)換就行。

類(lèi)代碼:

import java.util.StringTokenizer;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
class Read {
	StringTokenizer st = new StringTokenizer("");
	BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));

	String next() throws IOException {
		while(!st.hasMoreTokens()) {
			st = new StringTokenizer(bf.readLine());
		}
		return st.nextToken();
	}

	String nextLine() throws IOException {
		return bf.readLine();
	}

	int nextInt() throws IOException {
		return Integer.parseInt(next());
	}
	long nextLong() throws IOException {
		return Long.parseLong(next());
	}
	double nextDouble() throws IOException {
		return Double.parseDouble(next());
	}
	float nextFloat() throws IOException {
		return Float.parseFloat(next());
	}
}

4.2 自定義快速輸出

跟自定義一樣的優(yōu)化方式。

public static PrintWriter out = new PrintWriter(new BufferedWriter(new OutPutStreamWriter(System.out)))

使用之后就直接 out.輸出方法,輸出方法與System.out一樣。

總結(jié)

到此這篇關(guān)于JavaSE中IO文件操作的文章就介紹到這了,更多相關(guān)JavaSE IO文件操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring Boot應(yīng)用Docker化的步驟詳解

    Spring Boot應(yīng)用Docker化的步驟詳解

    這篇文章主要給大家介紹了關(guān)于Spring Boot應(yīng)用Docker化的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-04-04
  • Java中異常處理之try和catch代碼塊的使用

    Java中異常處理之try和catch代碼塊的使用

    這篇文章主要介紹了Java中異常處理之try和catch代碼塊的使用,是Java入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • 詳解Java線程池如何統(tǒng)計(jì)線程空閑時(shí)間

    詳解Java線程池如何統(tǒng)計(jì)線程空閑時(shí)間

    這篇文章主要和大家分享一個(gè)面試題:Java線程池是怎么統(tǒng)計(jì)線程空閑時(shí)間?文中的示例代碼講解詳細(xì),對(duì)我們掌握J(rèn)ava有一定幫助,需要的可以參考一下
    2022-11-11
  • 如何使用IDEA 搭建 SpringCloud 項(xiàng)目

    如何使用IDEA 搭建 SpringCloud 項(xiàng)目

    所謂微服務(wù),就是要把整個(gè)業(yè)務(wù)模塊拆分成多個(gè)各司其職的小模塊,做到單一職責(zé)原則,不會(huì)重復(fù)開(kāi)發(fā)相同的業(yè)務(wù)代碼,實(shí)現(xiàn)真正意義上的高內(nèi)聚、低耦合,這篇文章主要介紹了如何使用IDEA 搭建 SpringCloud 項(xiàng)目,需要的朋友可以參考下
    2023-11-11
  • Java的包裝類(lèi)特性總結(jié)

    Java的包裝類(lèi)特性總結(jié)

    這篇文章主要介紹Java的包裝類(lèi)的一些特性,包裝類(lèi)的作用,哪些類(lèi)屬于包裝類(lèi)等,文中有詳細(xì)的代碼示例,對(duì)我們的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-05-05
  • eclipse連接不到genymotion問(wèn)題的解決方案

    eclipse連接不到genymotion問(wèn)題的解決方案

    今天小編就為大家分享一篇關(guān)于eclipse連接不到genymotion問(wèn)題的解決方案,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03
  • MyBatis中模糊查詢(xún)使用CONCAT('%',#{str},'%')出錯(cuò)的解決

    MyBatis中模糊查詢(xún)使用CONCAT('%',#{str},'%')出錯(cuò)的解

    這篇文章主要介紹了MyBatis中模糊查詢(xún)使用CONCAT('%',#{str},'%')出錯(cuò)的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Java關(guān)于jar包的知識(shí)詳解

    Java關(guān)于jar包的知識(shí)詳解

    這篇文章主要介紹了Java關(guān)于jar包的知識(shí),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Java中volatile關(guān)鍵字的作用

    Java中volatile關(guān)鍵字的作用

    這篇文章主要介紹了Java中volatile關(guān)鍵字的作用,文章基于Java的相關(guān)資料展開(kāi)對(duì)volatile關(guān)鍵字作用的詳細(xì)介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-04-04
  • 詳解SpringBoot定制@ResponseBody注解返回的Json格式

    詳解SpringBoot定制@ResponseBody注解返回的Json格式

    這篇文章主要介紹了詳解SpringBoot定制@ResponseBody注解返回的Json格式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11

最新評(píng)論