第10章 海阔凭鱼跃天高任鸟飞-多媒体与输入输出流_第1页
第10章 海阔凭鱼跃天高任鸟飞-多媒体与输入输出流_第2页
第10章 海阔凭鱼跃天高任鸟飞-多媒体与输入输出流_第3页
第10章 海阔凭鱼跃天高任鸟飞-多媒体与输入输出流_第4页
第10章 海阔凭鱼跃天高任鸟飞-多媒体与输入输出流_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2025/3/10零基础快乐学Java目录1音乐播放器窗体可视化插件2输入输出流3个性化聊天工具4字符串与字符流5聊天项目的延伸与拓展6/windowbuilder/download.php进入WindowBuilder的下载页面,选择与Eclipse版本相对应的link,单击右键复制链接。1.1下载与安装1窗体可视化插件打开Eclipse主界面,选择“Help”菜单下的“InstallNewSoftware”。单击打开相应对话框,将所复制的网址粘贴到Workwith后的文本框中1.1下载与安装1窗体可视化插件安装完成后需要重新启动Eclipse。重启之后,依次打开“File”-“New”-“Other”,单击WindowBuilder导航框,选择“SwingDesigner”即可打开窗体设计器。1窗体可视化插件目录2窗体可视化插件音乐播放器1输入输出流3个性化聊天工具4字符串与字符流5聊天项目的延伸与拓展62音乐播放器项目目标:完成一个界面友好的小型音乐播放器。设计思路:(1)完成界面设计。运用WindowBuilder设计完成如右图所示的音乐播放器界面(注:界面可根据个人喜好自行设计,不一定要与右图一致)。(2)完成界面组件必要的事件处理。(3)完成音乐播放功能。(4)完成图像切换功能。2音乐播放器if(e.getClickCount()==2){//双击左键时filename=list.getSelectedItem();//播放选中的文件btnNewButton_1.setIcon(stop);//更换播放按钮图标

threadControl();//窗体组件与音频播放线程的控制}publicvoidthreadControl(){t=newThread(frame);//窗体线程,切换按钮图标、滑动滑杆

t.start();//线程启动mt=newMusicThread();//音乐播放线程mt.start();//线程启动}事件处理——双击进行播放采用两个线程控制使得图标的切换、滑杆的滑动与音频的播放可以“同时”进行。2音乐播放器音频播放获取格式化的音频数据读取数据发送到混音器音频数据写入源数据行关闭AudioSystem.getAudioInputStream(newFile(Strings));format=in.getFormat();source.write(b,0,count);//数据写入AudioSystem.getSourceDataLine(format);source.drain();//清空数据缓冲source.close();//关闭输入图像切换2音乐播放器创建标签对象并设置标签上的图标在控制滑杆线程的run()方法中重新设置标签图标JLabellblNewLabel=newJLabel();//创建标签对象lblNewLabel.setIcon(newImageIcon("G:\\bg.jpeg"));//设置标签上的图标lblNewLabel.setIcon(newImageIcon("G:\\birthday.gif"));//切换标签图案目录3窗体可视化插件输入输出流1音乐播放器2个性化聊天工具4字符串与字符流5聊天项目的延伸与拓展63.1流1、生活中的流是什么?它有方向吗?有什么特点?程序运行在内存和CPU的资源里,除了键盘输入和显示器输出外,内存之外的设备还有打印机、硬盘、网络等等,程序通过什么跟它们打交道呢?另外,在打交道的过程中有数字、音频、图像、文字等等各种各样信息的交互,又如何保证能正确传输呢?3.1流流的特性:有起点终点、有单向双向、一去不复返。从中可以学到:

把握当下:子在川上曰:逝者如斯夫,不舍昼夜。2、程序设计中的流是什么?它的作用是什么呢?3.1流IO系统3.2输入和输出Java中I/O操作主要是指使用Java进行输入、输出操作。

Java所有的I/O机制都是基于数据流进行输入输出。

数据流是有顺序的,有起点和终点的。流的本质是数据传输,Java将流抽象为各种类。

采用数据流的目的就是使得输出输入独立于设备。InputStream不关心数据源来自何种设备(键盘,文件,网络),OutputStream不关心数据流向何种设备(显示器,打印机,文件,网络)数据流输出流输入流内存操作需要四个步骤:

第一步:定位。

第二步:建立管道。

第三步:操作管道。第四步:关闭。数据流的输入输出是相对于内存而言的。离开内存是有风险的,需要异常保护,PrintStream除外。3.2输入和输出3.3标准输入输出流1)标准输出流

System.out

System.out向标准输出设备输出数据,其数据类型为PrintStream。方法:

Voidprint(参数)

Voidprintln(参数)2)标准输入流

System.in

System.in读取标准输入设备数据(从标准输入获取数据,一般是键盘),其数据类型为InputStream。方法:

intread()

//返回ASCII码。若返回值=-1,说明没有读取到任何字节,读取工作结束。

intread(byte[]b)//读入多个字节到缓冲区b中返回值是读入的字节数3)标准输出错误流System.err

与系统输出流的区别是,系统输出流输出的是程序正确运行时的信息,而系统错误流输出的是程序出错时的信息,即异常信息。3.4字节流

FileInputStream:字节流。可以使用read()方法一次读入一个字节,并以int类型返回,或者是使用read()方法时读入至少一个byte数组,byte数组的元素有多少个,就读入多少个字节。

作用:以文件作为数据输入源的数据流。或者说是打开文件,从文件读数据到内存的类。FileInputStream类

FileOutputStream类用来处理以文件作为数据输出目的数据流。

创建一个文件流对象有三种方法:

方式1:

File

f=new

File(“d:/myjava/write.txt”);

FileOutputStream

out=newFileOutputStream(f);

方式2:

FileOutputStreamout=newFileOutputStream(“d:/myjava/write.txt”);

方式3:构造函数将文件名作为其第一参数,将布尔值作为第二参数。

FileOutputStreamf=newFileOutputStream(“d:/abc.txt”,true);

注意:(1)文件中写数据时,若文件已经存在,则覆盖存在的文件;(2)当读/写操作结束时,应调用close方法关闭流。

3.4字节流FileOutputStream类importjava.io.*; try{

//第一步:定位。表明需要操作哪个文件

Filef=newFile(“D:/test.txt");

//第二步:建立管道。FileOutputStreamfon=newFileOutputStream(f);

FileInputStreamfis=newFileInputStream(f);

//第三步:操作管道。fon.write(intdata); System.out.print((char)fis.read());

//第四步:关闭。fon.close();fis.close(); }catch(Exceptione){}内存输入(出)的四个步骤:3.4字节流读一个字符读整个文件写文件复制文件文件的加密与解密FileInputStreamFileInputStreamFileOutputStream3.4字节流——示例//读取一个字符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();//关闭管道}catch(Exceptione){}}}如何读取所有字符3.4字节流——读取一个字符//读取所有字符for(int

i=0;i<fin.available();)

System.out.print((char)fin.read());注:fin.available()返回剩余未被处理的内容长度。同理下面效果也一样:

int

len=fin.available();for(int

i=0;i<len;i++)

System.out.print((char)fin.read());以上两种方法的区别:

第二种更好。

理由:fin.available()的运行速度慢于i++;尽管浪费了内存,但节约了CPU。3.4字节流——读取所有字符importjava.io.*;public

classCopyFile{public

static

voidmain(Stringargs[]){try{//建立两个文件Fileread=newFile("D:/test.txt");Filewrite=newFile("D:/test1.txt");//建立两条管道,分别指向源文件和被复制文件FileInputStreamfin=newFileInputStream(read);FileOutputStreamfon=newFileOutputStream(write);//复制文件int

len=fin.available();for(int

i=0;i<len;i++)

fon.write(fin.read());//s.getBytes();//关闭管道fin.close();fon.close();}catch(Exceptione){}}}利用字节流将test文件的内容复制到test1文件中。3.4字节流——复制文件复制大文件read(byte[]b){}文件加密与解密output.write(input.read()+10);//加密方式intpassword=(int)(Math.random()*128);//加密方式为随机数

passwordOutput.write(password);output.write(input.read()+password);3.4字节流复制大文件: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会造成内存浪费,复制jar文件时还可能出错修正方式:for(int

i=0;i<len/8192;i++){//注意不加1

fin.read(b);

fon.write(b);}int

size=fin.read(b);//获得有效内容的长度fon.write(b,0,size);//注意参数写法3.4字节流——示例//复制大文件,比如zip,jar,图片、音乐文件等importjava.io.*;public

classCopyBlock{public

static

voidmain(Stringargs[]){try{//建立两个文件Fileread=newFile("C:\\Users\\Public\\Music\\SampleMusic\\Kalimba.mp3");Filewrite=newFile("D:/test.mp3");//建立两条管道,分别指向源文件和被复制文件FileInputStreamfin=newFileInputStream(read);FileOutputStreamfon=newFileOutputStream(write);//复制文件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);//获得有效内容的长度fon.write(b,0,size);//关闭管道fin.close();fon.close();}catch(Exceptione){}}}3.4字节流——复制大文件//加密与解密importjava.io.*;public

classProtectFile{public

static

voidmain(Stringargs[]){try{//建立三个文件,一个源文件,一个加密文件,一个解密后文件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);}//关闭管道fin1.close();fout1.close();fin2.close();fout2.close();}catch(Exceptione){}}}//随机密码,还可以专门做成密钥文件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字节流——加密与解密目录4窗体可视化插件个性化聊天工具1音乐播放器2输入输出流3字符串与字符流5聊天项目的延伸与拓展64个性化聊天工具项目目标:模拟一款类似QQ的聊天软件,要求实现如下功能:(1)从登录界面跳转到好友信息主界面,双击某个好友进入相应的聊天窗口;(2)能够保存历史聊天记录,并在打开聊天窗口时将历史记录显示在界面上;(3)能够追加新的聊天记录,不同好友的聊天记录应有区别。设计思路:(1)运用WindowBuilder设计完成登录界面、好友信息界面和聊天窗口界面的设计。(2)完成界面组件必要的事件处理。(3)项目的进一步拓展和延伸。4个性化聊天工具事件处理每个界面中的事件基本都是按钮的动作事件,以“登录”按钮为例:jb1.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEvente){

booleanflag=false;//判断登录条件是否成立的变量 if(flag==true){//昵称和密码正确 JOptionPane.showMessageDialog(null,"登录成功!");//窗体弹框 newmessage();//打开好友信息界面 setVisible(false);//隐藏登录界面 }else{//昵称或密码不正确 JOptionPane.showMessageDialog(null,"昵称或密码错误!"); } }});4个性化聊天工具聊天窗口界面功能如下:通过“发送”按钮将下面输入区中的内容显示到上面显示区中,同时清空输入区;实现显示区中聊天记录的追加功能、输入区和显示区的滚动条功能。显示区中的内容作为聊天记录保存到文本文件中;单击“历史”按钮在显示区中显示以往的聊天记录。前两项用以往事件处理的知识基本可以完成。后两项需要用到I/O系统。4个性化聊天工具(1)“返回”按钮事件处理close.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){ newmessage();//打开信息界面 setVisible(false);//隐藏聊天界面}});(2)“清空”按钮事件处理del.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEventarg0){ jtf1.setText("");//设置显示区文本为空 jtf2.setText("");//设置输入区文本为空 }});4个性化聊天工具(3)“历史”按钮事件处理//将文本文件chat.txt中的内容导入聊天窗口中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();//关闭流 }catch(IOExceptione3){}}});其中,"\n"为换行符,用来设置聊天信息的显示格式。4个性化聊天工具(4)“发送”按钮事件处理“发送”按钮要完成两个功能,首先将输入区的信息加载到显示区内,其次将信息写入到文本文件中,完成聊天记录的保存。因此,关于“发送”按钮的事件处理也分两部分完成:将输入区中的文字显示在显示区域内并清空输入区jtf1.append(jtf2.getText()+"\n");//获取输入区信息追加到显示区,行末换行jtf2.setText("");//清空输入区将输入区中的信息储存在文本文件中FileWriterfw=newFileWriter("chat1.txt",true);//定位文件并建立文件输出流PrintWriterpw=newPrintWriter(fw);//封装输出缓冲流pw.println(jtf2.getText());//将最新信息写入文件pw.close();//关闭流4个性化聊天工具关于时间的加载需要导入以下两个类:importjava.time.LocalDateTime;importjava.time.format.DateTimeFormatter;DateTimeFormatter是线程安全的,运用时不需要new对象,可以避免创建对象占用大量内存的情况。调用当前日期时间并将其格式化的使用方法为:LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-ddHH:mm:ss"));,其返回值类型为String。目录5窗体可视化插件字符串与字符流1音乐播放器2输入输出流3个性化聊天工具4聊天项目的延伸与拓展65字符串与字符流字符串1.字符串的定义字符串是程序设计中最常用的一种引用数据类型,在Java中字符串被作为对象来处理。声明和创建一个字符串的方法有:(1)Stringstr1=newString("HelloJava!");(2)Stringstr2="Hellojava!";(3)charc[]={'H','e','l','l','o','','J','a','v','a','!'};//字符数组形式Stringstr3=newString(c);(4)byteb[]={'H',101,'l','l','o','','J',97,'v',97,'!'};//字节数组形式Stringstr4=newString(b);2.字符串的比较publicclassTest{ publicstaticvoidmain(Stringargs[]){ Strings1=newString("Hellojava!"); Strings2=newString("Hellojava!"); System.out.print(s1==s2); }}3.字符串的转换(1)由基本数据类型转换成StringString类中提供了将基本数据类型转换成String型的静态方法String.valueOf()。(2)由String型转换成数值类型Double.parseDouble(Strings):将String型转换成double型

Integer.parseInt(Strings):将String型转换成int型5字符串与字符流4.字符串的常用方法(1)求字符串的长度:length()(2)大小写的转换:toLowerCase()、toUpperCase()(3)字符串的拆分:String[]split(Stringregex)方法返回一个字符串数组,参数regex为分隔符。(4)关于子串的操作Stringsubstring(intbeginIndex,intendIndex):取beginIndex到endIndex的子串intindexOf(Stringstr):返回str在当前字符串中的开始位置booleanstartsWith(Stringprefix):判断该字符串是否以prefix为前缀字符流5字符串与字符流字符流与字节流的处理方式非常相似,它们的主要区别是:字节流操作的基本单元为字节,字符流操作的基本单元为Unicode代码单元(大小为2字节)。字节流默认不使用缓冲区,字符流使用缓冲区。字节流通常用于处理二进制数据,实际上它可以处理任意类型的数据,但它不支持直接写入或读取Unicode代码单元;字符流通常处理文本数据,它支持读写Unicode代码单元。负责字符流读/写的类为Reader和Writer,它们也是抽象类,同样不能创建实例对象。基于这两个类的常用子类有:BufferedReader和BufferedWriter:用于字符流读写缓冲存储InputStreamReader和OutputStreamWriter:用于字节与字符的相互转换FileReader和FileWriter:用于字符文件的输入输出字节流对文本的处理会乱码,因而需要字符流出场,但计算机只能一次读一个字符,故需要缓冲流帮忙。try{//定位数据源

Filef=newFile(“D:/test.txt");//建立管道

FileReaderfr=newFileReader(f);BufferedReaderbr=newBufferedReader(fr);//缓冲流对象

//处理管道

while(br.ready()){//ready()判断缓冲字符流是否不空System.out.println(br.readLine());//readLine()读文本的一行,遇到换行即停止

}br.close();//将缓冲区的流刷新(flush)到文件中并关闭流}catch(Exceptione){}5字符串与字符流//运用字符流完成文件复制importjava.io.*;public

classCopy{public

static

voidmain(Stringargs[]){try{//建立两个文件,一个源文件,一个目标文件Fileread=newFile("D:\\test.txt");Filesourse=newFile("D:/copy.txt");//建立管道,运用缓冲流完成一次性读取一行的操作FileReaderfin=newFileReader(read);BufferedReaderbr=newBufferedReader(fin);FileWriterfout=newFileWriter(sourse,true);BufferedWriterbw=newBufferedWriter(fout);//操作管道while(br.ready())//判断缓冲字符流是否为空

bw.write(br.readLine()+"\n");//一次读入一行,遇到换行符停止

//关闭管道br.close();bw.close();//可以用flush()将缓冲区的字符流刷新到文件中}catch(Exceptione){}}}//通常运用PrintWriter代替BufferedWriter,//因为后者更注重对缓冲区的管理,前者在此基础上对输出格式进行了处理,更适应不同的平台系统。PrintWriterpw=newPrintWriter(fout);while(br.ready())

pw.println(br.readLine());注:如果不用close,缓冲区装满后也会自动刷新到文件中。聊天记录中追加5字符串与字符流

在输入和输出操作中使用不同的编码方式,会导致二者呈现的结果不相同,也就是所谓的“乱码”。在实际应用中常常需要指定编码方式,同时也需要字节流与字符流之间的相互转换。在Java中,InputStreamReader类与OutputStreamWriter类架起了字节流与字符流之间的桥梁。

在输入输出操作中,输入字符流把要读取的字节序列按指定编码方式解码为相应字符序列存在内存中,而输出字符流则把要写入文件的字符序列转为指定编码方式下的字节序列,然后再写入到文件中。FileReader在读取文件的时候采取的是系统默认的编码格式GBK,而windows文本文件默认的编码格式为utf-8,二者并不相同。然而,使用FileReader在读取文件的时候并不能指定特定的编码格式。想要指定编码格式读取文件,需在FileInputStream外面嵌套InputStreamReader来代替FileReader,并指定其编码格式。5字符串与字符流

BufferedInputStream:当向缓冲流写入数据时候,数据先写到缓冲区,待缓冲区写满后,系统一次性将数据发送给输出设备。BufferedOutputStream:当从缓冲流读取数据时候,系统先从缓冲区读出数据,待缓冲区为空时,系统再从输入设备读取数据到缓冲区。缓冲流储备的重要:少壮不努力,老大徒伤悲。机会永远留给有准备的人。目录6窗体可视化插件聊天项目的延伸与拓展1音乐播放器2输入输出流3个性化聊天工具4字符串与字符流56聊天项目的延伸与拓展添加音效

可以单独创建一个类来管理音频输入、播放、暂停、输出等相关操作,在需要时直接调用即可。创建一个setMusic类,类中使用javax.sound获取音频输入流和编码对象、包装音频信息等,结合多线程同步控制等方法实现播放音频、暂停音频、继续音频、循环音频等操作。具体代码见教材。网络通信利用Socket方式进行数据通信与传输大致有如下步骤:(1)创建服务器端ServerSocket,设置建立连接的端口号;(2)创建客户端Socket,设置绑定的主机名或IP地址,指定连接端口号;(3)运行服务器端程序,让其处于等待接收状态;(4)运行客户端发起连接请求;(5)进行数据传输。连接数据库Socket对象成对出现,一次new两个。一个叫服务器,负责接收;一个叫客户端,负责发送。//服务器端程序import.*;public

classMyServer{public

static

voidmain(Stringargs[]){try{//告诉程序监听哪个端口,如果8000已经被定义则会落入异常处理块ServerSocketss=newServerSocket(8000);System.out.println("接收前……");//生成Socket对象,不用newSockets=ss.accept();System.out.println("接收后……");}catch(Exceptione){}}}6聊天项目的延伸与拓展//客户端程序import.*;public

classMyClient{public

static

voidmain(Stringargs[]){try{//new一个Socket对象,两人参数分别为所寻找的网络地址和端口号Sockets=newSocket("",8000);}catch(Exceptione){}}}“”本机的回传地址,可用“localhost”代替,如果是另一台机器作服务器则需换成另一机器的IP地址。运行过程先运行服务器端,保证其在8000端口等着。6聊天项目的延伸与拓展服务器端:Sockets=ss.accept();//获取字节流InputStream

is=s.getInputStream();//将字节流转换成字符流InputStreamReader

isr=new

InputStreamReader(is);//可以读一行字符的高级流BufferedReader

br=new

BufferedReader(isr);System.out.println("欢迎"+br.readLine());客户端:Sockets=newSocket("",8000);OutputStreamos=s.getOutputStream();OutputStreamWriteros

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论