一、从菜鸟教程练习了一个简单的小程序用来合并两段音乐。
大体思路是这样的:
1. 使用 FileInputStream 输入两个音频F:/workspace/2下的两个2.mp3 和1.MP3文件
2. 使用 FileInputStream的skip(long n) 方法跳过特定字节长度的音频文件,比如说:输入 skip(1024*1024*3),这样就能丢弃掉音频文件前面的 3MB 的内容。
3. 截取中间特定长度的音频文件:每次输入 8KB 的内容,使用 count 记录输入次数,达到设置的次数就终止音频输入。比如说要截取 2MB 的音频,每次往输入流中输入 8KB 的内容,就要输入 1024*2/8 次。
4. 往同一个输出流 FileOutputStream 中输出音频,并生成文件,实现音频混合。
5.查看目录下,会有一个新的合并文件3.mp3
代码如下:
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class MusicC {
public static void main(String[] args)
{
FileOutputStream f1=null;
FileInputStream f2=null;
String fileNames[] = {"F:/workspace/2/2.mp3","F:/workspace/2/1.mp3"};
byte by[] =new byte[1024*8];
try
{
f1=new FileOutputStream("F:/workspace/2/3.mp3");
for(int i=0;i<2;i++)
{
int count=0;
f2=new FileInputStream(fileNames[i]);
f2.skip(2014*1024*3);
while (f2.read(by)!=-1)
{
f1.write(by);
count++;
System.out.print(count);
if (count==(1024*2/8)) break;
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
二、列出某种类型的文件
有时需要列出目录下指定类型的文件,例如:. java、. txt 等扩展名的文件。
可以使用File类的下述两个方法,列出指定类型的文件:
- 1、public String[ ] list(FilenameFilter obj) 该方法用字符串的形式返回目录下的指定类型的所有文件
- 2、public File[ ] listFile(FilenameFilter obj) 该方法用 File 对象形式返回目录下的指定类型的所有文件
上述两个方法的参数 FilenameFilter 是一个接口,该接口有一个方法: accept(File f,String name);
File 对象 f 调用 list 方法时,需向该方法传递一个实现 FilenameFilter 接口的对象,list 方法执行时,参数 obj 不断回调接口方法accept(File f,String name),该方法中的参数 f 为,调用 list 的当前目录,参数 name 被实例化为当前目录中的一个文件名,当接口方法返回 true 时,list 方法就将名字为 name 的文件存放到返回的数组中。
三、用接口创建一个类
四、抽象类
使用 abstract class 来定义抽象类。抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。
遇到了一个问题,报错:Implicit super constructor Father() is undefined. Must explicitly invoke another constructor
翻译:大概意思就父类已经定义了一个有参构造函数,你是人家儿子,你老爸都弄了个构造函数,你不得调用人家的构造函数呀,所以呀,子类应该通过super关键字显示调用父类的有参构造函数。在子类中:public AbstractTest(String name, String address, int number) { super(name, address, number); }
-
1. 抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。
-
2. 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
-
3. 抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能。
-
4. 构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。
-
5. 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。