java底層 文件操作_JAVA的文件操作【轉】

11.3 I/O類使用

由于在IO操作中,需要使用的數據源有很多,作為一個IO技術的初學者,從讀寫文件開始學習IO技術是一個比較好的選擇。因為文件是一種常見的數據源,而且讀寫文件也是程序員進行IO編程的一個基本能力。本章IO類的使用就從讀寫文件開始。

11.3.1文件操作

文件(File)是 最常見的數據源之一,在程序中經常需要將數據存儲到文件中,例如圖片文件、聲音文件等數據文件,也經常需要根據需要從指定的文件中進行數據的讀取。當然, 在實際使用時,文件都包含一個的格式,這個格式需要程序員根據需要進行設計,讀取已有的文件時也需要熟悉對應的文件格式,才能把數據從文件中正確的讀取出 來。

文件的存儲介質有很多,例如硬盤、光盤和U盤等,由于IO類設計時,從數據源轉換為流對象的操作由API實現了,所以存儲介質的不同對于程序員來說是透明的,和實際編寫代碼無關。

11.3.1.1文件的概念

文件是計算機中一種基本的數據存儲形式,在實際存儲數據時,如果對于數據的讀寫速度要求不是很高,存儲的數據量不是很大時,使用文件作為一種持久數據存儲的方式是比較好的選擇。

存儲在文件內部的數據和內存中的數據不同,存儲在文件中的數據是一種“持久存儲”,也就是當程序退出或計算機關機以后,數據還是存在的,而內存內部的數據在程序退出或計算機關機以后,數據就丟失了。

在不同的存儲介質中,文件中的數據都是以一定的順序依次存儲起來,在實際讀取時由硬件以及操作系統完成對于數據的控制,保證程序讀取到的數據和存儲的順序保持一致。

每個文件以一個文件路徑和文件名稱進行表示,在需要訪問該文件的時,只需要知道該文件的路徑以及文件的全名即可。在不同的操作系統環境下,文件路徑的表示形式是不一樣的,例如在Windows操作系統中一般的表示形式為C:\windows\system,而Unix上的表示形式為/user/my。所以如果需要讓Java程序能夠在不同的操作系統下運行,書寫文件路徑時還需要比較注意。

11.3.1.1.1絕對路徑和相對路徑

絕對路徑是指書寫文件的完整路徑,例如d:\java\Hello.java,該路徑中包含文件的完整路徑d:\java以及文件的全名Hello.java。使用該路徑可以唯一的找到一個文件,不會產生歧義。但是使用絕對路徑在表示文件時,受到的限制很大,且不能在不同的操作系統下運行,因為不同操作系統下絕對路徑的表達形式存在不同。

相對路徑是指書寫文件的部分路徑,例如\test\Hello.java,該路徑中只包含文件的部分路徑\test和文件的全名Hello.java,部分路徑是指當前路徑下的子路徑,例如當前程序在d:\abc下運行,則該文件的完整路徑就是d:\abc\test。使用這種形式,可以更加通用的代表文件的位置,使得文件路徑產生一定的靈活性。

在Eclipse項目中運行程序時,當前路徑是項目的根目錄,例如工作空間存儲在d:\javaproject,當前項目名稱是Test,則當前路徑是:d:\javaproject\Test。在控制臺下面運行程序時,當前路徑是class文件所在的目錄,如果class文件包含包名,則以該class文件最頂層的包名作為當前路徑。

另外在Java語言的代碼內部書寫文件路徑時,需要注意大小寫,大小寫需要保持一致,路徑中的文件夾名稱區分大小寫。由于’\’是Java語言中的特殊字符,所以在代碼內部書寫文件路徑時,例如代表“c:\test\java\Hello.java”時,需要書寫成“c:\\test\\java\\Hello.java”或“c:/test/java/Hello.java”,這些都需要在代碼中注意。

11.3.1.1.2文件名稱

文件名稱一般采用“文件名.后綴名”的形式進行命名,其中“文件名”用來表示文件的作用,而使用后綴名來表示文件的類型,這是當前操作系統中常見的一種形式,例如“readme.txt”文件,其中readme代表該文件時說明文件,而txt后綴名代表文件時文本文件類型,在操作系統中,還會自動將特定格式的后綴名和對應的程序關聯,在雙擊該文件時使用特定的程序打開。

其實在文件名稱只是一個標示,和實際存儲的文件內容沒有必然的聯系,只是使用這種方式方便文件的使用。在程序中需要存儲數據時,如果自己設計了特定的文件格式,則可以自定義文件的后綴名,來標示自己的文件類型。

和文件路徑一樣,在Java代碼內部書寫文件名稱時也區分大小寫,文件名稱的大小寫必須和操作系統中的大小寫保持一致。

另外,在書寫文件名稱時不要忘記書寫文件的后綴名。

11.3.1.2 File類

為了很方便的代表文件的概念,以及存儲一些對于文件的基本操作,在java.io包中設計了一個專門的類——File類。

在File類中包含了大部分和文件操作的功能方法,該類的對象可以代表一個具體的文件或文件夾,所以以前曾有人建議將該類的類名修改成FilePath,因為該類也可以代表一個文件夾,更準確的說是可以代表一個文件路徑。

下面介紹一下File類的基本使用。

1、File對象代表文件路徑

File類的對象可以代表一個具體的文件路徑,在實際代表時,可以使用絕對路徑也可以使用相對路徑。

下面是創建的文件對象示例。

public File(String pathname)

該示例中使用一個文件路徑表示一個File類的對象,例如:

File f1 = new File(“d:\\test\\1.txt”);

File f2 = new File(“1.txt”);

File f3 = new File(“e:\\abc”);

這里的f1和f2對象分別代表一個文件,f1是絕對路徑,而f2是相對路徑,f3則代表一個文件夾,文件夾也是文件路徑的一種。

public File(String parent, String child)

也可以使用父路徑和子路徑結合,實現代表文件路徑,例如:

File f4 = new File(“d:\\test\\”,”1.txt”);

這樣代表的文件路徑是:d:\test\1.txt。

2、File類常用方法

File類中包含了很多獲得文件或文件夾屬性的方法,使用起來比較方便,下面將常見的方法介紹如下:

a、createNewFile方法

public boolean createNewFile() throws IOException

該方法的作用是創建指定的文件。該方法只能用于創建文件,不能用于創建文件夾,且文件路徑中包含的文件夾必須存在。

b、delect方法

public boolean delete()

該方法的作用是刪除當前文件或文件夾。如果刪除的是文件夾,則該文件夾必須為空。如果需要刪除一個非空的文件夾,則需要首先刪除該文件夾內部的每個文件和文件夾,然后在可以刪除,這個需要書寫一定的邏輯代碼實現。

c、exists方法

public boolean exists()

該方法的作用是判斷當前文件或文件夾是否存在。

d、getAbsolutePath方法

public String getAbsolutePath()

該方法的作用是獲得當前文件或文件夾的絕對路徑。例如c:\test\1.t則返回c:\test\1.t。

e、getName方法

public String getName()

該方法的作用是獲得當前文件或文件夾的名稱。例如c:\test\1.t,則返回1.t。

f、getParent方法

public String getParent()

該方法的作用是獲得當前路徑中的父路徑。例如c:\test\1.t則返回c:\test。

g、isDirectory方法

public boolean isDirectory()

該方法的作用是判斷當前File對象是否是目錄。

h、isFile方法

public boolean isFile()

該方法的作用是判斷當前File對象是否是文件。

i、length方法

public long length()

該方法的作用是返回文件存儲時占用的字節數。該數值獲得的是文件的實際大小,而不是文件在存儲時占用的空間數。

j、list方法

public String[] list()

該方法的作用是返回當前文件夾下所有的文件名和文件夾名稱。說明,該名稱不是絕對路徑。

k、listFiles方法

public File[] listFiles()

該方法的作用是返回當前文件夾下所有的文件對象。

l、mkdir方法

public boolean mkdir()

該方法的作用是創建當前文件文件夾,而不創建該路徑中的其它文件夾。假設d盤下只有一個test文件夾,則創建d:\test\abc文件夾則成功,如果創建d:\a\b文件夾則創建失敗,因為該路徑中d:\a文件夾不存在。如果創建成功則返回true,否則返回false。

m、mkdirs方法

public boolean mkdirs()

該方法的作用是創建文件夾,如果當前路徑中包含的父目錄不存在時,也會自動根據需要創建。

n、renameTo方法

public boolean renameTo(File dest)

該方法的作用是修改文件名。在修改文件名時不能改變文件路徑,如果該路徑下已有該文件,則會修改失敗。

o、setReadOnly方法

public boolean setReadOnly()

該方法的作用是設置當前文件或文件夾為只讀。

3、File類基本示例

以上各方法實現的測試代碼如下:

import java.io.File;

/**

* File類使用示例

*/

public class FileDemo {

public static void main(String[] args) {

//創建File對象

File f1 = new File("d:\\test");

File f2 = new File("1.txt");

File f3 = new File("e:\\file.txt");

File f4 = new File("d:\\","1.txt");

//創建文件

try{

boolean b = f3.createNewFile();

}catch(Exception e){

e.printStackTrace();

}

//判斷文件是否存在

System.out.println(f4.exists());

//獲得文件的絕對路徑

System.out.println(f3.getAbsolutePath());

//獲得文件名

System.out.println(f3.getName());

//獲得父路徑

System.out.println(f3.getParent());

//判斷是否是目錄

System.out.println(f1.isDirectory());

//判斷是否是文件

System.out.println(f3.isFile());

//獲得文件長度

System.out.println(f3.length());

//獲得當前文件夾下所有文件和文件夾名稱

String[] s = f1.list();

for(int i = 0;i < s.length;i++){

System.out.println(s[i]);

}

//獲得文件對象

File[] f5 = f1.listFiles();

for(int i = 0;i < f5.length;i++){

System.out.println(f5[i]);

}

//創建文件夾

File f6 = new File("e:\\test\\abc");

boolean b1 = f6.mkdir();

System.out.println(b1);

b1 = f6.mkdirs();

System.out.println(b1);

//修改文件名

File f7 = new File("e:\\a.txt");

boolean b2 = f3.renameTo(f7);

System.out.println(b2);

//設置文件為只讀

f7.setReadOnly();

}

}

4、File類綜合示例

下面以兩個示例演示File類的綜合使用。第一個示例是顯示某個文件夾下的所有文件和文件夾,原理是輸出當前名稱,然后判斷當前File對 象是文件還是文件夾,如果則獲得該文件夾下的所有子文件和子文件夾,并遞歸調用該方法實現。第二個示例是刪除某個文件夾下的所有文件和文件夾,原理是判斷 是否是文件,如果是文件則直接刪除,如果是文件夾,則獲得該文件夾下所有的子文件和子文件夾,然后遞歸調用該方法處理所有子文件和子文件夾,然后將空文件 夾刪除。則測試時謹慎使用第二個方法,以免刪除自己有用的數據文件。示例代碼如下:

import java.io.File;

/**

*文件綜合使用示例

*/

public class AdvanceFileDemo {

public static void main(String[] args) {

File f = new File("e:\\Book");

printAllFile(f);

File f1 = new File("e:\\test");

deleteAll(f1);

}

/**

*打印f路徑下所有的文件和文件夾

* @param f文件對象

*/

public static void printAllFile(File f){

//打印當前文件名

System.out.println(f.getName());

//是否是文件夾

if(f.isDirectory()){

//獲得該文件夾下所有子文件和子文件夾

File[] f1 = f.listFiles();

//循環處理每個對象

int len = f1.length;

for(int i = 0;i < len;i++){

//遞歸調用,處理每個文件對象

printAllFile(f1[i]);

}

}

}

/**

*刪除對象f下的所有文件和文件夾

* @param f文件路徑

*/

public static void deleteAll(File f){

//文件

if(f.isFile()){

f.delete();

}else{ //文件夾

//獲得當前文件夾下的所有子文件和子文件夾

File f1[] = f.listFiles();

//循環處理每個對象

int len = f1.length;

for(int i = 0;i < len;i++){

//遞歸調用,處理每個文件對象

deleteAll(f1[i]);

}

//刪除當前文件夾

f.delete();

}

}

}

關于File類的使用就介紹這么多,其它的方法和使用時需要注意的問題還需要多進行練習和實際使用。

11.3.1.3讀取文件

雖然前面介紹了流的概念,但是這個概念對于初學者來說,還是比較抽象的,下面以實際的讀取文件為例子,介紹流的概念,以及輸入流的基本使用。

按照前面介紹的知識,將文件中的數據讀入程序,是將程序外部的數據傳入程序中,應該使用輸入流——InputStream或Reader。而由于讀取的是特定的數據源——文件,則可以使用輸入對應的子類FileInputStream或FileReader實現。

在實際書寫代碼時,需要首先熟悉讀取文件在程序中實現的過程。在Java語言的IO編程中,讀取文件是分兩個步驟:1、將文件中的數據轉換為流,2、讀取流內部的數據。其中第一個步驟由系統完成,只需要創建對應的流對象即可,對象創建完成以后步驟1就完成了,第二個步驟使用輸入流對象中的read方法即可實現了。

使用輸入流進行編程時,代碼一般分為3個部分:1、創建流對象,2、讀取流對象內部的數據,3、關閉流對象。下面以讀取文件的代碼示例:

import java.io.*;

/**

*使用FileInputStream讀取文件

*/

public class ReadFile1 {

public static void main(String[] args) {

//聲明流對象

FileInputStream fis = null;

try{

//創建流對象

fis = new FileInputStream("e:\\a.txt");

//讀取數據,并將讀取到的數據存儲到數組中

byte[] data = new byte[1024]; //數據存儲的數組

int i = 0;?//當前下標

//讀取流中的第一個字節數據

int n = fis.read();

//依次讀取后續的數據

while(n != -1){ //未到達流的末尾

//將有效數據存儲到數組中

data[i] = (byte)n;

//下標增加

i++;

//讀取下一個字節的數據

n = fis.read();

}

//解析數據

String s = new String(data,0,i);

//輸出字符串

System.out.println(s);

}catch(Exception e){

e.printStackTrace();

}finally{

try{

//關閉流,釋放資源

fis.close();

}catch(Exception e){}

}

}

}

在該示例代碼中,首先創建一個FileInputStream類型的對象fis:

fis = new FileInputStream("e:\\a.txt");

這樣建立了一個連接到數據源e:\a.txt的流,并將該數據源中的數據轉換為流對象fis,以后程序讀取數據源中的數據,只需要從流對象fis中讀取即可。

讀取流fis中的數據,需要使用read方法,該方法是從InputStream類中繼承過來的方法,該方法的作用是每次讀取流中的一個字節,如果需要讀取流中的所有數據,需要使用循環讀取,當到達流的末尾時,read方法的返回值是-1。

在該示例中,首先讀取流中的第一個字節:

int n = fis.read();

并將讀取的值賦值給int值n,如果流fis為空,則n的值是-1,否則n中的最后一個字節包含的時流fis中的第一個字節,該字節被讀取以后,將被從流fis中刪除。

然后循環讀取流中的其它數據,如果讀取到的數據不是-1,則將已經讀取到的數據n強制轉換為byte,即取n中的有效數據——最后一個字節,并存儲到數組data中,然后調用流對象fis中的read方法繼續讀取流中的下一個字節的數據。一直這樣循環下去,直到讀取到的數據是-1,也就是讀取到流的末尾則循環結束。

這里的數組長度是1024,所以要求流中的數據長度不能超過1024,所以該示例代碼在這里具有一定的局限性。如果流的數據個數比較多,則可以將1024擴大到合適的個數即可。

經過上面的循環以后,就可以將流中的數據依次存儲到data數組中,存儲到data數組中有效數據的個數是i個,即循環次數。

其實截至到這里,IO操作中的讀取數據已經完成,然后再按照數據源中的數據格式,這里是文件的格式,解析讀取出的byte數組即可。

該示例代碼中的解析,只是將從流對象中讀取到的有效的數據,也就是data數組中的前n個數據,轉換為字符串,然后進行輸出。

在該示例代碼中,只是在catch語句中輸出異常的信息,便于代碼的調試,在實際的程序中,需要根據情況進行一定的邏輯處理,例如給出提示信息等。

最后在finally語句塊中,關閉流對象fis,釋放流對象占用的資源,關閉數據源,實現流操作的結束工作。

上面詳細介紹了讀取文件的過程,其實在實際讀取流數據時,還可以使用其它的read方法,下面的示例代碼是使用另外一個read方法實現讀取的代碼:

import java.io.FileInputStream;

/**

*使用FileInputStream讀取文件

*/

public class ReadFile2 {

public static void main(String[] args) {

//聲明流對象

FileInputStream fis = null;

try{

//創建流對象

fis = new FileInputStream("e:\\a.txt");

//讀取數據,并將讀取到的數據存儲到數組中

byte[] data = new byte[1024]; //數據存儲的數組

int i = fis.read(data);

//解析數據

String s = new String(data,0,i);

//輸出字符串

System.out.println(s);

}catch(Exception e){

e.printStackTrace();

}finally{

try{

//關閉流,釋放資源

fis.close();

}catch(Exception e){}

}

}

}

該示例代碼中,只使用一行代碼:

int i = fis.read(data);

就實現了將流對象fis中的數據讀取到字節數組data中。該行代碼的作用是將fis流中的數據讀取出來,并依次存儲到數組data中,返回值為實際讀取的有效數據的個數。

使用該中方式在進行讀取時,可以簡化讀取的代碼。

當然,在讀取文件時,也可以使用Reader類的子類FileReader進行實現,在編寫代碼時,只需要將上面示例代碼中的byte數組替換成char數組即可。

使用FileReader讀取文件時,是按照char為單位進行讀取的,所以更適合于文本文件的讀取,而對于二進制文件或自定義格式的文件來說,還是使用FileInputStream進行讀取,方便對于讀取到的數據進行解析和操作。

讀取其它數據源的操作和讀取文件類似,最大的區別在于建立流對象時選擇的類不同,而流對象一旦建立,則基本的讀取方法是一樣,如果只使用最基本的read方法進行讀取,則使用基本上是一致的。這也是IO類設計的初衷,使得對于流對象的操作保持一致,簡化IO類使用的難度。

程。

基本的輸出流包含OutputStream和Writer兩個,區別是OutputStream體系中的類(也就是OutputStream的子類)是按照字節寫入的,而Writer體系中的類(也就是Writer的子類)是按照字符寫入的。

使用輸出流進行編程的步驟是:

1、建立輸出流

建立對應的輸出流對象,也就是完成由流對象到外部數據源之間的轉換。

2、向流中寫入數據

將需要輸出的數據,調用對應的write方法寫入到流對象中。

3、關閉輸出流

在寫入完畢以后,調用流對象的close方法關閉輸出流,釋放資源。

在使用輸出流向外部輸出數據時,程序員只需要將數據寫入流對象即可,底層的API實現將流對象中的內容寫入外部數據源,這個寫入的過程對于程序員來說是透明的,不需要專門書寫代碼實現。

在向文件中輸出數據,也就是寫文件時,使用對應的文件輸出流,包括FileOutputStream和FileWriter兩個類,下面以FileOutputStream為例子說明輸出流的使用。示例代碼如下:

import java.io.*;

/**

*使用FileOutputStream寫文件示例

*/

public class WriteFile1 {

public static void main(String[] args) {

String s = "Java語言";

int n = 100;

//聲明流對象

FileOutputStream fos = null;

try{

//創建流對象

fos = new FileOutputStream("e:\\out.txt");

//轉換為byte數組

byte[] b1 = s.getBytes();

//換行符

byte[] b2 = "\r\n".getBytes();

byte[] b3 = String.valueOf(n).getBytes();

//依次寫入文件

fos.write(b1);

fos.write(b2);

fos.write(b3);

} catch (Exception e) {

e.printStackTrace();

}finally{

try{

fos.close();

}catch(Exception e){}

}

}

}

該示例代碼寫入的文件使用記事本打開以后,內容為:

Java語言

100

在該示例代碼中,演示了將一個字符串和一個int類型的值依次寫入到同一個文件中。在寫入文件時,首先創建了一個文件輸出流對象fos:

fos = new FileOutputStream("e:\\out.txt");

該對象創建以后,就實現了從流到外部數據源e:\out.txt的連接。說明:當外部文件不存在時,系統會自動創建該文件,但是如果文件路徑中包含未創建的目錄時將出現異常。這里書寫的文件路徑可以是絕對路徑也可以是相對路徑。

在 實際寫入文件時,有兩種寫入文件的方式:覆蓋和追加。其中“覆蓋”是指清除原文件的內容,寫入新的內容,默認采用該種形式寫文件,“追加”是指在已有文件 的末尾寫入內容,保留原來的文件內容,例如寫日志文件時,一般采用追加。在實際使用時可以根據需要采用適合的形式,可以使用:

public FileOutputStream(String name, boolean append) throws FileNotFoundException

只需要使用該構造方法在構造FileOutputStream對象時,將第二個參數append的值設置為true即可。

流對象創建完成以后,就可以使用OutputStream中提供的wirte方法向流中依次寫入數據了。最基本的寫入方法只支持byte數組格式的數據,所以如果需要將內容寫入文件,則需要把對應的內容首先轉換為byte數組。

這里以如下格式寫入數據:首先寫入字符串s,使用String類的getBytes方法將該字符串轉換為byte數組,然后寫入字符串“\r\n”,轉換方式同上,該字符串的作用是實現文本文件的換行顯示,最后寫入int數據n,首先將n轉換為字符串,再轉換為byte數組。這種寫入數據的順序以及轉換為byte數組的方式就是流的數據格式,也就是該文件的格式。因為這里寫的都是文本文件,所以寫入的內容以明文的形式顯示出來,也可以根據自己需要存儲的數據設定特定的文件格式。

其實,所有的數據文件,包括圖片文件、聲音文件等等,都是以一定的數據格式存儲數據的,在保存該文件時,將需要保存的數據按照該文件的數據格式依次寫入即可,而在打開該文件時,將讀取到的數據按照該文件的格式解析成對應的邏輯即可。

最后,在數據寫入到流內部以后,如果需要立即將寫入流內部的數據強制輸出到外部的數據源,則可以使用流對象的flush方法實現。如果不需要強制輸出,則只需要在寫入結束以后,關閉流對象即可。在關閉流對象時,系統首先將流中未輸出到數據源中的數據強制輸出,然后再釋放該流對象占用的內存空間。

使用FileWriter寫入文件時,步驟和創建流對象的操作都和該示例代碼一致,只是在轉換數據時,需要將寫入的數據轉換為char數組,對于字符串來說,可以使用String中的toCharArray方法實現轉換,然后按照文件格式寫入數據即可。

對于其它類型的字節輸出流/字符輸出流來說,只是在邏輯上連接不同的數據源,在創建對象的代碼上會存在一定的不同,但是一旦流對象創建完成以后,基本的寫入方法都是write方法,也需要首先將需要寫入的數據按照一定的格式轉換為對應的byte數組/char數組,然后依次寫入即可。

所以IO類的這種設計形式,只需要熟悉該體系中的某一個類的使用以后,就可以觸類旁通的學會其它相同類型的類的使用,從而簡化程序員的學習,使得使用時保持統一。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372198.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372198.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372198.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JAVA多線程,真的能提高效率嗎

舉個栗子 比如挖一個隧道&#xff0c;有2種開工方法1、只在山的一頭挖&#xff0c;直至挖到山的另一頭&#xff0c;從而打通隧道&#xff0c;這可以看成是單線程 2、在山的兩頭挖&#xff0c;同時開工&#xff0c;最后在山的中間接通&#xff0c;從而打通隧道&#xff0c;這感覺…

Java 8:測試Lambda水

Java 8大約有一年的時間了&#xff0c;它具有我非常期待的語言功能&#xff1a; Lambda Expression 。 令人遺憾的是&#xff0c;另一個重要功能Java平臺模塊已延遲到Java9。但是&#xff0c;將lambda表達式&#xff08;或閉包&#xff09;添加到該語言中將使Java編程變得更好。…

java定義js函數_JS中可以先使用函數,然后再定義.

首先要說明的,下面這種方式是對的,雖然不知道為什么,很奇怪為什么可以先使用,再定義,希望有了解的人可以給個說法.hello(www.openj.cn);function hello(name){alert("hello " name)};本文首發于 http://blog.openj.cn下面的這種定義函數方式,對于寫一些比較復雜的代碼…

基于閥值的工作流引擎設計

最近在做工作流處理流程部分的工作&#xff0c;順便研究了一下工作流引擎的一些設計理念和原理。由于以前接觸過人工智能神經網絡的一些東西&#xff0c;發現工作流引擎和神經網絡還是頗有一些相似之處&#xff0c;都是滿足一定的條件下向下一個節點傳遞。在神經網絡的神經元中…

Git之安裝管理

1.Git安裝部署 Git是分布式的版本控制系統&#xff0c;我們只要有了一個原始Git版本倉庫&#xff0c;就可以讓其他主機克隆走這個原始版本倉庫&#xff0c;從而使得一個Git版本倉庫可以被同時分布到不同的主機之上&#xff0c;并且每臺主機的版本庫都是一樣的&#xff0c;沒有主…

Java執行程序服務類型

ExecutorService功能是Java 5附帶的。它擴展了Executor接口&#xff0c;并提供了線程池功能來執行異步簡短任務。 使用Java 6提供的ExecutorService接口有五種異步執行任務的方法。 ExecutorService execService Executors.newCachedThreadPool&#xff08;&#xff09;; 這…

MySQL的主動優化和被動優化_MySQL“被動”性能優化匯總!

年少不知優化苦&#xff0c;遇坑方知優化難。 ——村口王大爺本文內容導圖如下&#xff1a;我之前有很多文章都在講性能優化的問題&#xff0c;比如下面這些&#xff1a;當然&#xff0c;本篇也是關于性能優化的&#xff0c;那性能優化就應該一把梭子嗎&#xff1f;還是要符合一…

python2

一、管理庫的安裝 安裝pip 提示報錯&#xff1a;安裝pip提示No module named setuptools Windows環境下Python默認是沒有安裝setuptools這個模塊的&#xff0c;這也是一個第三方模塊。下載地址為http://pypi.python.org/pypi/setuptools。下載后直接運行ez_setup.py 參考地址&…

Java Mybatis

Mybatis轉載于:https://www.cnblogs.com/leading-index/p/6853031.html

Java例外:java lang NoSuchMethodError

如果查看錯誤消息java.lang.NoSuchMethodError&#xff0c;您可能會理解Java虛擬機正在嘗試向我們表明您調用的方法在類或接口中不可用。 您還可能在執行沒有公共static void main&#xff08;&#xff09;方法的類時拋出此錯誤。要了解其背后的原因&#xff0c;請閱讀本文。 …

【圖】最短路徑——Floyed算法和Dijkstra算法

最短路徑問題(floyed.cpp dijkstra.cpp) 題目描述平面上有n個點(n<100)&#xff0c;每個點的坐標均在-10000&#xff5e;10000之間。其中的一些點之間有連線。若有連線&#xff0c;則表示可從一個點到達另一個點&#xff0c;即兩點間有通路&#xff0c;通路的距離為兩點間的…

java的empty_Java Stack empty()方法與示例

堆棧類empty()方法empty()方法在java.util包中可用。empty()方法用于檢查此堆棧是否為空。empty()方法是一個非靜態方法&#xff0c;只能通過類對象訪問&#xff0c;如果嘗試使用類名稱訪問該方法&#xff0c;則會收到錯誤消息。在檢查空狀態時&#xff0c;empty()方法不會引發…

Java并發– CyclicBarrier示例

Java中的CyclicBarrier是JDK 5中java.util.Concurrent包中引入的同步器&#xff0c;以及其他并發實用程序&#xff08;如Counting Semaphore &#xff0c; BlockingQueue &#xff0c; ConcurrentHashMap等&#xff09;。CyclicBarrier與CountDownLatch類似&#xff0c;我們在上…

java i o總結_Java I/O 總結

一、IO流的三種分類方式1.按流的方向分為&#xff1a;輸入流和輸出流2.按流的數據單位不同分為&#xff1a;字節流和字符流3.按流的功能不同分為&#xff1a;節點流和處理流二、IO流的四大抽象類&#xff1a;字符流&#xff1a;Reader Writer字節流&#xff1a;InputStream(讀數…

try...catch 語句

一般情況下&#xff0c;我們很少用到 try...catch 語句&#xff0c;但是有時候為了測試代碼中的錯誤&#xff0c;也有可能會用到。小白我也在工作中用到過。那么好的程序設計&#xff0c;什么時候會用到呢&#xff1f; try...catch 一般用來捕獲宿主對象或者ECMAScript拋出的異…

用Mockito回答

在編寫單元測試時 &#xff0c;必須牢記不要依賴外部組件。 為了避免這種情況&#xff0c;我們使用了模擬框架&#xff0c;對我來說&#xff0c;最容易使用的是Mockito 。 在本文中&#xff0c;我們將看到在Mockito中使用的一種“高級”技術&#xff0c;可以使用Answer接口在模…

java三板斧_Java 枚舉使用三板斧

Java 枚舉使用三板斧1 定義public enum CountryEnums {ONE(1,"韓"),TWO(2,"魏"),THREE(3,"楚"),FOUR(4,"燕"),FIVE(5,"趙"),SIX(6,"齊");private Integer retCode;private String retMsg;// 枚舉的構造方法是 pri…

假裝這些是MyEclipse的快捷鍵(1)

Java快捷鍵 Alt / 代碼自動補全Alt Shift S 功能菜單 Ctrl 1 代碼自動修正Ctrl / 單行注釋/取消Ctrl O 查看類的所有方法Ctrl T 查看類的集成架構圖Ctrl Shift / 多行注釋Ctrl Shift \ 取消多行注釋Ctrl Shift F 代碼格式化轉載于:https://www.cnblogs.com/swordt…

JasperReports JSF插件用例–簡單列表報告

這是JasperReports JSF插件系列的第一篇“用例文章” &#xff0c;我將專注于一個簡單的需求&#xff0c;并且我將進一步深入。 起點是我們已經為圖書商店完成的項目設置&#xff0c;我將向其中添加一個列表&#xff0c;其中包含在數據庫中注冊的其他圖書&#xff0c;該列表也將…

2016.10.17先占坑

2016.10.17先占坑轉載于:https://www.cnblogs.com/amurzet/p/5978986.html