導航:首頁 > 編程語言 > javasay

javasay

發布時間:2023-09-24 16:56:07

java中為什麼介面能降低耦合性最好能舉個例子

因為多態的特性,父類或者介面的引用是可以接受子類對象的。 比如:
interface Test{}
class Test1 implements Test{}
class Test2 implements Test{}
上面聲專明一個Test介面屬,兩個類Test1和Test2,分別實現Test介面。
表現耦合低的意思是說,刪除調用層與接受層無關,比如:有這樣一個方法可以這樣設置參數類型
void say(Test test){System.out.println("");}
然後調用時可以這樣傳參數
Test1 t1 = new Test1();
Test2 t2 = new Test2():
say(t1); 或 say(t2);
這就是降低耦合,say方法只需要介面類型,具體傳入哪個對象是無需關注的,因為介面是一種規則,say方法進來的參數一定是實現Test介面類的對象。即使有一天將Test1與Test2兩個類刪除,Test介面還在,那麼say方法就有用,並且隨意擴展一個新的類來實現Test介面,這叫做向後兼容。

㈡ 讓Java說話-用Java實現語音引擎

為應用程序加上語音能力有什麼好處呢?粗略地講 是為了趣味 它適合所有注重趣味的應用 比如游擾則戲 當然 從更嚴肅的角度來講 它還涉及到應用的可用性問題 注意 這里我考慮的不僅是可視化界面固有的不足 而且還有這樣一些情形 一些時候 讓雙眼離開當前的工作很不方便 甚至是不合法的 比如 假設有一個帶語音功能的瀏覽器 你就可以在外出散步或開車上班的同時 用聽的方式瀏覽自己喜愛的網站 從目前來看 郵件閱讀器或許是語音技術更實際的應用 在JavaMail API的幫助下 這一切已經可能 郵件閱讀器可以定期地檢查收件箱 然後用語音 You have new mail would you like me to read it to you? 引起你的注意 按照類似的思路 我們還可以考慮一個帶語音功能的提醒器 把它連接到一個日歷應用 它會及時地提醒你 Don t fet your meeting with the boss in minutes! 也許你已經被這些主意吸引 或者有了自己更好的主意 現在讓我們繼續 首先我將介紹如何啟用本文提供的語音引擎 這樣 如果你認為語音引擎的實現細節過於復雜 就可以直接使用它而忽略其實現細節 一 試用語音引擎 要使用這個語音引擎 你必須在CLASSPATH中加入本文提供的javatalk jar文件 然後從命令行運行(或者從Java程序調用) lotontech speech Talker類 如果從命令行運行 則命令為 java lotontech speech Talker h|e|l|oo 如果從Java程序調用 則代碼為 lotontech speech Talker talker=new lotontech speech Talker(); talker sayPhoneword( h|e|l|oo ); 現在 對於在命令行上(或者調用sayPhoneWord()方法時)提供的 h|e|l|oo 字元串 你或許有所不解 下面我就來解釋一下 語音引擎的工作原理是把細小的聲音樣本連接起來 每一個樣本都是人的語言發音(英語)的一個最小單位 這些聲音樣本稱為音素(allophone) 每一個因素對應一個 二個或者三個字母 從前面 hello 的語音表示可以看出 一些字母組合的發音顯而易見 還有一些卻不是很明顯 h 讀音顯而易見 e 讀音顯而易見 l 讀音顯而易見 但注意兩個 l 被簡縮成了一個 l OO 應該讀作 hello 中的讀音 不應讀作 bot too 中的讀音 下面是一個有效音素的清單 a 如cat b 如cab c 如cat d 如dot e 如bet f 如frog g 如frog 緩埋棚h 如hog i 如pig j 如jig k 如keg l 如leg m 如met n 如begin o 如not p 如pot r 如rot s 如sat t 如sat u 如put v 如have w 如wet y 如yet z 如zoo aa 如fake ay 如hay ee 如bee ii 如high oo 如go bb b的變化形式 重音液穗不同 dd d的變化形式 重音不同 ggg g的變化形式 重音不同 hh h的變化形式 重音不同 ll l的變化形式 重音不同 nn n的變化形式 重音不同 rr r的變化形式 重音不同 tt t的變化形式 重音不同 yy y的變化形式 重音不同 ar 如car aer 如care ch 如which ck 如check ear 如beer er 如later err 如later (長音) ng 如feeding or 如law ou 如zoo ouu 如zoo (長音) ow 如cow oy 如boy sh 如shut th 如thing dth 如this uh u 的變化形式 wh 如where zh 如Asian 人說話的時候 語音在整個句子之內起落變化 語調變化使得語音更自然 更富有感染力 使得問句和陳述句能夠相互區別 請考慮下面兩個句子 It is fake f|aa|k Is it fake? f|AA|k 也許你已經猜想到 提高語調的方法是使用大寫字母 以上就是使用該軟體時你需要了解的東西 如果你對其後台實現細節感興趣 請繼續閱讀 二 實現語音引擎 語音引擎的實現只包括一個類 四個方法 它利用了J SE 包含的Java Sound API 在這里 我不準備全面地介紹這個API 但你可以通過實例學習它的用法 Java Sound API並不是一個特別復雜的API 代碼中的注釋將告訴你必須了解的知識 下面是Talker類的基本定義 package lotontech speech; import javax sound sampled *; import java io *; import java util *; import *; public class Talker { private SourceDataLine line=null; } 如果從命令行執行Talker 下面的main()方法將作為入口點運行 main()方法獲取第一個命令行參數 然後把它傳遞給sayPhoneWord()方法 /* * 讀出在命令行中指定的表示讀音的字元串 */ public static void main(String args[]) { Talker player=new Talker(); if (args length> ) player sayPhoneWord(args[ ]); System exit( ); } sayPhoneWord()方法既可以通過上面的main()方法調用 也可以在Java程序中直接調用 從表面上看 sayPhoneWord()方法比較復雜 其實並非如此 實際上 它簡單地遍歷所有單詞的語音元素(在輸入字元串中語音元素以 | 分隔) 通過一個聲音輸出通道一個元素一個元素地播放出來 為了讓聲音更自然一些 我把每一個聲音樣本的結尾和下一個聲音樣本的開頭合並了起來 /* * 讀出指定的語音字元串 */ public void sayPhoneWord(String word) { // 為上一個聲音構造的模擬byte數組 byte[] previousSound=null; // 把輸入字元串分割成單獨的音素 StringTokenizer st=new StringTokenizer(word | false); while (st hasMoreTokens()) { // 為音素構造相應的文件名字 String thisPhoneFile=st nextToken(); thisPhoneFile= /allophones/ +thisPhoneFile+ au ; // 從聲音文件讀取數據 byte[] thisSound=getSound(thisPhoneFile); if (previousSound!=null) { // 如果可能的話 把前一個音素和當前音素合並 int mergeCount= ; if (previousSound length>= && thisSound length>= ) mergeCount= ; for (int i= ; i{ previousSound[previousSound length mergeCount+i] =(byte)((previousSound[previousSound length mergeCount+i]+thisSound[i])/ ); } // 播放前一個音素 playSound(previousSound); // 把經過截短的當前音素作為前一個音素 byte[] newSound=new byte[thisSound length mergeCount]; for (int ii= ; iinewSound[ii]=thisSound[ii+mergeCount]; previousSound=newSound; } else previousSound=thisSound; } // 播放最後一個音素 清理聲音通道 playSound(previousSound); drain(); } 在sayPhoneWord()的後面 你可以看到它調用playSound()輸出單個聲音樣本(即一個音素) 然後調用drain()清理聲音通道 下面是playSound()的代碼 /* * 該方法播放一個聲音樣本 */ private void playSound(byte[] data) { if (data length> ) line write(data data length); } 下面是drain()的代碼 /* * 該方法清理聲音通道 */ <b lishixin/Article/program/Java/JSP/201311/19532

㈢ 通過java如何操作xml向其節點中添加內容比如<say>想添加的內容</say>

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.*;
import javax.xml.xpath.*;
public class Test {
public static void main(String[] args) {
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
Element theBook=null, theElem=null, root=null;
try {
factory.(true);

DocumentBuilder db=factory.newDocumentBuilder();
Document xmldoc=db.parse(new File("Test1.xml"));
root=xmldoc.getDocumentElement();

theBook=(Element) selectSingleNode("/books/book[name='哈里波特']", root);
System.out.println("--- 查詢找《哈里波特》 ----");
Element nameNode=(Element)theBook.getElementsByTagName("price").item(0);
String name=nameNode.getFirstChild().getNodeValue();
System.out.println(name);
output(theBook);
System.out.println("=============selectSingleNode(books/book[name='哈里波特'], root)==================");

//--- 新建一本書開始 ----
theBook=xmldoc.createElement("book");
theElem=xmldoc.createElement("name");
theElem.setTextContent("新書");
theBook.appendChild(theElem);

theElem=xmldoc.createElement("price");
theElem.setTextContent("20");
theBook.appendChild(theElem);
theElem=xmldoc.createElement("memo");
theElem.setTextContent("新書的更好看。");
theBook.appendChild(theElem);
root.appendChild(theBook);
System.out.println("--- 新建一本書開始 ----");
output(xmldoc);
System.out.println("==============================");

//--- 新建一本書完成 ----
//--- 下面對《哈里波特》做一些修改。 ----
//--- 查詢找《哈里波特》----

//--- 此時修改這本書的價格 -----
theBook.getElementsByTagName("price").item(0).setTextContent("15");//getElementsByTagName返回的是NodeList,所以要跟上item(0)。另外,getElementsByTagName("price")相當於xpath的".//price"。
System.out.println("--- 此時修改這本書的價格 ----");
output(theBook);
//--- 另外還想加一個屬性id,值為B01 ----
theBook.setAttribute("id", "B01");
System.out.println("--- 另外還想加一個屬性id,值為B01 ----");
output(theBook);
//--- 對《哈里波特》修改完成。 ----
//--- 要用id屬性刪除《三國演義》這本書 ----
theBook=(Element) selectSingleNode("/books/book[@id='B02']", root);
System.out.println("--- 要用id屬性刪除《三國演義》這本書 ----");
output(theBook);
theBook.getParentNode().removeChild(theBook);
System.out.println("--- 刪除後的XML ----");
output(xmldoc);
//--- 再將所有價格低於10的書刪除 ----
NodeList someBooks=selectNodes("/books/book[price<10]", root);
System.out.println("--- 再將所有價格低於10的書刪除 ---");
System.out.println("--- 符合條件的書有"+someBooks.getLength()+"本。 ---");
for(int i=0;i<someBooks.getLength();i++) {
someBooks.item(i).getParentNode().removeChild(someBooks.item(i));
}
output(xmldoc);
saveXml("Test1_Edited.xml", xmldoc);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void output(Node node) {//將node的XML字元串輸出到控制台
TransformerFactory transFactory=TransformerFactory.newInstance();
try {
Transformer transformer = transFactory.newTransformer();
transformer.setOutputProperty("encoding", "gb2312");
transformer.setOutputProperty("indent", "yes");
DOMSource source=new DOMSource();
source.setNode(node);
StreamResult result=new StreamResult();
result.setOutputStream(System.out);

transformer.transform(source, result);
} catch ( e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
}
}

public static Node selectSingleNode(String express, Object source) {//查找節點,並返回第一個符合條件節點
Node result=null;
XPathFactory xpathFactory=XPathFactory.newInstance();
XPath xpath=xpathFactory.newXPath();
try {
result=(Node) xpath.evaluate(express, source, XPathConstants.NODE);
} catch (XPathExpressionException e) {
e.printStackTrace();
}

return result;
}

public static NodeList selectNodes(String express, Object source) {//查找節點,返回符合條件的節點集。
NodeList result=null;
XPathFactory xpathFactory=XPathFactory.newInstance();
XPath xpath=xpathFactory.newXPath();
try {
result=(NodeList) xpath.evaluate(express, source, XPathConstants.NODESET);
} catch (XPathExpressionException e) {
e.printStackTrace();
}

return result;
}

public static void saveXml(String fileName, Document doc) {//將Document輸出到文件
TransformerFactory transFactory=TransformerFactory.newInstance();
try {
Transformer transformer = transFactory.newTransformer();
transformer.setOutputProperty("indent", "yes");
DOMSource source=new DOMSource();
source.setNode(doc);
StreamResult result=new StreamResult();
result.setOutputStream(new FileOutputStream(fileName));

transformer.transform(source, result);
} catch ( e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}

XML:
<?xml version="1.0" encoding="GBK"?>
<books>
<book>
<name>哈里波特</name>
<price>10</price>
<memo>這是一本很好看的書。</memo>
</book>
<book id="B02">
<name>三國演義</name>
<price>10</price>
<memo>四大名著之一。</memo>
</book>
<book id="B03">
<name>水滸</name>
<price>6</price>
<memo>四大名著之一。</memo>
</book>
<book id="B04">
<name>紅樓</name>
<price>5</price>
<memo>四大名著之一。</memo>
</book>
</books>

閱讀全文

與javasay相關的資料

熱點內容
自學編程新手看什麼書 瀏覽:180
linux全盤tar 瀏覽:454
ps文件命名自動輸入怎麼辦 瀏覽:467
iphone6plus切圖 瀏覽:822
iphone6沒有提示更新 瀏覽:41
cc網路圖教程 瀏覽:650
u盤無法剪切文件到電腦里 瀏覽:497
中海達靜態數據大概多少內存 瀏覽:599
蘋果6s手機文件管理器 瀏覽:107
qq頭像非主流女生捂臉 瀏覽:736
java判斷string編碼 瀏覽:941
excel工資簿如何匹配相同數據 瀏覽:159
視頻課程學習有哪些app 瀏覽:375
鐵模編程怎麼學 瀏覽:298
數學網路研修研究問題有哪些 瀏覽:677
stl文件怎麼列印 瀏覽:427
json格式變數寫法 瀏覽:68
廣州寄文件去吉林多少錢 瀏覽:254
蘋果APP文件夾創建 瀏覽:903
黃米是什麼app 瀏覽:417

友情鏈接