- 浏览: 16592 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-94dc-b5cebca12fcb.jpg[/img]
I/O:站在程序的角度看流!(程序员)
1.流:完成当前程序和外设(网络,文件,其他程序)之间的数据交换
我们可以认为在外设(网络,文件,其他程序)上面有两个管道,这两个管道可用于程序和外设之间的数据交换
2.流的分类:
按照流的流向:
如上图:所有编号为奇数的流都是可以把外设中的数据输入到程序中,我们称为输入流
所有编号为偶数的流都是可以把程序中的数据输出到外设中,我们称之为输出流
按照流所处理的数据类型:字节流和字符流;
只能用于处理(读取/写入)字节流---我们称之为字节流
只能用于处理(读取/写入)字符(Unicode码)的流—我们称之为字符流
按照处理方式:节点流(低级流)和处理流(高级流)
从外设转换直接获取的流都是节点流;
对节点流进行封装,对其处理数据的方式进行改变,这个封装后的流我们称为处理流;
3.Input/OutStream流的子类方法:
//控制台输出
InputStream is=System.in;
InputStreamReader isr=new InputStreamReader(is);
BufferedReader br=new BufferedReader(isr);
System.out.println("请输出源文件目录:");
String s=br.readLine();
System.out.println("请输出目标文件目录:");
String s1=br.readLine();
FileIn/OutputStream:
FileOutputStream fos=new FileOutputStream(f);
// byte[] b="gjsajsahdk".getBytes();
// fos.write(b);
//int read():c从此输入流中读取一个字节
//如果读取到了字节则返回字节的ascii码,如果达到流的末尾(没有读取到数据)返回-1
//
FileInputStream fis=new FileInputStream(f);
//int read[byte[] b] :从流中读取数据,将读取到的数据存放到字节数组中
//如果字节数组的长度大于等于文件中字节个数,会一次性的将文件中的数据全部读取
//如果字节数组的长度小于文件中字节的个数,那么每一次读取都会将数组装满
//如果读取到了数据,则返回读取到得字节个数
//如果已经到达文件末尾则返回-1
//int read[byte[] b,int off,int len)
//从此输入流中将最多len个字节的数据读入一个byte数组中,从索引off开始存放
byte[] bu=new byte[20];
fis.read(bu, 3, 5);//通过fis从文件中读取到5个字符,放在bu中从索引为3的元素开始存放
System.out.write(bu);
//定义一个字节数组存放从流中读取到得文件中的数据
//通过流调用read()方法,将文件中的数据读取到数组中
// byte[] b=new byte[20];
// int j=fis.read(b);
// System.out.write(b,0,j);
// byte[] b=new byte[2];
// int i;
// while((i=fis.read(b))!=-1){
// String s=new String(b,0,i);
// System.out.println(s);
// System.out.write(b, 0, i);
// }
****************************************************************
FileInputStream fis=new FileInputStream(f);
byte[] b=new byte[2];
//流在当前位置还可以向读取到得字节数
int m=fis.available();
System.out.println(m);
int i=fis.read(b);
System.out.write(b);
//让文件指针向前/向后跳动指定字节数
fis.skip(-1);
System.out.println();
m=fis.available();
System.out.println(m);
i=fis.read(b);
System.out.write(b);
FilterIn/OutputStream(高级流):
子类---DataInputStream
//DataOutputStream :可以将程序中不同类型的数据写入到文件中
//DataInputStream 可以从数据源(外设)读入带有数据类型的数据(前提:外设存在带有数据类型的数据)
try {
//通过fos可以将数据写入文件
//通过dos也可以将数据写到文件,并且dos可以将带有类型的数据写到文件
FileOutputStream fos = new FileOutputStream("D:/t.txt");
DataOutputStream dos=new DataOutputStream(fos);
dos.writeInt(123);
dos.writeBoolean(false);
dos.writeDouble(3.141592653);
dos.flush();
//对数据库流来说先关低级流,再关高级流
//对本地文件流反之---压缩文件实例!
fos.close();
dos.close();
FileInputStream fis=new FileInputStream("D:/t.txt");
DataInputStream dis=new DataInputStream(fis);
boolean b=dis.readBoolean();
System.out.println(b);
int i=dis.readInt();
System.out.println(i);
// double d=dis.readDouble();
// System.out.println(d);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
BufferedIn/OutputStream类:
BufferedOutputStream:
byte[] b={97,98,99,100,101,102,103};
FileOutputStream fos=new FileOutputStream("D:/t.txt");
// fos.write(b);
//创建一个BufferedOutputStream对象--带有缓冲区的输出流
//当执行write方法时候把数据写入缓冲区,当执行flush方法时候才把数据写入文件中
//FileOutputStream可以直接把数据写入文件
BufferedOutputStream bos=new BufferedOutputStream(fos);
bos.write(b);
bos.flush();
LineNumberInputStream类:可以设置/获取当前的行号!
PrintStream类:
//对于低级输出流而言--只有最基本的write方法可以用来向外设写入数据
//参数类型比较单一(只能是字节,字节数组)
try {
FileOutputStream fos=new FileOutputStream("D:/hksadsa.txt");
// fos.write(97);
// fos.write("\r\n".getBytes());
// fos.write(98);
//PrintStream:
PrintStream ps=new PrintStream(fos,true);
ps.println("Long long ago");
ps.println("There is a shan and heshang");
ps.println("san name is xiaoxiong!");
ps.println("heshang's name is 石建雄!");
字符流-------------------------------------
//要读取文本文件我们必须创建一个流,指向文件
//如果要创建一个输入流指向文件,我们只能创建字节输入流
FileInputStream fis=new FileInputStream("D:/t.txt");
//针对文本文档,我们首选字符流来读取,但是我们只能创建文件的字节输入流
//所以我们要借助于InputStreamReader来将这个字节流转换成字符流
InputStreamReader isr=new InputStreamReader(fis);
// char[] c=new char[20];
// int len;
// while((len=isr.read(c))!=-1){
// for (int i = 0; i < len; i++) {
// System.out.print(c[i]);
// }
// }
//通过InputStreamReader对象进行读取,效率比较低,方法比较单一---所以我们要对其进行封装
//1.可以提高读取效率 2.扩展读取方法
BufferedReader br=new BufferedReader(isr);
//每次读取外设中的一行数据,赋值给str,如果没有读取到内容则str=null;
// String s=br.readLine();
// System.out.println(s);
String s=null;
while((s=br.readLine())!=null){
System.out.println(s);
}
特色流类:RandomAccessFile----------:
RandonAccessFile(字节):是一个文件流,可以用来自由的访问(读/写)文件
构造器:
RandonAccessFile raf = new RandonAccessFile(File 访问的文件,String 模式);
RandonAccessFile raf = new RandonAccessFile(String 访问文件的路径,String 模式);
模式可供选择的有4种:“r”,“rw”,“rws”,“rwd”
如果模式指定为“r”:表示这个流只能用来读取文件内容
如果模式指定为“rw”:表示这个流既能将文件内容读入到程序,也能将程序中的数据写入到文件中
//构造器 参数 :"rw"-- r:可读 w:可写
RandomAccessFile raf=new RandomAccessFile("D:/t.txt","rwd");
// byte[] b="小熊你好色!".getBytes();
// raf.write(b);
//seek():将流的指针向前/后移动到相对文件开头后的n个字节处
// raf.seek(6);
// raf.seek(8);
// int j=raf.read();
// System.out.println(j);
String s="hhhhahha";
//length():返回对应文件的长度(字节数)
long i=raf.length();
raf.seek(6);
raf.writeBytes(s);
// System.out.println(i);
raf.close();
流的一般操作:
[img]http://dl.iteye.com/upload/attachment/0074/9909/dfc0d966-bb1a-3c11
压缩文件实例:
压缩与解压文件---ZipOutputStream ZipInputStream
public class TestZipSingleFile {
public static void main(String[] args) {
try {
//将D:/鱼鱼鱼.mp3压缩
//1,找到源文件
String srcPath = "D:/abc.mp3";
//2,根据源文件的名字生成压缩文件的名字
int i = srcPath.lastIndexOf(".");
String zipPath = srcPath.substring(0,i)+".zip";
//3,创建一个输入流指向源文件,因为我们要读取源文件的内容
FileInputStream fis = new FileInputStream(srcPath);
//4,创建一个输出流指向压缩文件,因为我们要把读取到得源文件的数据写到压缩文件
FileOutputStream fos = new FileOutputStream(zipPath);
ZipOutputStream zos = new ZipOutputStream(fos);
//5,创建一个房间(压缩条目)
File f = new File(srcPath);
//条目的名字要和源文件的名字一致
ZipEntry ze = new ZipEntry(f.getName());
zos.putNextEntry(ze);
//6,通过fis读取源文件,通过zos将读取到得内容写到压缩文件中对应的条目
byte[] b = new byte[500];
int len = -1;
while((len = fis.read(b))!=-1){
zos.write(b, 0, len);
}
zos.close();
fos.close();
fis.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class UnZip {
/**
* 将指定的压缩文件,解压到C盘
* @param zipPath
*/
public void unZipFile(String zipPath){
try {
FileInputStream fis = new FileInputStream(zipPath);
ZipInputStream zis = new ZipInputStream(fis);
ZipEntry ze = null;
while((ze=zis.getNextEntry())!=null){
String zeName = ze.getName();
String saveFile = "c:/"+zeName;
//保存当前文件,目录要存在
int n = saveFile.lastIndexOf("\\");
String dirPath = saveFile.substring(0,n);
File dir = new File(dirPath);
dir.mkdirs();
//通过zis读取到当前条目的数据,然后写到对用saveFile
FileOutputStream fos = new FileOutputStream(saveFile);
byte[] b = new byte[1000];
int len = -1;
while((len = zis.read(b))!=-1){
fos.write(b,0,len);
}
fos.close();
zis.closeEntry();
}
zis.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
String zipPath = "D:/Java/jdk1.6.0_02.zip";
new UnZip().unZipFile(zipPath);
}
}
public class TestZipDirectory{
/**
* 遍历文件夹
* @throws IOException
*/
public void bianLi(File f,ZipOutputStream zos,int index) throws IOException{
if(f.isFile()){
FileInputStream fis = new FileInputStream(f);
//为当前子文件创建条目:从第一级父目录开始
//截取当前子文件的条目路径
String zePath = f.getAbsolutePath().substring(index+1);
ZipEntry ze = new ZipEntry(zePath);
zos.putNextEntry(ze);
byte[] b = new byte[500];
int len = -1;
while((len = fis.read(b))!=-1){
zos.write(b, 0, len);
}
zos.closeEntry();
fis.close();
}else{
//不是文件则代表是目录,我们就要去到目录中所有的子文件
File[] files = f.listFiles();
for (int i = 0; i < files.length; i++) {
File file = files[i];
bianLi(file,zos,index);
}
}
}
public static void main(String[] args) {
try {
File dir = new File("D:/Java/jdk1.6.0_02");
String srcPath = dir.getAbsolutePath();
int index = srcPath.lastIndexOf("\\");
System.out.println(index);
String zipPath = srcPath+".zip";
//创建一个zos流指向压缩文件
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipPath));
new TestZipDirectory().bianLi(dir,zos,index);
zos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
对象序列化:-------------------
1, 对象序列化:将对象通过输出流保存到磁盘(文件)/网络
① 对象序列化的目的?
A> 将对象存放到磁盘中实现持久化(永久保存)
B> 将对象在网络中传输,实现信息交换
② 什么样的对象可以被序列化?
A> 这个对象所在的类实现了Serializable接口
B> 这个对象所在的类实现了Externalizable接口
③ 怎么样实现对象序列化?
借助于ObjectOutputStream(高级流),需要对低级流进行封装
public final void writeObject(Object obj)
④ 对象中的哪些元素可以被序列化?
对象类名和属性可以被序列,但是被static或者transient修饰的属性不能被
实例:
public class Person implements Serializable {
//一个类中如果实现Serializable接口,我们认为该类的对象可以被序列化
//但是如果该类可以被序列化的属性中有对象类型,那么这个对象的类也必须实现序列化接口
private String pname = "person";
//如果想保留对象的某个属性不被序列化,可以用transient修饰这个属性
//transient修饰的属性不会被序列化
transient String psex = "女";
protected int page = 22;
public String pinfo = "我真的是一个人";
public Student s = new Student();
}
*******************************************************************************
public class Person implements Serializable {
//一个类中如果实现Serializable接口,我们认为该类的对象可以被序列化
//但是如果该类可以被序列化的属性中有对象类型,那么这个对象的类也必须实现序列化接口
private String pname = "person";
//如果想保留对象的某个属性不被序列化,可以用transient修饰这个属性
//transient修饰的属性不会被序列化
transient String psex = "女";
protected int page = 22;
public String pinfo = "我真的是一个人";
public Student s = new Student();
}
public class TestObjectInputStream {
public static void main(String[] args) {
try {
FileInputStream fis = new FileInputStream("D:/obj.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
while(1==1){
Object obj = ois.readObject();
if(obj instanceof Person){
Person p = (Person) obj;
System.out.println(p.psex);
System.out.println(p.page);
System.out.println(p.pinfo);
}else if(obj instanceof Student){
Student s = (Student) obj;
}
}
} catch (Exception e) {
System.out.println("对象读取结束!");
}
}
}
public class TestObjectOutputStream {
public static void main(String[] args) {
try {
Person p = new Person();
Student s = new Student();
String path = "D:/obj.txt";
FileOutputStream fos = new FileOutputStream(path);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(p);
//oos.writeObject(s);
oos.flush();
oos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
小结
回顾:
流的定义:我们可以认为在所有的外设(文件、网络、其他程序)中都有两个“管道”,如果我们的程序想要和某个外设之间进行数据交换,那么我们的程序就要获得这两个“管道”。
流的分类:
按照流的方向:输入流和输出流
输入流:外设中的数据进入到程序中
输出流:程序中的数据写入到外设中
按照流处理的数据类型:字节流和字符流
字节流:只能处理字节类型数据的流
字符流:只能处理字符类型数据的流
按照流的处理方式:节点流(低级流)和处理流(高级流)
低级流:从外设中直接获取的流
高级流:由于低级流处理数据方式单一,使用起来就不够灵活,我们可以对低级流进行封装,封转之后的流我们称之为高级流。
字节输入流:InputStream
低级字节输入流:
•ByteArrayInputStream(以数组作为外设,可以将一个字节数组中的数据输入到程序中)
•FileInputStream(以文件作为外设,可以将各种类型文件的数据输入到程序中)
•StringBufferedInputStream(以字符串作为外设,可以将字符串中的数据读出来)
//InputStream is = net.getInputStream();
高级字节输入流:
•DataInputStream:可以读取带有数据类型的数据
•BufferedInputStream:提供了一个缓冲区,读取效率更高
•LineNumberInputStream:可以添加行标记实现对应行的读取
•ObjectInputStream:可以将一个对象保存到低级流指向的地方(对象序列化)
字节输出流:OutputStream
低级字节输出流:
•ByteArrayOutputStream(以数组作为外设,可以将程序中的数据写到数组中)
•FileOutputStream(以文件作为外设,可以将程序中的数据写入到文件中)
高级字节输出流:
•DataOutputStream:可以将带有类型的数据写到文件中
•BufferedOutputStream:提供了一个缓冲区,可以提供写入的效率(调用flush()方法)
•PrintStream: 扩展了很多方法(print(),println()…)
字符输入流:Reader
低级字符输入流:
•CharArrayReader:(将一个字符数组作为外设,可以将字符数组中的数据读到程序中)
•StringReader:(将字符串作为外设,可以将一个字符串的内容读取出来)
•FileReader:(继承了InputStreamReader,将文件作为外设,通常我们获取到得文件流都是字节流)
高级字符输入流:
•InputStreamReader 是字节流通向字符流的桥梁
•BufferedReader:带有缓冲区的字符输入流
•FilterReader
字符输出流:Writer
低级字符输出流:
•CharArrayWriter
•StringWriter
•FileWriter(继承OutputStreamWriter,以文件作为外设)
高级字符输出流:
•OutputStreamWriter:将字节输出流转换成字符输出流
•BufferedWriter:带有缓冲区的字符输出流
•FilterWriter
•PrintWriter:扩展了print/println(),更方便我们的输出操作
I/O:站在程序的角度看流!(程序员)
1.流:完成当前程序和外设(网络,文件,其他程序)之间的数据交换
我们可以认为在外设(网络,文件,其他程序)上面有两个管道,这两个管道可用于程序和外设之间的数据交换
2.流的分类:
按照流的流向:
如上图:所有编号为奇数的流都是可以把外设中的数据输入到程序中,我们称为输入流
所有编号为偶数的流都是可以把程序中的数据输出到外设中,我们称之为输出流
按照流所处理的数据类型:字节流和字符流;
只能用于处理(读取/写入)字节流---我们称之为字节流
只能用于处理(读取/写入)字符(Unicode码)的流—我们称之为字符流
按照处理方式:节点流(低级流)和处理流(高级流)
从外设转换直接获取的流都是节点流;
对节点流进行封装,对其处理数据的方式进行改变,这个封装后的流我们称为处理流;
3.Input/OutStream流的子类方法:
//控制台输出
InputStream is=System.in;
InputStreamReader isr=new InputStreamReader(is);
BufferedReader br=new BufferedReader(isr);
System.out.println("请输出源文件目录:");
String s=br.readLine();
System.out.println("请输出目标文件目录:");
String s1=br.readLine();
FileIn/OutputStream:
FileOutputStream fos=new FileOutputStream(f);
// byte[] b="gjsajsahdk".getBytes();
// fos.write(b);
//int read():c从此输入流中读取一个字节
//如果读取到了字节则返回字节的ascii码,如果达到流的末尾(没有读取到数据)返回-1
//
FileInputStream fis=new FileInputStream(f);
//int read[byte[] b] :从流中读取数据,将读取到的数据存放到字节数组中
//如果字节数组的长度大于等于文件中字节个数,会一次性的将文件中的数据全部读取
//如果字节数组的长度小于文件中字节的个数,那么每一次读取都会将数组装满
//如果读取到了数据,则返回读取到得字节个数
//如果已经到达文件末尾则返回-1
//int read[byte[] b,int off,int len)
//从此输入流中将最多len个字节的数据读入一个byte数组中,从索引off开始存放
byte[] bu=new byte[20];
fis.read(bu, 3, 5);//通过fis从文件中读取到5个字符,放在bu中从索引为3的元素开始存放
System.out.write(bu);
//定义一个字节数组存放从流中读取到得文件中的数据
//通过流调用read()方法,将文件中的数据读取到数组中
// byte[] b=new byte[20];
// int j=fis.read(b);
// System.out.write(b,0,j);
// byte[] b=new byte[2];
// int i;
// while((i=fis.read(b))!=-1){
// String s=new String(b,0,i);
// System.out.println(s);
// System.out.write(b, 0, i);
// }
****************************************************************
FileInputStream fis=new FileInputStream(f);
byte[] b=new byte[2];
//流在当前位置还可以向读取到得字节数
int m=fis.available();
System.out.println(m);
int i=fis.read(b);
System.out.write(b);
//让文件指针向前/向后跳动指定字节数
fis.skip(-1);
System.out.println();
m=fis.available();
System.out.println(m);
i=fis.read(b);
System.out.write(b);
FilterIn/OutputStream(高级流):
子类---DataInputStream
//DataOutputStream :可以将程序中不同类型的数据写入到文件中
//DataInputStream 可以从数据源(外设)读入带有数据类型的数据(前提:外设存在带有数据类型的数据)
try {
//通过fos可以将数据写入文件
//通过dos也可以将数据写到文件,并且dos可以将带有类型的数据写到文件
FileOutputStream fos = new FileOutputStream("D:/t.txt");
DataOutputStream dos=new DataOutputStream(fos);
dos.writeInt(123);
dos.writeBoolean(false);
dos.writeDouble(3.141592653);
dos.flush();
//对数据库流来说先关低级流,再关高级流
//对本地文件流反之---压缩文件实例!
fos.close();
dos.close();
FileInputStream fis=new FileInputStream("D:/t.txt");
DataInputStream dis=new DataInputStream(fis);
boolean b=dis.readBoolean();
System.out.println(b);
int i=dis.readInt();
System.out.println(i);
// double d=dis.readDouble();
// System.out.println(d);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
BufferedIn/OutputStream类:
BufferedOutputStream:
byte[] b={97,98,99,100,101,102,103};
FileOutputStream fos=new FileOutputStream("D:/t.txt");
// fos.write(b);
//创建一个BufferedOutputStream对象--带有缓冲区的输出流
//当执行write方法时候把数据写入缓冲区,当执行flush方法时候才把数据写入文件中
//FileOutputStream可以直接把数据写入文件
BufferedOutputStream bos=new BufferedOutputStream(fos);
bos.write(b);
bos.flush();
LineNumberInputStream类:可以设置/获取当前的行号!
PrintStream类:
//对于低级输出流而言--只有最基本的write方法可以用来向外设写入数据
//参数类型比较单一(只能是字节,字节数组)
try {
FileOutputStream fos=new FileOutputStream("D:/hksadsa.txt");
// fos.write(97);
// fos.write("\r\n".getBytes());
// fos.write(98);
//PrintStream:
PrintStream ps=new PrintStream(fos,true);
ps.println("Long long ago");
ps.println("There is a shan and heshang");
ps.println("san name is xiaoxiong!");
ps.println("heshang's name is 石建雄!");
字符流-------------------------------------
//要读取文本文件我们必须创建一个流,指向文件
//如果要创建一个输入流指向文件,我们只能创建字节输入流
FileInputStream fis=new FileInputStream("D:/t.txt");
//针对文本文档,我们首选字符流来读取,但是我们只能创建文件的字节输入流
//所以我们要借助于InputStreamReader来将这个字节流转换成字符流
InputStreamReader isr=new InputStreamReader(fis);
// char[] c=new char[20];
// int len;
// while((len=isr.read(c))!=-1){
// for (int i = 0; i < len; i++) {
// System.out.print(c[i]);
// }
// }
//通过InputStreamReader对象进行读取,效率比较低,方法比较单一---所以我们要对其进行封装
//1.可以提高读取效率 2.扩展读取方法
BufferedReader br=new BufferedReader(isr);
//每次读取外设中的一行数据,赋值给str,如果没有读取到内容则str=null;
// String s=br.readLine();
// System.out.println(s);
String s=null;
while((s=br.readLine())!=null){
System.out.println(s);
}
特色流类:RandomAccessFile----------:
RandonAccessFile(字节):是一个文件流,可以用来自由的访问(读/写)文件
构造器:
RandonAccessFile raf = new RandonAccessFile(File 访问的文件,String 模式);
RandonAccessFile raf = new RandonAccessFile(String 访问文件的路径,String 模式);
模式可供选择的有4种:“r”,“rw”,“rws”,“rwd”
如果模式指定为“r”:表示这个流只能用来读取文件内容
如果模式指定为“rw”:表示这个流既能将文件内容读入到程序,也能将程序中的数据写入到文件中
//构造器 参数 :"rw"-- r:可读 w:可写
RandomAccessFile raf=new RandomAccessFile("D:/t.txt","rwd");
// byte[] b="小熊你好色!".getBytes();
// raf.write(b);
//seek():将流的指针向前/后移动到相对文件开头后的n个字节处
// raf.seek(6);
// raf.seek(8);
// int j=raf.read();
// System.out.println(j);
String s="hhhhahha";
//length():返回对应文件的长度(字节数)
long i=raf.length();
raf.seek(6);
raf.writeBytes(s);
// System.out.println(i);
raf.close();
流的一般操作:
[img]http://dl.iteye.com/upload/attachment/0074/9909/dfc0d966-bb1a-3c11
压缩文件实例:
压缩与解压文件---ZipOutputStream ZipInputStream
public class TestZipSingleFile {
public static void main(String[] args) {
try {
//将D:/鱼鱼鱼.mp3压缩
//1,找到源文件
String srcPath = "D:/abc.mp3";
//2,根据源文件的名字生成压缩文件的名字
int i = srcPath.lastIndexOf(".");
String zipPath = srcPath.substring(0,i)+".zip";
//3,创建一个输入流指向源文件,因为我们要读取源文件的内容
FileInputStream fis = new FileInputStream(srcPath);
//4,创建一个输出流指向压缩文件,因为我们要把读取到得源文件的数据写到压缩文件
FileOutputStream fos = new FileOutputStream(zipPath);
ZipOutputStream zos = new ZipOutputStream(fos);
//5,创建一个房间(压缩条目)
File f = new File(srcPath);
//条目的名字要和源文件的名字一致
ZipEntry ze = new ZipEntry(f.getName());
zos.putNextEntry(ze);
//6,通过fis读取源文件,通过zos将读取到得内容写到压缩文件中对应的条目
byte[] b = new byte[500];
int len = -1;
while((len = fis.read(b))!=-1){
zos.write(b, 0, len);
}
zos.close();
fos.close();
fis.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class UnZip {
/**
* 将指定的压缩文件,解压到C盘
* @param zipPath
*/
public void unZipFile(String zipPath){
try {
FileInputStream fis = new FileInputStream(zipPath);
ZipInputStream zis = new ZipInputStream(fis);
ZipEntry ze = null;
while((ze=zis.getNextEntry())!=null){
String zeName = ze.getName();
String saveFile = "c:/"+zeName;
//保存当前文件,目录要存在
int n = saveFile.lastIndexOf("\\");
String dirPath = saveFile.substring(0,n);
File dir = new File(dirPath);
dir.mkdirs();
//通过zis读取到当前条目的数据,然后写到对用saveFile
FileOutputStream fos = new FileOutputStream(saveFile);
byte[] b = new byte[1000];
int len = -1;
while((len = zis.read(b))!=-1){
fos.write(b,0,len);
}
fos.close();
zis.closeEntry();
}
zis.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
String zipPath = "D:/Java/jdk1.6.0_02.zip";
new UnZip().unZipFile(zipPath);
}
}
public class TestZipDirectory{
/**
* 遍历文件夹
* @throws IOException
*/
public void bianLi(File f,ZipOutputStream zos,int index) throws IOException{
if(f.isFile()){
FileInputStream fis = new FileInputStream(f);
//为当前子文件创建条目:从第一级父目录开始
//截取当前子文件的条目路径
String zePath = f.getAbsolutePath().substring(index+1);
ZipEntry ze = new ZipEntry(zePath);
zos.putNextEntry(ze);
byte[] b = new byte[500];
int len = -1;
while((len = fis.read(b))!=-1){
zos.write(b, 0, len);
}
zos.closeEntry();
fis.close();
}else{
//不是文件则代表是目录,我们就要去到目录中所有的子文件
File[] files = f.listFiles();
for (int i = 0; i < files.length; i++) {
File file = files[i];
bianLi(file,zos,index);
}
}
}
public static void main(String[] args) {
try {
File dir = new File("D:/Java/jdk1.6.0_02");
String srcPath = dir.getAbsolutePath();
int index = srcPath.lastIndexOf("\\");
System.out.println(index);
String zipPath = srcPath+".zip";
//创建一个zos流指向压缩文件
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipPath));
new TestZipDirectory().bianLi(dir,zos,index);
zos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
对象序列化:-------------------
1, 对象序列化:将对象通过输出流保存到磁盘(文件)/网络
① 对象序列化的目的?
A> 将对象存放到磁盘中实现持久化(永久保存)
B> 将对象在网络中传输,实现信息交换
② 什么样的对象可以被序列化?
A> 这个对象所在的类实现了Serializable接口
B> 这个对象所在的类实现了Externalizable接口
③ 怎么样实现对象序列化?
借助于ObjectOutputStream(高级流),需要对低级流进行封装
public final void writeObject(Object obj)
④ 对象中的哪些元素可以被序列化?
对象类名和属性可以被序列,但是被static或者transient修饰的属性不能被
实例:
public class Person implements Serializable {
//一个类中如果实现Serializable接口,我们认为该类的对象可以被序列化
//但是如果该类可以被序列化的属性中有对象类型,那么这个对象的类也必须实现序列化接口
private String pname = "person";
//如果想保留对象的某个属性不被序列化,可以用transient修饰这个属性
//transient修饰的属性不会被序列化
transient String psex = "女";
protected int page = 22;
public String pinfo = "我真的是一个人";
public Student s = new Student();
}
*******************************************************************************
public class Person implements Serializable {
//一个类中如果实现Serializable接口,我们认为该类的对象可以被序列化
//但是如果该类可以被序列化的属性中有对象类型,那么这个对象的类也必须实现序列化接口
private String pname = "person";
//如果想保留对象的某个属性不被序列化,可以用transient修饰这个属性
//transient修饰的属性不会被序列化
transient String psex = "女";
protected int page = 22;
public String pinfo = "我真的是一个人";
public Student s = new Student();
}
public class TestObjectInputStream {
public static void main(String[] args) {
try {
FileInputStream fis = new FileInputStream("D:/obj.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
while(1==1){
Object obj = ois.readObject();
if(obj instanceof Person){
Person p = (Person) obj;
System.out.println(p.psex);
System.out.println(p.page);
System.out.println(p.pinfo);
}else if(obj instanceof Student){
Student s = (Student) obj;
}
}
} catch (Exception e) {
System.out.println("对象读取结束!");
}
}
}
public class TestObjectOutputStream {
public static void main(String[] args) {
try {
Person p = new Person();
Student s = new Student();
String path = "D:/obj.txt";
FileOutputStream fos = new FileOutputStream(path);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(p);
//oos.writeObject(s);
oos.flush();
oos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
小结
回顾:
流的定义:我们可以认为在所有的外设(文件、网络、其他程序)中都有两个“管道”,如果我们的程序想要和某个外设之间进行数据交换,那么我们的程序就要获得这两个“管道”。
流的分类:
按照流的方向:输入流和输出流
输入流:外设中的数据进入到程序中
输出流:程序中的数据写入到外设中
按照流处理的数据类型:字节流和字符流
字节流:只能处理字节类型数据的流
字符流:只能处理字符类型数据的流
按照流的处理方式:节点流(低级流)和处理流(高级流)
低级流:从外设中直接获取的流
高级流:由于低级流处理数据方式单一,使用起来就不够灵活,我们可以对低级流进行封装,封转之后的流我们称之为高级流。
字节输入流:InputStream
低级字节输入流:
•ByteArrayInputStream(以数组作为外设,可以将一个字节数组中的数据输入到程序中)
•FileInputStream(以文件作为外设,可以将各种类型文件的数据输入到程序中)
•StringBufferedInputStream(以字符串作为外设,可以将字符串中的数据读出来)
//InputStream is = net.getInputStream();
高级字节输入流:
•DataInputStream:可以读取带有数据类型的数据
•BufferedInputStream:提供了一个缓冲区,读取效率更高
•LineNumberInputStream:可以添加行标记实现对应行的读取
•ObjectInputStream:可以将一个对象保存到低级流指向的地方(对象序列化)
字节输出流:OutputStream
低级字节输出流:
•ByteArrayOutputStream(以数组作为外设,可以将程序中的数据写到数组中)
•FileOutputStream(以文件作为外设,可以将程序中的数据写入到文件中)
高级字节输出流:
•DataOutputStream:可以将带有类型的数据写到文件中
•BufferedOutputStream:提供了一个缓冲区,可以提供写入的效率(调用flush()方法)
•PrintStream: 扩展了很多方法(print(),println()…)
字符输入流:Reader
低级字符输入流:
•CharArrayReader:(将一个字符数组作为外设,可以将字符数组中的数据读到程序中)
•StringReader:(将字符串作为外设,可以将一个字符串的内容读取出来)
•FileReader:(继承了InputStreamReader,将文件作为外设,通常我们获取到得文件流都是字节流)
高级字符输入流:
•InputStreamReader 是字节流通向字符流的桥梁
•BufferedReader:带有缓冲区的字符输入流
•FilterReader
字符输出流:Writer
低级字符输出流:
•CharArrayWriter
•StringWriter
•FileWriter(继承OutputStreamWriter,以文件作为外设)
高级字符输出流:
•OutputStreamWriter:将字节输出流转换成字符输出流
•BufferedWriter:带有缓冲区的字符输出流
•FilterWriter
•PrintWriter:扩展了print/println(),更方便我们的输出操作
相关推荐
java-IO流 commons-io-2.11.0.jar
Java的IO流是Java编程语言中的重要组成部分,它主要用于数据的输入和输出操作。在Java中,IO流被设计为处理任何类型的数据,包括字符、字节甚至对象。本练习旨在帮助初学者理解和掌握Java IO流的基础知识。 一、IO...
java-IO流 commons-io and hutool
Java IO流是Java编程语言中一个非常重要的概念,它提供了数据传输的能力,使得程序能够读取和写入数据到各种输入/输出设备,如硬盘、内存、网络等。本资源包含的是Java-IO流的基础例题、源码及PPT教学文档,适合初学...
### 文档JAVA-IO流 #### 一、IO流概述 1. **什么是IO** - I代表**输入**(input),O代表**输出**(output)。在Java中,所有负责输入输出的类都位于`java.io`包内。这些类主要用于进行数据的输入输出操作。 2. **流...
JAVA-IO流基础
JAVA-IO流学习总结.docx
Java IO流是Java编程语言中处理输入和输出的重要机制,它是Java平台的核心特性之一,用于在不同设备之间传输数据,如硬盘、内存、网络等。本资料包“Java-IO流高级-例题 & 例题源码 & PPT教学文档(黑马程序员详细版...
Java面向对象程序设计第08章_Java-IO流 Java 中的输入输出流(IO)是计算机输出 / 输入的接口。Java 的核心库 java.io 提供了全面的 IO 接口,包括文件读写、标准设备输出等等。Java 中的 IO 是以流为基础进行输入...
主要做了对JAVA-IO流主要类的操作demo,包括了对TXT文件的操作,主要是对博客http://blog.csdn.net/yczz/article/details/38761237的代码重现,方便阅读,供以后开发参考。
Java IO流-文件流 Java IO流是Java语言中用于输入/输出操作的基本组件,它提供了多种方式来读取和写入数据,包括文件、网络、内存等。IO流体系可以分为两大类:字节流和字符流。 字节流 字节流是最基本的IO流,...
Java IO 流学习总结的主要内容是对 Java 语言中 IO 流的机制和应用进行了详细的介绍,包括流的基本概念、字节流和字符流的区别、IO 体系的基本结构、FileReader 和 FileWriter 的使用、IO 流的应用等等。
Java的IO流与Stream流是Java程序中处理输入输出的核心技术。IO流主要分为字节流和字符流,这两种流分别处理二进制数据(如图片、音频等)和文本数据(如ASCII、UTF-8编码的文本)。下面将详细阐述这两个流的分类、...
Java的IO流是Java平台核心特性之一,用于处理程序中的数据输入和输出。在Java中,流被定义为一组有序的数据序列,可以是字节流或字符流。字节流处理的数据最小单位是字节,而字符流处理的是Unicode字符。 Java I/O...
Java的IO流是Java编程中用于处理输入输出操作的核心机制。在Java中,流是一组有序的数据序列,可以是字节或字符,用于在不同数据源之间传输数据。流主要分为两大类:输入流(Input Stream)和输出流(Output Stream...
这是Java中IO流的相关知识,针对初学者可以学习IO流的特点与知识
Java IO流是Java平台中处理输入输出操作的重要组成部分,它允许程序与外部设备(如硬盘、网络、内存等)进行数据传输。Java IO流分为两大类:字节流(Byte Stream)和字符流(Character Stream)。本文将详细介绍...
《Java IO流详解与commons-io-1.4.jar库的应用》 在Java编程语言中,IO(Input/Output)流是一组用于数据传输的类,它们允许程序读取和写入数据,无论是从磁盘、网络还是其他输入输出设备。Java的IO流系统是一个...
JAVA-IO-流操作-语法/优化