從你現(xiàn)在給的代碼來看,兩個類的代碼都沒有package頭,也就是說對于這兩個類來說都是在同一個默認(rèn)包下的,而且,你所給出的只有.java文件的路徑,沒有給.class文件的路徑,只要兩個.class文件都在classpath路徑中,就可以訪問的到
成都創(chuàng)新互聯(lián)公司堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的富縣網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
java中主要使用charset這個類來判斷文件的編碼格式,代碼如下:
package?com.ghj.packageoftool;
import?info.monitorenter.cpdetector.io.ASCIIDetector;
import?info.monitorenter.cpdetector.io.ByteOrderMarkDetector;
import?info.monitorenter.cpdetector.io.CodepageDetectorProxy;
import?info.monitorenter.cpdetector.io.JChardetFacade;
import?info.monitorenter.cpdetector.io.ParsingDetector;
import?info.monitorenter.cpdetector.io.UnicodeDetector;
import?java.io.ByteArrayInputStream;
import?java.io.File;
import?java.io.InputStream;
import?java.net.URL;
import?java.nio.charset.Charset;
/**
*?文件工具類
*?
*?@author?高煥杰
*/
public?class?FileTool?{
/**
*?獲取本地文件的編碼格式
*?
*?@param?file?要判斷的文件編碼格式
*?
*?@author?高煥杰
*/
public?static?String?getLocalFileEncode(File?localFile)?{
/*
*?cpDetector是探測器,它把探測任務(wù)交給具體的探測實現(xiàn)類的實例完成。
*?cpDetector內(nèi)置了一些常用的探測實現(xiàn)類,這些探測實現(xiàn)類的實例可以通過add方法?加進來,如ParsingDetector、ByteOrderMarkDetector、JChardetFacade、ASCIIDetector、UnicodeDetector。
*?cpDetector按照“誰最先返回非空的探測結(jié)果,就以該結(jié)果為準(zhǔn)”的原則返回探測到的字符集編碼。cpDetector是基于統(tǒng)計學(xué)原理的,不保證完全正確。
*/
CodepageDetectorProxy?codepageDetector?=?CodepageDetectorProxy.getInstance();
codepageDetector.add(new?ParsingDetector(false));//ParsingDetector可用于檢查HTML、XML等文件或字符流的編碼,構(gòu)造方法中的參數(shù)用于指示是否顯示探測過程的詳細(xì)信息,為false不顯示。
codepageDetector.add(JChardetFacade.getInstance());//JChardetFacade封裝了由Mozilla組織提供的JChardet,它可以完成大多數(shù)文件的編碼?測定。所以,一般有了這個探測器就可滿足大多數(shù)項目的要求,如果你還不放心,可以再多加幾個探測器,比如下面的ASCIIDetector、UnicodeDetector等。
codepageDetector.add(new?ByteOrderMarkDetector());??
codepageDetector.add(ASCIIDetector.getInstance());//ASCIIDetector用于ASCII編碼測定
codepageDetector.add(UnicodeDetector.getInstance());//UnicodeDetector用于Unicode家族編碼的測定
Charset?charset?=?null;
try?{
charset?=?codepageDetector.detectCodepage(localFile.toURI().toURL());
if?(charset?!=?null){
return?charset.name();
}
}?catch?(Exception?e)?{
e.printStackTrace();
}
return?null;
}
/**
*?獲得遠(yuǎn)程URL文件的編碼格式
*?
*?@param?url?遠(yuǎn)程文件的URL路徑
*?
*?@author?高煥杰
*/
public?static?String?getURLFileEncode(URL?url)?{
/*
*?cpDetector是探測器,它把探測任務(wù)交給具體的探測實現(xiàn)類的實例完成。
*?cpDetector內(nèi)置了一些常用的探測實現(xiàn)類,這些探測實現(xiàn)類的實例可以通過add方法?加進來,如ParsingDetector、ByteOrderMarkDetector、JChardetFacade、ASCIIDetector、UnicodeDetector。
*?cpDetector按照“誰最先返回非空的探測結(jié)果,就以該結(jié)果為準(zhǔn)”的原則返回探測到的字符集編碼。cpDetector是基于統(tǒng)計學(xué)原理的,不保證完全正確。
*/
CodepageDetectorProxy?codepageDetector?=?CodepageDetectorProxy.getInstance();
codepageDetector.add(new?ParsingDetector(false));//ParsingDetector可用于檢查HTML、XML等文件或字符流的編碼,構(gòu)造方法中的參數(shù)用于指示是否顯示探測過程的詳細(xì)信息,為false不顯示。
codepageDetector.add(JChardetFacade.getInstance());//JChardetFacade封裝了由Mozilla組織提供的JChardet,它可以完成大多數(shù)文件的編碼?測定。所以,一般有了這個探測器就可滿足大多數(shù)項目的要求,如果你還不放心,可以再多加幾個探測器,比如下面的ASCIIDetector、UnicodeDetector等。
codepageDetector.add(ASCIIDetector.getInstance());//ASCIIDetector用于ASCII編碼測定
codepageDetector.add(UnicodeDetector.getInstance());//UnicodeDetector用于Unicode家族編碼的測定
Charset?charset?=?null;
try?{
charset?=?codepageDetector.detectCodepage(url);
if?(charset?!=?null){
return?charset.name();
}
}?catch?(Exception?e)?{
e.printStackTrace();
}
return?null;
}
/**
*?獲得文件流的編碼格式
*?
*?@param?inputStream?文件流
*?
*?@author?高煥杰
*/
public?static?String?getInputStreamEncode(InputStream?inputStream)?{
/*
*?cpDetector是探測器,它把探測任務(wù)交給具體的探測實現(xiàn)類的實例完成。
*?cpDetector內(nèi)置了一些常用的探測實現(xiàn)類,這些探測實現(xiàn)類的實例可以通過add方法?加進來,如ParsingDetector、ByteOrderMarkDetector、JChardetFacade、ASCIIDetector、UnicodeDetector。
*?cpDetector按照“誰最先返回非空的探測結(jié)果,就以該結(jié)果為準(zhǔn)”的原則返回探測到的字符集編碼。cpDetector是基于統(tǒng)計學(xué)原理的,不保證完全正確。
*/
CodepageDetectorProxy?codepageDetector?=?CodepageDetectorProxy.getInstance();
codepageDetector.add(new?ParsingDetector(false));//ParsingDetector可用于檢查HTML、XML等文件或字符流的編碼,構(gòu)造方法中的參數(shù)用于指示是否顯示探測過程的詳細(xì)信息,為false不顯示。
codepageDetector.add(JChardetFacade.getInstance());//JChardetFacade封裝了由Mozilla組織提供的JChardet,它可以完成大多數(shù)文件的編碼?測定。所以,一般有了這個探測器就可滿足大多數(shù)項目的要求,如果你還不放心,可以再多加幾個探測器,比如下面的ASCIIDetector、UnicodeDetector等。
codepageDetector.add(ASCIIDetector.getInstance());//ASCIIDetector用于ASCII編碼測定
codepageDetector.add(UnicodeDetector.getInstance());//UnicodeDetector用于Unicode家族編碼的測定
Charset?charset?=?null;
try?{
charset?=?codepageDetector.detectCodepage(inputStream,?0);
if?(charset?!=?null){
return?charset.name();
}
}?catch?(Exception?e)?{
e.printStackTrace();
}
return?null;
}
/**
*?獲得字符串的編碼格式
*?
*?@param?stringValue?要判斷的文件編碼格式字符串
*?
*?@author?高煥杰
*/
public?static?String?getStringEncode(String?stringValue)?{
/*
*?cpDetector是探測器,它把探測任務(wù)交給具體的探測實現(xiàn)類的實例完成。
*?cpDetector內(nèi)置了一些常用的探測實現(xiàn)類,這些探測實現(xiàn)類的實例可以通過add方法?加進來,如ParsingDetector、ByteOrderMarkDetector、JChardetFacade、ASCIIDetector、UnicodeDetector。
*?cpDetector按照“誰最先返回非空的探測結(jié)果,就以該結(jié)果為準(zhǔn)”的原則返回探測到的字符集編碼。cpDetector是基于統(tǒng)計學(xué)原理的,不保證完全正確。
*/
CodepageDetectorProxy?codepageDetector?=?CodepageDetectorProxy.getInstance();
codepageDetector.add(new?ParsingDetector(false));//ParsingDetector可用于檢查HTML、XML等文件或字符流的編碼,構(gòu)造方法中的參數(shù)用于指示是否顯示探測過程的詳細(xì)信息,為false不顯示。
codepageDetector.add(JChardetFacade.getInstance());//JChardetFacade封裝了由Mozilla組織提供的JChardet,它可以完成大多數(shù)文件的編碼?測定。所以,一般有了這個探測器就可滿足大多數(shù)項目的要求,如果你還不放心,可以再多加幾個探測器,比如下面的ASCIIDetector、UnicodeDetector等。
codepageDetector.add(ASCIIDetector.getInstance());//ASCIIDetector用于ASCII編碼測定
codepageDetector.add(UnicodeDetector.getInstance());//UnicodeDetector用于Unicode家族編碼的測定
Charset?charset?=?null;
try?{
InputStream?inputStream?=?new?ByteArrayInputStream(stringValue.getBytes());
charset?=?codepageDetector.detectCodepage(inputStream,?3);
if?(charset?!=?null){
return?charset.name();
}
}?catch?(Exception?e)?{
e.printStackTrace();
}
return?null;
}
}
package com.io2.homework;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/*壓縮文件夾*/
public class MyMultipleFileZip
{
private String currentZipFilePath = "F:/MyZip.zip";
private String sourceFilePath;
private ZipOutputStream zos;
private FileInputStream fis;
public MyMultipleFileZip(String sourceFilePath)
{
try
{
this.sourceFilePath = sourceFilePath;
zos = new ZipOutputStream(new FileOutputStream(currentZipFilePath));
//設(shè)定文件壓縮級別
zos.setLevel(9);
} catch (FileNotFoundException e)
{
e.printStackTrace();
}
}
// 在當(dāng)前條目中寫入具體內(nèi)容
public void writeToEntryZip(String filePath)
{
try
{
fis = new FileInputStream(filePath);
} catch (FileNotFoundException e1)
{
e1.printStackTrace();
}
byte[] buff = new byte[1024];
int len = 0;
try
{
while ((len = fis.read(buff)) != -1)
{
zos.write(buff, 0, len);
}
} catch (IOException e)
{
e.printStackTrace();
}finally
{
if (fis != null)
try
{
fis.close();
} catch (IOException e)
{
e.printStackTrace();
}
}
}
// 添加文件條目
public void addFileEntryZip(String fileName)
{
try
{
zos.putNextEntry(new ZipEntry(fileName));
} catch (IOException e)
{
e.printStackTrace();
}
}
public void addDirectoryEntryZip(String directoryName)
{
try
{
zos.putNextEntry(new ZipEntry(directoryName + "/"));
} catch (IOException e)
{
e.printStackTrace();
}
}
// 遍歷文件夾
public void listMyDirectory(String filePath)
{
File f = new File(filePath);
File[] files = f.listFiles();
if(files!=null)
{
for (File currentFile : files)
{
// 設(shè)置條目名稱(此步驟非常關(guān)鍵)
String entryName= currentFile.getAbsolutePath().split(":")[1].substring(1);
// 獲取文件物理路徑
String absolutePath = currentFile.getAbsolutePath();
if (currentFile.isDirectory())
{
addDirectoryEntryZip(entryName);
//進行遞歸調(diào)用
listMyDirectory(absolutePath);
}
else
{
addFileEntryZip(entryName);
writeToEntryZip(absolutePath);
}
}
}
}
// 主要流程
public void mainWorkFlow()
{
listMyDirectory(this.sourceFilePath);
if(zos!=null)
try
{
zos.close();
} catch (IOException e)
{
e.printStackTrace();
}
}
public static void main(String[] args)
{
new MyMultipleFileZip("F:/fountainDirectory").mainWorkFlow();
}
}
實驗1
Java開發(fā)工具及程序設(shè)計初步
實驗?zāi)康?/p>
?
能夠搭建Java的開發(fā)環(huán)境
?
熟悉常用的JDK操作命令的使用
?
熟悉Java程序的編寫和編譯過程
?
了解常用Java開發(fā)工具的使用
實驗內(nèi)容
實驗練習(xí)1:搭建和使用JDK
1.JDK的下載和安裝
JDK是SUN公司免費在網(wǎng)上發(fā)布的,我們可以進入SUN公司的網(wǎng)站()下載并安裝。JDK安裝完成后,進行如下操作:
(1)查看并寫出JDK的安裝目錄______________________________;
(2)查看主目錄bin文件夾中常用的JDK命令文件,寫出java、javac等JDK命令所在的文件目錄_________________________________;
(3)在Windows中打開一個命令行窗口,打開命令行窗口的方法有兩種:
?選擇“開始”→“所有程序”→“附件”→“命令提示符”
?選擇“開始”→“運行…”命令,在打開的“運行”窗口中輸入“cmd”命令并“確定”。
(4)在打開的命令行窗口中,分別執(zhí)行java和javac命令,如:C:\java
查看執(zhí)行結(jié)果,看是否輸出如下的java命令的幫助信息(如圖1-1所示)。
圖1-1:java命令的幫助信息
C:\javac
查看執(zhí)行結(jié)果,看是否輸出如下的javac命令的幫助信息(如圖1-2所示)。
圖1-2:javac命令的幫助信息
如果上面的信息均能輸出,說明JDK的安裝成功,基本上可正常使用。
2.操作系統(tǒng)環(huán)境變量的使用
操作系統(tǒng)的環(huán)境變量是在操作系統(tǒng)中定義的變量,可被該操作系統(tǒng)上運行的程序訪問。JDK中主要有兩個相關(guān)的操作系統(tǒng)環(huán)境變量,即path和classpath。
(1)查看操作系統(tǒng)環(huán)境變量
?在命令行窗口中執(zhí)行set命令
如:C:\set
查看set命令的輸出結(jié)果,在set命令的輸出結(jié)果中可看到許多等式,其中等號的左邊是環(huán)境變量的名稱,等號的右邊是環(huán)境變量的取值。
命令:set
環(huán)境變量名,可查看指定的某個環(huán)境變量的設(shè)置情況。
執(zhí)行命令:C:\set
path,查看path變量的設(shè)置情況。
?在“環(huán)境變量”窗口中查看環(huán)境變量
用鼠標(biāo)右鍵單擊“我的電腦”,選擇“屬性”命令,在打開的“系統(tǒng)屬性”對話框中選擇“高級”→“環(huán)境變量”,打開“環(huán)境變量”窗口。
在“環(huán)境變量”窗口中,有用戶變量和系統(tǒng)變量兩種環(huán)境變量。其中,用戶環(huán)境變量只對某個用戶起作用;系統(tǒng)環(huán)境變量對該系統(tǒng)上的所有用戶都有效。
當(dāng)我們以某一用戶身份登錄Windows時,它所使用的變量是系統(tǒng)變量和用戶變量的總和。
如果一個變量在系統(tǒng)變量窗口和用戶變量窗口都進行了設(shè)置,那么這個變量的取值在一般情況下為系統(tǒng)變量的取值與用戶變量的取值相加;但有時也會出現(xiàn)用戶變量的取值覆蓋系統(tǒng)變量取值的情況。不管是什么情況,最終都以在命令行窗口中通過set命令查看到的結(jié)果為準(zhǔn)。
(2)設(shè)置系統(tǒng)的環(huán)境變量
?在命令窗口中執(zhí)行set命令
格式:set
變量名=[變量值]
執(zhí)行如下命令,查看執(zhí)行結(jié)果。
C:\set
Xx=aa
//新建一個環(huán)境變量并設(shè)置其取值
C:\set
Xx
//查看該環(huán)境變量
C:\set
Xx=
//取消環(huán)境變量的設(shè)置
C:\set
//查看環(huán)境變量
注意:在命令行窗口中設(shè)置的環(huán)境變量,只在該命令行窗口中起作用。
?在“環(huán)境變量”窗口中進行設(shè)置
可使用“新建”或“編輯”按鈕。
注意:①
在“環(huán)境變量”窗口中設(shè)置的環(huán)境變量對以后所有的應(yīng)用程序和命令行窗口都起作用,但不會影響原來運行的應(yīng)用程序和啟動的命令行窗口。
②
在“用戶環(huán)境變量”窗口中進行的設(shè)置需要在注銷重新登錄后才起作用。
(3)path環(huán)境變量的作用和設(shè)置
環(huán)境變量path的值指定了JDK命令搜索路徑,即當(dāng)我們要執(zhí)行某個命令時,操作系統(tǒng)首先會在當(dāng)前目錄下查找這個命令,如果當(dāng)前目錄下沒有這個命令程序,操作系統(tǒng)會沿著path環(huán)境變量中所指定的目錄依次去查找這個命令文件,并以最先找到的為準(zhǔn)。
觀察path變量的取值情況,path變量可以有多個取值,每個值代表一條搜索路徑,它們之間用“;”分隔。
在命令行窗口中執(zhí)行如下命令:
C:\set
path
//查看path環(huán)境變量
C:\set
path=
或set
path=C:\
//取消path變量的設(shè)置或重新設(shè)置path的值
C:\set
path
C:\java
或javac
//執(zhí)行java或javac命令
會出現(xiàn)如下錯誤信息(如圖1-3所示):
圖1-3:錯誤信息
分析錯誤的原因:_____________________________________________________
改正的方法:__________________________________
實驗練習(xí)2:Java程序的編寫與編譯過程
1.一個簡單的Java程序的編寫與編譯
第一步:先在磁盤上創(chuàng)建保存程序文件的目錄(文件夾),如:D:\javawork\lesson1。
第二步:在“記事本”中創(chuàng)建并編輯Java源程序文件Test1.java,程序代碼如下:
class
Test1
{
}
保存文件,擴展名為.java。
第三步:在命令行窗口中,對源文件Test1.java進行編譯。
可參考如下命令:
如果當(dāng)前盤當(dāng)前目錄為C:\,先將當(dāng)前目錄設(shè)置為D:\javawork\lesson1。
C:\d:
D:\cd
ja*w*
D:\javaworkcd
le*
D:\javawork\lesson1javac
Test1.java
如果編譯成功,則不出現(xiàn)任何提示,回到命令提示符狀態(tài)下。打開保存源文件的文件夾,查看編譯生成的字節(jié)碼文件Test1.class。
第四步:運行字節(jié)碼文件Test1.class。
D:\javawork\lesson1java
Test1
執(zhí)行結(jié)果出現(xiàn)異常,如圖1-4所示。
圖1-4:執(zhí)行出現(xiàn)異常
出現(xiàn)異常的原因是:缺少執(zhí)行應(yīng)用程序的入口main方法。main方法的聲明必須是public
static
void
main(String
args[]){}。修改源程序代碼并重新編譯,源程序代碼如下:
class
Test1
{
public
static
void
main(String
args[])
{
}
}
編譯完成后,執(zhí)行字節(jié)碼文件。
在main方法中,添加輸出的語句并重新編譯執(zhí)行,程序代碼如下:
class
Test1
{
public
static
void
main(String
args[])
{
System.out.println("Hello
World!");
}
}
輸出結(jié)果如圖1-5所示。
圖1-5:程序執(zhí)行結(jié)果
2.classpath環(huán)境變量的作用與設(shè)置
環(huán)境變量calsspath用于指定Java類的路徑,即設(shè)置classpath的作用是告訴Java運行系統(tǒng)的類加載器到哪里去尋找要執(zhí)行的類。
在前面打開的命令行窗口中繼續(xù)執(zhí)行以下命令:
D:\java
Test1
執(zhí)行結(jié)果如圖1-6所示:
圖1-6:改變當(dāng)前目錄后重新執(zhí)行的結(jié)果
會發(fā)現(xiàn)程序執(zhí)行出現(xiàn)異常:無法找到Test1類。說明在classpath變量中沒有將Test1.class文件所在的目錄設(shè)置為搜索路徑,在命令行窗口中執(zhí)行命令:
D:\set
classpath=%classpath%;d:\javawork\lesson1
重新執(zhí)行程序,則運行結(jié)果正常。
調(diào)試練習(xí)
本節(jié)中的程序Test2.java不能正確地編譯,修改所有的語法錯誤,使程序能夠成功編譯。程序編譯之后,執(zhí)行程序,比較輸出結(jié)果與示例輸出,然后排除所有可能的邏輯錯誤,示例輸出演示了代碼更正后程序的正確輸出結(jié)果。
1.示例輸出
2.錯誤的代碼
//Test2.java
import
javax.swing.JOptionPane;
public
class
test2
{
public
static
void
main(string
args[])
{
JOptionPane.showMessageDialog(null,"Hello")
}
}
System.out.prinln(Color.black);這一行少個t,println
這個代碼運行起來只會執(zhí)行default這部分,不知道你的要求是什么
public class test1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
StaticDemo st=new StaticDemo();
System.out.println("靜態(tài)變量x="+st.getX());
System.out.println("實例變量y="+st.getY());
StaticDemo a= new StaticDemo();
StaticDemo b= new StaticDemo();
a.setX(1); a.setY(2);
b.setX(3); b.setY(4);
System.out.println("靜態(tài)變量a.x="+a.getX());
System.out.println("實例變量a.y="+a.getY());
System.out.println("靜態(tài)變量b.x="+b.getX());
System.out.println("實例變量b.y="+b.getY());
}
}
class StaticDemo {
static int x;
int y;
public static int getX() { return x; }
public static void setX(int x) { StaticDemo.x = x; }
public int getY() { return y; }
public void setY(int y) { this.y = y; }
}
這才是正確的,需要注意的是:靜態(tài)變量可以用類名.方法名 而實例變量時通過對象.方法名