-------
android培训、
java培训、期待与您交流! ----------
IO流用来处理设备之间的数据传输
jiava对数据的操作是通过流的方式
java用于操作流的对象都在IO包中
流按操作数据分为两种:字节流与字符流
流按流向分为:输入流,和输出流
注:由这四个类派生出来的子类名称都是以其父类的名字为子类名字的后缀
BufferedInputStream
BufferedOutputStream
字符流缓冲区
BufferedWriter
BufferedReader
缓冲区要结合流才可以使用
在流的基础上对流的功能进行了增强
FileWriter fw = new FileWriter(“Test.txt”);
建立一个流对象,将已存在的一个文件加载进 流。
InputStreamReader,OutputStreamWriter
字符流与字节流之间的桥梁
方便了字符流与字节流之间的操作
处理数据时,一定要先明确数据源,与数据目的 地(数据汇)。
数据源可以是文件,可以是键盘。
数据目的地可以是文件、显示器或者其他设备。
IO
jiava对数据的操作是通过流的方式
java用于操作流的对象都在IO包中
流按操作数据分为两种:字节流与字符流
流按流向分为:输入流,和输出流
IO流常用基类
字节流的抽象类:
InputStream,OutputStream字符流的抽象基类
Reader,Writer注:由这四个类派生出来的子类名称都是以其父类的名字为子类名字的后缀
缓冲区
缓冲区的出现提高了对数据的读写效率对应类
字节流缓冲区BufferedInputStream
BufferedOutputStream
字符流缓冲区
BufferedWriter
BufferedReader
缓冲区要结合流才可以使用
在流的基础上对流的功能进行了增强
字符流——创建文件
创建流对象,建立数据存放文件FileWriter fw = new FileWriter(“Test.txt”);
建立一个流对象,将已存在的一个文件加载进 流。
字符流——读取文件
FileReader fr = new FileReader(“Test.txt”);
转换流
InputStreamReader,OutputStreamWriter
字符流与字节流之间的桥梁
方便了字符流与字节流之间的操作
转换流的应用
字节流中的数据都是字符时,转成字符流操作更高效。流的基本应用小节
流是用来处理数据的。处理数据时,一定要先明确数据源,与数据目的 地(数据汇)。
数据源可以是文件,可以是键盘。
数据目的地可以是文件、显示器或者其他设备。
而流只是在帮助数据进行传输,并对传输的数据进行处理,比如过滤处理.转换处理等。
文件复制
import java.io.*;
class CopyTxte1
{
public static void main(String[] args)
{
copy();
}
public static void copy()
{
FileWriter fw =null;
FileReader fr= null;
try
{
fw=new FileWriter("SystemDemo_copy.txt");
/**如果已有文件SystemDemo_copy.txt想要不覆盖,
在已有文件末尾处续写可以fw=new FileWriter("SystemDemo_copy.txt",true)*/
fr=new FileReader("ForDemo.java");
char[] but=new char[1024];
//定义一个数组用于存储读到的数组,一般为1024的整数倍
int len=0;
while((len=fr.read(but))!=-1)
//read(but[])返回的是读到的字符个数,返回值-1表示结束
{
fw.write(but,0,len);
}
}
catch (IOException e)
{
throw new RuntimeException("读写失败");
}
finally
{
if(fr!=null)
try
{
fr.close();
}
catch (IOException e)
{
}
if(fw!=null)
try
{
fw.close();
}
catch (IOException e)
{
}
}
}
}
利用字符缓冲区提高复制效率:
/*
缓冲去的出现时为了提高流的操作效率而出现的。
所以在创建缓冲区之间必须要先有流对象。
该缓冲区中提供了一个快平台的换行符 newLine();
*/
import java.io.*;
class CopyTextByBuf2
{
public static void main(String[] args)
{
BufferedReader bufr= null;
BufferedWriter bufw= null;
try
{
bufr=new BufferedReader(new FileReader("PaiXu.java"));//创建流对象,添加到缓冲区一步到位
bufw=new BufferedWriter(new FileWriter("bufWriter_Copy.txt"));
String line=null;
while((line=bufr.readLine())!=null)
{
bufw.write(line);
bufw.newLine();
/*
字符读取流缓冲区提供了一个一次读一行的方法readLine,方便于对文本数据的获取。
当换回null时,表示读到了文件末尾。
*/
bufw.flush();
//记住,只要用到缓冲区,就要记得刷新。
bufw.flush();
//其实关闭缓冲区,就是关闭缓冲区中的流对象。
bufw.cloes();
}
}
catch (IOException e)
{
throw new RuntimeException("读取失败");
}
finally
{
try
{
if(bufr!=null)
bufr.close();
}
catch (IOException e)
{
throw new RuntimeException("读取关闭失败");
}
try
{
if(bufw!=null)
bufw.close();
}
catch (IOException e)
{
throw new RuntimeException("写入关闭失败");
}
}
}
}
装饰类
/*
装饰设计模式:
当想对已有的队形进行功能增强时,
当可以定义类,将已有队形传入,基于已有的功能,并提供将强功能。
那么自定义的该类称为装饰类。
装饰类通常通过构造方法接受被装饰的对象。
装饰模式比继承要灵活,避免了继承体系的臃肿。
而且降低了类与类之间的关系。
装饰类因为增强了已有对象,具备的功能和已有的是相同的,只不过提供了更强的功能。
所以装饰类和被装饰类通常都是属于一个体系中的。
*/
class Person
{
public void chifan()
{
System.out.println("chifan");
}
}
class SuperPerson
{
private Person p;
SuperPerson(Person p)
{
this.p=p;
}
public void superChifan()
{
System.out.println("kaiweijiu");
p.chifan();
System.out.println("tiandian");
System.out.println("laiyigen");
}
}
class Demo2
{
public static void main(String[] args)
{
Person p=new Person();
SuperPerson sp=new SuperPerson(p);
sp.superChifan();
}
}
自定义缓冲区复制MP3
import java.io.*;
class CopyMp3_2
{
public static void main(String[] args) throws IOException
{
copy();
}
public static void copy()throws IOException
{
MyBufferedInputStream bufis=new MyBufferedInputStream(new FileInputStream("d:\\1.mp3"));
BufferedOutputStream bufos=new BufferedOutputStream (new FileOutputStream("d:\\2.mp3"));
int by=0;
while((by=bufis.myRead())!=-1)
{
bufos.write(by);
}
bufos.close();
bufis.myClose();
}
}
class MyBufferedInputStream//自定义缓冲区为了提高效率
{
private InputStream in;
private byte[] buf=new byte[1024];
private int pos=0,count=0;
MyBufferedInputStream(InputStream in)
{
this.in=in;
}
public int myRead()throws IOException
{
//通过in对象读取硬盘上的数据,并存储buf中
if(count==0)//用count判断数组中是否还有数据,
{
count=in.read(buf);
pos=0;//每装入一次,指针归0
byte b=buf[pos];
count--;
pos++;
return b&255;
/*因为字节文件可能出现1111-1111的情况。因为b是byte类型的,被提升我int类型的
所以变为1111-1111-1111-11111-111-1111-1111-1111,为了避免1111-1111前补1带来的影响,
所以 &0000—0000—0000—0000—0000—0000—1111-1111*/
}
else if(count>0)
{
byte b=buf[pos];
count--;
pos++;
return b&0xff;
}
return -1;
}
public void myClose()throws IOException
{
in.close();
}
}
File类
/*
Flie类
1.用来将文件或者文件夹封装成对象
2.方便对文件与文件夹的属性信息进行操作,
3。File对象可以做为参数传递给流的构造函数
4.了解Flie类中常用方法:
(1)创建
boolean createNewFile():在指定位置创建文件,如果该文件已经存在,会覆盖。
(2)删除
boolean delete():删除失败返回false。
void deleteOnExit():在程序退出时栓出指定文件
(3)判断
boolean exists():文件是否存在。
isFlie();测试此抽象路径名表示的文件是否是一个标准文件。
isDirectory():测试此抽象路径名表示的文件是否是一个目录。
isHidden():测试此抽象路径名指定的文件是否是一个隐藏文件。
isAbsolute:测试此抽象路径名是否为绝对路径名。
(4)获取信息。
getName():返回由此抽象路径名表示的文件或目录的名称。
String getPath():将此抽象路径名转换为一个路径名字符串。
String getParent()返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。
File getParentFile()返回此抽象路径名父目录的抽象路径名;如果此路径名没有指定父目录,则返回 null。
String getAbsolutePath()返回此抽象路径名的绝对路径名字符串。
(5)listRoots():列出可用的文件系统根。
Flie[] flies=File.lisRoots();
for(File f : files)
{
System.out.println(f);
}
(6)
String[] list()
返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目
File f= new File("c:\\");
String[] names = f.list();//掉用list方法的file对象必须是封装了一个目录。该目录还必须存在
for(String name : names)
{
System.out.println(name);
}
可以列出c盘下所有文件和目录
(7)
File[] listFiles(FileFilter filter)
返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。
File dir =new File("d:\\");
String[] arr = dir.list(new FilenameFilter()
{
public boolean accept(File dir,String name)
{
return name.endsWith(".txt");
}
});
(8)
File[] listFiles()
返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件
File f= new File("c:\\");
File[] files = f.listFiles();//掉用list方法的file对象必须是封装了一个目录。该目录还必须存在
for(File fn : files)
{
System.out.println(fn.getName()+"::"+fn.length);
}
示例:
列出指定目录下文件或者文件夹,包含子目录中的内容。
也就是列出指定目录下所有内容。
因为目录中还有目录,只要使用同一个雷池目录功能的函数完成即可。
也就是函数自身调用自身。
这种表现形式或者编程手法称为递归
*/
import java.io.*;
class FileDemo3
{
public static void main(String[] args)
{
File dir = new File("d:\\shouji");
showDir(dir);
}
public static void showDir(File dir)
{
System.out.println(dir);
File[] files=dir.listFiles();
for(int x=0;x<files.length;x++)
{
if (files[x].isDirectory())
showDir(files[x]);
else
System.out.println(files[x]);
}
}
}
递归
/*
将一个指定目录下的java文件的绝对路径,存入到一个文本文件中。
建立一个java文件列表文件。
思路
1,对指定的目录进行递归。
2,获取递归过程所取的java文件的路径。
3,将这些路径存储到集合中,
4,将集合中的数据在写入文本文件中
*/
import java.io.*;
import java.util.*;
class JavaFileList3
{
public static void main(String[] args) throws IOException
{
File dir = new File("d:\\java");
List<File> list=new ArrayList<File>();
fileToList(dir,list);
File file = new File(dir,"javalist.txt");
writeToFile(list,file.toString());
}
public static void fileToList(File dir,List<File>list)
{
File[] files = dir.listFiles();
for(File file : files)
{
if(file.isDirectory())
fileToList(file,list);
else
{
if(file.getName().endsWith(".java"))
list.add(file);
}
}
}
public static void writeToFile(List<File> list,String javaListFile)
{
BufferedWriter bufw = null;
try
{
bufw=new BufferedWriter(new FileWriter(javaListFile));
for(File f : list)
{
String path = f.getAbsolutePath();
bufw.write(path);
bufw.newLine();
bufw.flush();
}
}
catch (IOException e)
{
throw new RuntimeException("写入失败");
}
finally
{
try
{
if(bufw!=null)
bufw.close();
}
catch ( IOException e)
{
throw new RuntimeException("关闭写入缓冲区失败");
}
}
}
}
/*
删除一个带内容的目录。
删除原理:
在window中,删除目录是从里面往外删除的,
既然是从里往外删除米,就需要用到递归
*/
import java.io.*;
class RemoveDir3
{
public static void main(String[] args)
{
File dir= new File("d:\\shouji2");
removeDir(dir);
}
public static void removeDir(File dir)
{
File[] files=dir.listFiles();
for(int x =0; x<files.length; x++)
{
if (files[x].isDirectory())
removeDir(files[x]);
System.out.println(files[x].toString()+":-file-"+files[x].delete());
}
System.out.println(dir+"::dir::"+dir.delete());
}
}
Properties类
1 Properties类
/*Properties 是hashtable的子类。
也就是说它具备map集合的特点。而且它里面存储的键值对都是字符串。
是集合中和IO技术相结合的集合容器
该对象的特点:可以用于键值对形式的配置文件。
那么加载数据时。需要数据有固定的格式:键=值。
练习:
用于记录应用程序运行次数。
如果使用次数已到,那么给出注册提示。
很容易想到的是:计数器。
可是该计数器定义在程序中,随着程序的运行而在内存中存在,并运行自增。
可是随着该应用程序的退出,该计数器也在内存中消失了。
下一次在启动该程序,又重新开始从0计数。
这样不是我们想要的。
程序即使结束,该计数器的值也存在。
下次程序启动在会先加载该计数器的值并加1后在重新存储起来。
所以要建立一个配置文件。用于记录该软件的使用次数。
*/
import java.io.*;
import java.util.*;
class RunCount4
{
public static void main(String[] args) throws IOException
{
Properties prop=new Properties();
File file=new File("count.ini");
if(!file.exists())
file.createNewFile();
FileInputStream fis=new FileInputStream(file);
prop.load(fis);//从输入流中读取属性列表(键和元素对)。
int count = 0;
String value = prop.getProperty("time");// 用指定的键在此属性列表中搜索属性。
if(value!=null)
{
count = Integer.parseInt(value);//将字符串参数作为有符号的十进制整数进行解析。
if(count>=5)
{
System.out.println("你好使用次数已到");
return;
}
}
count++;
prop.setProperty("time",count+"");
FileOutputStream fos=new FileOutputStream(file);
prop.store(fos,"");//把信息写入流中
fos.close();
fis.close();
}
}
图片的切割与合并
import java.io.*;
import java.util.*;
class SplistFile4
{
public static void main(String[] args) throws IOException
{
merge();
}
public static void merge()throws IOException
{
ArrayList<FileInputStream> al=new ArrayList<FileInputStream>();
for(int x=1;x<5;x++)
{
al.add(new FileInputStream("c:\\"+x+".part"));
}
final Iterator <FileInputStream> it=al.iterator();
Enumeration<FileInputStream> en = new Enumeration<FileInputStream>()
/*实现 Enumeration 接口的对象,它生成一系列元素,一次生成一个。连续调用 nextElement 方法将返回一系列的连续元素。
例如,要输出 Vector<E> v 的所有元素,可使用以下方法:
for (Enumeration<E> e = v.elements(); e.hasMoreElements();)
System.out.println(e.nextElement());
*//
{
public boolean hasMoreElements()
{
return it.hasNext();
}
public FileInputStream nextElement()
{
return it.next();
}
};
SequenceInputStream sis= new SequenceInputStream(en);
/*SequenceInputStream 表示其他输入流的逻辑串联。它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止。
SequenceInputStream(Enumeration<? extends InputStream> e)
通过记住参数来初始化新创建的 SequenceInputStream,该参数必须是生成运行时类型为 InputStream 对象的 Enumeration 型参数。
*//
FileOutputStream fos=new FileOutputStream("c:\\5.jpg");
byte[] buf=new byte[1024];
int len=0;
while((len=sis.read(buf))!=-1)
{
fos.write(buf,0,len);
}
fos.close();
sis.close();
}
public static void splistFile()throws IOException
{
FileInputStream fis = new FileInputStream ("c:\\10.jpg");
FileOutputStream fos=null;
byte[] buf=new byte[1024*1024];
int len = 0;
int count=1;
while((len=fis.read(buf))!=-1)
{
fos=new FileOutputStream("c:\\"+(count++)+".part");
fos.write(buf,0,len);
fos.close();
}
fis.close();
}
}