版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
2025/3/10零基礎(chǔ)快樂(lè)學(xué)Java目錄1音樂(lè)播放器窗體可視化插件2輸入輸出流3個(gè)性化聊天工具4字符串與字符流5聊天項(xiàng)目的延伸與拓展6/windowbuilder/download.php進(jìn)入WindowBuilder的下載頁(yè)面,選擇與Eclipse版本相對(duì)應(yīng)的link,單擊右鍵復(fù)制鏈接。1.1下載與安裝1窗體可視化插件打開Eclipse主界面,選擇“Help”菜單下的“InstallNewSoftware”。單擊打開相應(yīng)對(duì)話框,將所復(fù)制的網(wǎng)址粘貼到Workwith后的文本框中1.1下載與安裝1窗體可視化插件安裝完成后需要重新啟動(dòng)Eclipse。重啟之后,依次打開“File”-“New”-“Other”,單擊WindowBuilder導(dǎo)航框,選擇“SwingDesigner”即可打開窗體設(shè)計(jì)器。1窗體可視化插件目錄2窗體可視化插件音樂(lè)播放器1輸入輸出流3個(gè)性化聊天工具4字符串與字符流5聊天項(xiàng)目的延伸與拓展62音樂(lè)播放器項(xiàng)目目標(biāo):完成一個(gè)界面友好的小型音樂(lè)播放器。設(shè)計(jì)思路:(1)完成界面設(shè)計(jì)。運(yùn)用WindowBuilder設(shè)計(jì)完成如右圖所示的音樂(lè)播放器界面(注:界面可根據(jù)個(gè)人喜好自行設(shè)計(jì),不一定要與右圖一致)。(2)完成界面組件必要的事件處理。(3)完成音樂(lè)播放功能。(4)完成圖像切換功能。2音樂(lè)播放器if(e.getClickCount()==2){//雙擊左鍵時(shí)filename=list.getSelectedItem();//播放選中的文件btnNewButton_1.setIcon(stop);//更換播放按鈕圖標(biāo)
threadControl();//窗體組件與音頻播放線程的控制}publicvoidthreadControl(){t=newThread(frame);//窗體線程,切換按鈕圖標(biāo)、滑動(dòng)滑桿
t.start();//線程啟動(dòng)mt=newMusicThread();//音樂(lè)播放線程mt.start();//線程啟動(dòng)}事件處理——雙擊進(jìn)行播放采用兩個(gè)線程控制使得圖標(biāo)的切換、滑桿的滑動(dòng)與音頻的播放可以“同時(shí)”進(jìn)行。2音樂(lè)播放器音頻播放獲取格式化的音頻數(shù)據(jù)讀取數(shù)據(jù)發(fā)送到混音器音頻數(shù)據(jù)寫入源數(shù)據(jù)行關(guān)閉AudioSystem.getAudioInputStream(newFile(Strings));format=in.getFormat();source.write(b,0,count);//數(shù)據(jù)寫入AudioSystem.getSourceDataLine(format);source.drain();//清空數(shù)據(jù)緩沖source.close();//關(guān)閉輸入圖像切換2音樂(lè)播放器創(chuàng)建標(biāo)簽對(duì)象并設(shè)置標(biāo)簽上的圖標(biāo)在控制滑桿線程的run()方法中重新設(shè)置標(biāo)簽圖標(biāo)JLabellblNewLabel=newJLabel();//創(chuàng)建標(biāo)簽對(duì)象lblNewLabel.setIcon(newImageIcon("G:\\bg.jpeg"));//設(shè)置標(biāo)簽上的圖標(biāo)lblNewLabel.setIcon(newImageIcon("G:\\birthday.gif"));//切換標(biāo)簽圖案目錄3窗體可視化插件輸入輸出流1音樂(lè)播放器2個(gè)性化聊天工具4字符串與字符流5聊天項(xiàng)目的延伸與拓展63.1流1、生活中的流是什么?它有方向嗎?有什么特點(diǎn)?程序運(yùn)行在內(nèi)存和CPU的資源里,除了鍵盤輸入和顯示器輸出外,內(nèi)存之外的設(shè)備還有打印機(jī)、硬盤、網(wǎng)絡(luò)等等,程序通過(guò)什么跟它們打交道呢?另外,在打交道的過(guò)程中有數(shù)字、音頻、圖像、文字等等各種各樣信息的交互,又如何保證能正確傳輸呢?3.1流流的特性:有起點(diǎn)終點(diǎn)、有單向雙向、一去不復(fù)返。從中可以學(xué)到:
把握當(dāng)下:子在川上曰:逝者如斯夫,不舍晝夜。2、程序設(shè)計(jì)中的流是什么?它的作用是什么呢?3.1流IO系統(tǒng)3.2輸入和輸出Java中I/O操作主要是指使用Java進(jìn)行輸入、輸出操作。
Java所有的I/O機(jī)制都是基于數(shù)據(jù)流進(jìn)行輸入輸出。
數(shù)據(jù)流是有順序的,有起點(diǎn)和終點(diǎn)的。流的本質(zhì)是數(shù)據(jù)傳輸,Java將流抽象為各種類。
采用數(shù)據(jù)流的目的就是使得輸出輸入獨(dú)立于設(shè)備。InputStream不關(guān)心數(shù)據(jù)源來(lái)自何種設(shè)備(鍵盤,文件,網(wǎng)絡(luò)),OutputStream不關(guān)心數(shù)據(jù)流向何種設(shè)備(顯示器,打印機(jī),文件,網(wǎng)絡(luò))數(shù)據(jù)流輸出流輸入流內(nèi)存操作需要四個(gè)步驟:
第一步:定位。
第二步:建立管道。
第三步:操作管道。第四步:關(guān)閉。數(shù)據(jù)流的輸入輸出是相對(duì)于內(nèi)存而言的。離開內(nèi)存是有風(fēng)險(xiǎn)的,需要異常保護(hù),PrintStream除外。3.2輸入和輸出3.3標(biāo)準(zhǔn)輸入輸出流1)標(biāo)準(zhǔn)輸出流
System.out
System.out向標(biāo)準(zhǔn)輸出設(shè)備輸出數(shù)據(jù),其數(shù)據(jù)類型為PrintStream。方法:
Voidprint(參數(shù))
Voidprintln(參數(shù))2)標(biāo)準(zhǔn)輸入流
System.in
System.in讀取標(biāo)準(zhǔn)輸入設(shè)備數(shù)據(jù)(從標(biāo)準(zhǔn)輸入獲取數(shù)據(jù),一般是鍵盤),其數(shù)據(jù)類型為InputStream。方法:
intread()
//返回ASCII碼。若返回值=-1,說(shuō)明沒有讀取到任何字節(jié),讀取工作結(jié)束。
intread(byte[]b)//讀入多個(gè)字節(jié)到緩沖區(qū)b中返回值是讀入的字節(jié)數(shù)3)標(biāo)準(zhǔn)輸出錯(cuò)誤流System.err
與系統(tǒng)輸出流的區(qū)別是,系統(tǒng)輸出流輸出的是程序正確運(yùn)行時(shí)的信息,而系統(tǒng)錯(cuò)誤流輸出的是程序出錯(cuò)時(shí)的信息,即異常信息。3.4字節(jié)流
FileInputStream:字節(jié)流??梢允褂胷ead()方法一次讀入一個(gè)字節(jié),并以int類型返回,或者是使用read()方法時(shí)讀入至少一個(gè)byte數(shù)組,byte數(shù)組的元素有多少個(gè),就讀入多少個(gè)字節(jié)。
作用:以文件作為數(shù)據(jù)輸入源的數(shù)據(jù)流?;蛘哒f(shuō)是打開文件,從文件讀數(shù)據(jù)到內(nèi)存的類。FileInputStream類
FileOutputStream類用來(lái)處理以文件作為數(shù)據(jù)輸出目的數(shù)據(jù)流。
創(chuàng)建一個(gè)文件流對(duì)象有三種方法:
方式1:
File
f=new
File(“d:/myjava/write.txt”);
FileOutputStream
out=newFileOutputStream(f);
方式2:
FileOutputStreamout=newFileOutputStream(“d:/myjava/write.txt”);
方式3:構(gòu)造函數(shù)將文件名作為其第一參數(shù),將布爾值作為第二參數(shù)。
FileOutputStreamf=newFileOutputStream(“d:/abc.txt”,true);
注意:(1)文件中寫數(shù)據(jù)時(shí),若文件已經(jīng)存在,則覆蓋存在的文件;(2)當(dāng)讀/寫操作結(jié)束時(shí),應(yīng)調(diào)用close方法關(guān)閉流。
3.4字節(jié)流FileOutputStream類importjava.io.*; try{
//第一步:定位。表明需要操作哪個(gè)文件
Filef=newFile(“D:/test.txt");
//第二步:建立管道。FileOutputStreamfon=newFileOutputStream(f);
FileInputStreamfis=newFileInputStream(f);
//第三步:操作管道。fon.write(intdata); System.out.print((char)fis.read());
//第四步:關(guān)閉。fon.close();fis.close(); }catch(Exceptione){}內(nèi)存輸入(出)的四個(gè)步驟:3.4字節(jié)流讀一個(gè)字符讀整個(gè)文件寫文件復(fù)制文件文件的加密與解密FileInputStreamFileInputStreamFileOutputStream3.4字節(jié)流——示例//讀取一個(gè)字符importjava.io.*;public
classReadOne{public
static
voidmain(Stringargs[]){try{//定位
File
f=newFile(“D:/test.txt”);
FileInputStreamfin=newFileInputStream(f);//建立管道//操作管道fin.read()返回值為intSystem.out.println((char)fin.read());fin.close();//關(guān)閉管道}catch(Exceptione){}}}如何讀取所有字符3.4字節(jié)流——讀取一個(gè)字符//讀取所有字符for(int
i=0;i<fin.available();)
System.out.print((char)fin.read());注:fin.available()返回剩余未被處理的內(nèi)容長(zhǎng)度。同理下面效果也一樣:
int
len=fin.available();for(int
i=0;i<len;i++)
System.out.print((char)fin.read());以上兩種方法的區(qū)別:
第二種更好。
理由:fin.available()的運(yùn)行速度慢于i++;盡管浪費(fèi)了內(nèi)存,但節(jié)約了CPU。3.4字節(jié)流——讀取所有字符importjava.io.*;public
classCopyFile{public
static
voidmain(Stringargs[]){try{//建立兩個(gè)文件Fileread=newFile("D:/test.txt");Filewrite=newFile("D:/test1.txt");//建立兩條管道,分別指向源文件和被復(fù)制文件FileInputStreamfin=newFileInputStream(read);FileOutputStreamfon=newFileOutputStream(write);//復(fù)制文件int
len=fin.available();for(int
i=0;i<len;i++)
fon.write(fin.read());//s.getBytes();//關(guān)閉管道fin.close();fon.close();}catch(Exceptione){}}}利用字節(jié)流將test文件的內(nèi)容復(fù)制到test1文件中。3.4字節(jié)流——復(fù)制文件復(fù)制大文件read(byte[]b){}文件加密與解密output.write(input.read()+10);//加密方式intpassword=(int)(Math.random()*128);//加密方式為隨機(jī)數(shù)
passwordOutput.write(password);output.write(input.read()+password);3.4字節(jié)流復(fù)制大文件:Java\\jdk1.6.0_10\\src.zipbyte[]b=new
byte[8192];int
len=fin.available();for(int
i=0;i<len/8192+1;i++){//注意加1
fin.read(b);
fon.write(b);}注:len/8192+1會(huì)造成內(nèi)存浪費(fèi),復(fù)制jar文件時(shí)還可能出錯(cuò)修正方式:for(int
i=0;i<len/8192;i++){//注意不加1
fin.read(b);
fon.write(b);}int
size=fin.read(b);//獲得有效內(nèi)容的長(zhǎng)度f(wàn)on.write(b,0,size);//注意參數(shù)寫法3.4字節(jié)流——示例//復(fù)制大文件,比如zip,jar,圖片、音樂(lè)文件等importjava.io.*;public
classCopyBlock{public
static
voidmain(Stringargs[]){try{//建立兩個(gè)文件Fileread=newFile("C:\\Users\\Public\\Music\\SampleMusic\\Kalimba.mp3");Filewrite=newFile("D:/test.mp3");//建立兩條管道,分別指向源文件和被復(fù)制文件FileInputStreamfin=newFileInputStream(read);FileOutputStreamfon=newFileOutputStream(write);//復(fù)制文件byte[]b=new
byte[8192];int
len=fin.available();for(int
i=0;i<len/8192;i++){fin.read(b);
fon.write(b);}int
size=fin.read(b);//獲得有效內(nèi)容的長(zhǎng)度f(wàn)on.write(b,0,size);//關(guān)閉管道fin.close();fon.close();}catch(Exceptione){}}}3.4字節(jié)流——復(fù)制大文件//加密與解密importjava.io.*;public
classProtectFile{public
static
voidmain(Stringargs[]){try{//建立三個(gè)文件,一個(gè)源文件,一個(gè)加密文件,一個(gè)解密后文件Fileread=newFile("D:\\test.txt");Fileprotect=newFile("D:/t.txt");Filesourse=newFile("D:/copy.txt");//建立四條管道,分別指源文件輸入,加密輸出,加密文件輸入,解密輸出FileInputStreamfin1=newFileInputStream(read);FileOutputStreamfout1=newFileOutputStream(protect);FileInputStreamfin2=newFileInputStream(protect);FileOutputStreamfout2=newFileOutputStream(sourse);//操作四條管道int
len=fin1.available();for(int
i=0;i<len;i++){
fout1.write(fin1.read()+i%100);
fout2.write(fin2.read()-i%100);}//關(guān)閉管道fin1.close();fout1.close();fin2.close();fout2.close();}catch(Exceptione){}}}//隨機(jī)密碼,還可以專門做成密鑰文件int
a[]=new
int[len];for(int
i=0;i<a.length;i++){a[i]=(int)(Math.random()*100);}for(int
i=0;i<len;i++){
fout1.write(fin1.read()+a[i]);
fout2.write(fin2.read()-a[i]);}3.4字節(jié)流——加密與解密目錄4窗體可視化插件個(gè)性化聊天工具1音樂(lè)播放器2輸入輸出流3字符串與字符流5聊天項(xiàng)目的延伸與拓展64個(gè)性化聊天工具項(xiàng)目目標(biāo):模擬一款類似QQ的聊天軟件,要求實(shí)現(xiàn)如下功能:(1)從登錄界面跳轉(zhuǎn)到好友信息主界面,雙擊某個(gè)好友進(jìn)入相應(yīng)的聊天窗口;(2)能夠保存歷史聊天記錄,并在打開聊天窗口時(shí)將歷史記錄顯示在界面上;(3)能夠追加新的聊天記錄,不同好友的聊天記錄應(yīng)有區(qū)別。設(shè)計(jì)思路:(1)運(yùn)用WindowBuilder設(shè)計(jì)完成登錄界面、好友信息界面和聊天窗口界面的設(shè)計(jì)。(2)完成界面組件必要的事件處理。(3)項(xiàng)目的進(jìn)一步拓展和延伸。4個(gè)性化聊天工具事件處理每個(gè)界面中的事件基本都是按鈕的動(dòng)作事件,以“登錄”按鈕為例:jb1.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEvente){
booleanflag=false;//判斷登錄條件是否成立的變量 if(flag==true){//昵稱和密碼正確 JOptionPane.showMessageDialog(null,"登錄成功!");//窗體彈框 newmessage();//打開好友信息界面 setVisible(false);//隱藏登錄界面 }else{//昵稱或密碼不正確 JOptionPane.showMessageDialog(null,"昵稱或密碼錯(cuò)誤!"); } }});4個(gè)性化聊天工具聊天窗口界面功能如下:通過(guò)“發(fā)送”按鈕將下面輸入?yún)^(qū)中的內(nèi)容顯示到上面顯示區(qū)中,同時(shí)清空輸入?yún)^(qū);實(shí)現(xiàn)顯示區(qū)中聊天記錄的追加功能、輸入?yún)^(qū)和顯示區(qū)的滾動(dòng)條功能。顯示區(qū)中的內(nèi)容作為聊天記錄保存到文本文件中;單擊“歷史”按鈕在顯示區(qū)中顯示以往的聊天記錄。前兩項(xiàng)用以往事件處理的知識(shí)基本可以完成。后兩項(xiàng)需要用到I/O系統(tǒng)。4個(gè)性化聊天工具(1)“返回”按鈕事件處理close.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){ newmessage();//打開信息界面 setVisible(false);//隱藏聊天界面}});(2)“清空”按鈕事件處理del.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEventarg0){ jtf1.setText("");//設(shè)置顯示區(qū)文本為空 jtf2.setText("");//設(shè)置輸入?yún)^(qū)文本為空 }});4個(gè)性化聊天工具(3)“歷史”按鈕事件處理//將文本文件chat.txt中的內(nèi)容導(dǎo)入聊天窗口中his.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEventarg0){ Filef1=newFile("chat.txt"); //找到chat.txt文件 try{ //建立文件輸入緩沖流 BufferedReaderbr=newBufferedReader(newFileReader(f1)); while(br.ready()){//判斷緩沖字符流是否可讀,也就是是否不空 jtf1.append(br.readLine()+"\n");//按行讀取字符并追加到最后 } br.close();//關(guān)閉流 }catch(IOExceptione3){}}});其中,"\n"為換行符,用來(lái)設(shè)置聊天信息的顯示格式。4個(gè)性化聊天工具(4)“發(fā)送”按鈕事件處理“發(fā)送”按鈕要完成兩個(gè)功能,首先將輸入?yún)^(qū)的信息加載到顯示區(qū)內(nèi),其次將信息寫入到文本文件中,完成聊天記錄的保存。因此,關(guān)于“發(fā)送”按鈕的事件處理也分兩部分完成:將輸入?yún)^(qū)中的文字顯示在顯示區(qū)域內(nèi)并清空輸入?yún)^(qū)jtf1.append(jtf2.getText()+"\n");//獲取輸入?yún)^(qū)信息追加到顯示區(qū),行末換行jtf2.setText("");//清空輸入?yún)^(qū)將輸入?yún)^(qū)中的信息儲(chǔ)存在文本文件中FileWriterfw=newFileWriter("chat1.txt",true);//定位文件并建立文件輸出流PrintWriterpw=newPrintWriter(fw);//封裝輸出緩沖流pw.println(jtf2.getText());//將最新信息寫入文件pw.close();//關(guān)閉流4個(gè)性化聊天工具關(guān)于時(shí)間的加載需要導(dǎo)入以下兩個(gè)類:importjava.time.LocalDateTime;importjava.time.format.DateTimeFormatter;DateTimeFormatter是線程安全的,運(yùn)用時(shí)不需要new對(duì)象,可以避免創(chuàng)建對(duì)象占用大量?jī)?nèi)存的情況。調(diào)用當(dāng)前日期時(shí)間并將其格式化的使用方法為:LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-ddHH:mm:ss"));,其返回值類型為String。目錄5窗體可視化插件字符串與字符流1音樂(lè)播放器2輸入輸出流3個(gè)性化聊天工具4聊天項(xiàng)目的延伸與拓展65字符串與字符流字符串1.字符串的定義字符串是程序設(shè)計(jì)中最常用的一種引用數(shù)據(jù)類型,在Java中字符串被作為對(duì)象來(lái)處理。聲明和創(chuàng)建一個(gè)字符串的方法有:(1)Stringstr1=newString("HelloJava!");(2)Stringstr2="Hellojava!";(3)charc[]={'H','e','l','l','o','','J','a','v','a','!'};//字符數(shù)組形式Stringstr3=newString(c);(4)byteb[]={'H',101,'l','l','o','','J',97,'v',97,'!'};//字節(jié)數(shù)組形式Stringstr4=newString(b);2.字符串的比較publicclassTest{ publicstaticvoidmain(Stringargs[]){ Strings1=newString("Hellojava!"); Strings2=newString("Hellojava!"); System.out.print(s1==s2); }}3.字符串的轉(zhuǎn)換(1)由基本數(shù)據(jù)類型轉(zhuǎn)換成StringString類中提供了將基本數(shù)據(jù)類型轉(zhuǎn)換成String型的靜態(tài)方法String.valueOf()。(2)由String型轉(zhuǎn)換成數(shù)值類型Double.parseDouble(Strings):將String型轉(zhuǎn)換成double型
Integer.parseInt(Strings):將String型轉(zhuǎn)換成int型5字符串與字符流4.字符串的常用方法(1)求字符串的長(zhǎng)度:length()(2)大小寫的轉(zhuǎn)換:toLowerCase()、toUpperCase()(3)字符串的拆分:String[]split(Stringregex)方法返回一個(gè)字符串?dāng)?shù)組,參數(shù)regex為分隔符。(4)關(guān)于子串的操作Stringsubstring(intbeginIndex,intendIndex):取beginIndex到endIndex的子串intindexOf(Stringstr):返回str在當(dāng)前字符串中的開始位置booleanstartsWith(Stringprefix):判斷該字符串是否以prefix為前綴字符流5字符串與字符流字符流與字節(jié)流的處理方式非常相似,它們的主要區(qū)別是:字節(jié)流操作的基本單元為字節(jié),字符流操作的基本單元為Unicode代碼單元(大小為2字節(jié))。字節(jié)流默認(rèn)不使用緩沖區(qū),字符流使用緩沖區(qū)。字節(jié)流通常用于處理二進(jìn)制數(shù)據(jù),實(shí)際上它可以處理任意類型的數(shù)據(jù),但它不支持直接寫入或讀取Unicode代碼單元;字符流通常處理文本數(shù)據(jù),它支持讀寫Unicode代碼單元。負(fù)責(zé)字符流讀/寫的類為Reader和Writer,它們也是抽象類,同樣不能創(chuàng)建實(shí)例對(duì)象?;谶@兩個(gè)類的常用子類有:BufferedReader和BufferedWriter:用于字符流讀寫緩沖存儲(chǔ)InputStreamReader和OutputStreamWriter:用于字節(jié)與字符的相互轉(zhuǎn)換FileReader和FileWriter:用于字符文件的輸入輸出字節(jié)流對(duì)文本的處理會(huì)亂碼,因而需要字符流出場(chǎng),但計(jì)算機(jī)只能一次讀一個(gè)字符,故需要緩沖流幫忙。try{//定位數(shù)據(jù)源
Filef=newFile(“D:/test.txt");//建立管道
FileReaderfr=newFileReader(f);BufferedReaderbr=newBufferedReader(fr);//緩沖流對(duì)象
//處理管道
while(br.ready()){//ready()判斷緩沖字符流是否不空System.out.println(br.readLine());//readLine()讀文本的一行,遇到換行即停止
}br.close();//將緩沖區(qū)的流刷新(flush)到文件中并關(guān)閉流}catch(Exceptione){}5字符串與字符流//運(yùn)用字符流完成文件復(fù)制importjava.io.*;public
classCopy{public
static
voidmain(Stringargs[]){try{//建立兩個(gè)文件,一個(gè)源文件,一個(gè)目標(biāo)文件Fileread=newFile("D:\\test.txt");Filesourse=newFile("D:/copy.txt");//建立管道,運(yùn)用緩沖流完成一次性讀取一行的操作FileReaderfin=newFileReader(read);BufferedReaderbr=newBufferedReader(fin);FileWriterfout=newFileWriter(sourse,true);BufferedWriterbw=newBufferedWriter(fout);//操作管道while(br.ready())//判斷緩沖字符流是否為空
bw.write(br.readLine()+"\n");//一次讀入一行,遇到換行符停止
//關(guān)閉管道br.close();bw.close();//可以用flush()將緩沖區(qū)的字符流刷新到文件中}catch(Exceptione){}}}//通常運(yùn)用PrintWriter代替BufferedWriter,//因?yàn)楹笳吒⒅貙?duì)緩沖區(qū)的管理,前者在此基礎(chǔ)上對(duì)輸出格式進(jìn)行了處理,更適應(yīng)不同的平臺(tái)系統(tǒng)。PrintWriterpw=newPrintWriter(fout);while(br.ready())
pw.println(br.readLine());注:如果不用close,緩沖區(qū)裝滿后也會(huì)自動(dòng)刷新到文件中。聊天記錄中追加5字符串與字符流
在輸入和輸出操作中使用不同的編碼方式,會(huì)導(dǎo)致二者呈現(xiàn)的結(jié)果不相同,也就是所謂的“亂碼”。在實(shí)際應(yīng)用中常常需要指定編碼方式,同時(shí)也需要字節(jié)流與字符流之間的相互轉(zhuǎn)換。在Java中,InputStreamReader類與OutputStreamWriter類架起了字節(jié)流與字符流之間的橋梁。
在輸入輸出操作中,輸入字符流把要讀取的字節(jié)序列按指定編碼方式解碼為相應(yīng)字符序列存在內(nèi)存中,而輸出字符流則把要寫入文件的字符序列轉(zhuǎn)為指定編碼方式下的字節(jié)序列,然后再寫入到文件中。FileReader在讀取文件的時(shí)候采取的是系統(tǒng)默認(rèn)的編碼格式GBK,而windows文本文件默認(rèn)的編碼格式為utf-8,二者并不相同。然而,使用FileReader在讀取文件的時(shí)候并不能指定特定的編碼格式。想要指定編碼格式讀取文件,需在FileInputStream外面嵌套InputStreamReader來(lái)代替FileReader,并指定其編碼格式。5字符串與字符流
BufferedInputStream:當(dāng)向緩沖流寫入數(shù)據(jù)時(shí)候,數(shù)據(jù)先寫到緩沖區(qū),待緩沖區(qū)寫滿后,系統(tǒng)一次性將數(shù)據(jù)發(fā)送給輸出設(shè)備。BufferedOutputStream:當(dāng)從緩沖流讀取數(shù)據(jù)時(shí)候,系統(tǒng)先從緩沖區(qū)讀出數(shù)據(jù),待緩沖區(qū)為空時(shí),系統(tǒng)再?gòu)妮斎朐O(shè)備讀取數(shù)據(jù)到緩沖區(qū)。緩沖流儲(chǔ)備的重要:少壯不努力,老大徒傷悲。機(jī)會(huì)永遠(yuǎn)留給有準(zhǔn)備的人。目錄6窗體可視化插件聊天項(xiàng)目的延伸與拓展1音樂(lè)播放器2輸入輸出流3個(gè)性化聊天工具4字符串與字符流56聊天項(xiàng)目的延伸與拓展添加音效
可以單獨(dú)創(chuàng)建一個(gè)類來(lái)管理音頻輸入、播放、暫停、輸出等相關(guān)操作,在需要時(shí)直接調(diào)用即可。創(chuàng)建一個(gè)setMusic類,類中使用javax.sound獲取音頻輸入流和編碼對(duì)象、包裝音頻信息等,結(jié)合多線程同步控制等方法實(shí)現(xiàn)播放音頻、暫停音頻、繼續(xù)音頻、循環(huán)音頻等操作。具體代碼見教材。網(wǎng)絡(luò)通信利用Socket方式進(jìn)行數(shù)據(jù)通信與傳輸大致有如下步驟:(1)創(chuàng)建服務(wù)器端ServerSocket,設(shè)置建立連接的端口號(hào);(2)創(chuàng)建客戶端Socket,設(shè)置綁定的主機(jī)名或IP地址,指定連接端口號(hào);(3)運(yùn)行服務(wù)器端程序,讓其處于等待接收狀態(tài);(4)運(yùn)行客戶端發(fā)起連接請(qǐng)求;(5)進(jìn)行數(shù)據(jù)傳輸。連接數(shù)據(jù)庫(kù)Socket對(duì)象成對(duì)出現(xiàn),一次new兩個(gè)。一個(gè)叫服務(wù)器,負(fù)責(zé)接收;一個(gè)叫客戶端,負(fù)責(zé)發(fā)送。//服務(wù)器端程序import.*;public
classMyServer{public
static
voidmain(Stringargs[]){try{//告訴程序監(jiān)聽哪個(gè)端口,如果8000已經(jīng)被定義則會(huì)落入異常處理塊ServerSocketss=newServerSocket(8000);System.out.println("接收前……");//生成Socket對(duì)象,不用newSockets=ss.accept();System.out.println("接收后……");}catch(Exceptione){}}}6聊天項(xiàng)目的延伸與拓展//客戶端程序import.*;public
classMyClient{public
static
voidmain(Stringargs[]){try{//new一個(gè)Socket對(duì)象,兩人參數(shù)分別為所尋找的網(wǎng)絡(luò)地址和端口號(hào)Sockets=newSocket("",8000);}catch(Exceptione){}}}“”本機(jī)的回傳地址,可用“l(fā)ocalhost”代替,如果是另一臺(tái)機(jī)器作服務(wù)器則需換成另一機(jī)器的IP地址。運(yùn)行過(guò)程先運(yùn)行服務(wù)器端,保證其在8000端口等著。6聊天項(xiàng)目的延伸與拓展服務(wù)器端:Sockets=ss.accept();//獲取字節(jié)流InputStream
is=s.getInputStream();//將字節(jié)流轉(zhuǎn)換成字符流InputStreamReader
isr=new
InputStreamReader(is);//可以讀一行字符的高級(jí)流BufferedReader
br=new
BufferedReader(isr);System.out.println("歡迎"+br.readLine());客戶端:Sockets=newSocket("",8000);OutputStreamos=s.getOutputStream();OutputStreamWriteros
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 深度解析(2026)《GBT 26067-2010硅片切口尺寸測(cè)試方法》
- 深度解析(2026)《GBT 26012-2010電容器用鉭絲》
- 深度解析(2026)《GBT 25952-2010散裝浮選鎳精礦取樣、制樣方法》(2026年)深度解析
- 深度解析(2026)《GBT 25915.4-2010潔凈室及相關(guān)受控環(huán)境 第4部分:設(shè)計(jì)、建造、啟動(dòng)》
- 2025江蘇蘇州市公交集團(tuán)有限公司管理崗位(應(yīng)屆生)招聘7人模擬筆試試題及答案解析
- 2026廣東省氣象部門氣象類高校畢業(yè)生招聘5人(廣州專場(chǎng))參考筆試題庫(kù)附答案解析
- 2025廣西國(guó)土規(guī)劃集團(tuán)西藏辦事處招聘?jìng)淇伎荚囶}庫(kù)及答案解析
- 深度解析(2026)《GBT 25631-2010機(jī)械振動(dòng) 手持式和手導(dǎo)式機(jī)械 振動(dòng)評(píng)價(jià)規(guī)則》(2026年)深度解析
- 高中階段學(xué)校多樣化發(fā)展的制度瓶頸-基于《高中階段教育普及攻堅(jiān)計(jì)劃》后續(xù)評(píng)估
- 中船集團(tuán)第七〇八研究所2026屆校園招聘?jìng)淇伎荚囋囶}及答案解析
- 中國(guó)石化油品銷售企業(yè)實(shí)驗(yàn)室信息管理系統(tǒng)LIMSWeb操作手冊(cè)
- NY/T 5161-2002無(wú)公害食品虹鱒養(yǎng)殖技術(shù)規(guī)范
- GB/T 27843-2011化學(xué)品聚合物低分子量組分含量測(cè)定凝膠滲透色譜法(GPC)
- GB/T 19362.2-2017龍門銑床檢驗(yàn)條件精度檢驗(yàn)第2部分:龍門移動(dòng)式銑床
- GB/T 18371-2008連續(xù)玻璃纖維紗
- 石淋(尿石癥)中醫(yī)診療方案
- 《金融學(xué)》期末考試復(fù)習(xí)題庫(kù)(帶答案)
- 《心靈奇旅》觀后感
- 2009-2022歷年廣東省汕尾市事業(yè)單位考試《通用能力測(cè)試》(綜合類)真題含答案2022-2023上岸必備帶詳解版3
- 鋼結(jié)構(gòu)外觀、幾何尺寸試驗(yàn)檢測(cè)報(bào)告
- 千喜鶴指導(dǎo)手冊(cè)終版
評(píng)論
0/150
提交評(píng)論