JAVA IO

来源:互联网 发布:微信 淘客 软件 编辑:程序博客网 时间:2024/04/28 08:22

流的概念和作用

学习Java IO,不得不提到的就是JavaIO流。

流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。

IO流的分类

根据处理数据类型的不同分为:字符流和字节流

根据数据流向不同分为:输入流和输出流

字符流和字节流

字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查了指定的码表。字节流和字符流的区别:

(1)读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。

(2)处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。

(3)字节流在操作的时候本身是不会用到缓冲区的,是文件本身的直接操作的;而字符流在操作的时候下后是会用到缓冲区的,是通过缓冲区来操作文件,我们将在下面验证这一点。

结论:优先选用字节流。首先因为硬盘上的所有文件都是以字节的形式进行传输或者保存的,包括图片等内容。但是字符只是在内存中才会形成的,所以在开发中,字节流使用广泛。

输入流和输出流

对输入流只能进行读操作,对输出流只能进行写操作,程序中需要根据待传输数据的不同特性而使用不同的流。

Java流操作有关的类或接口:

加载中...

Java流类图结构:

<喎�"/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+IDxpbWcgc3JjPQ=="/uploadfile/Collfiles/20131204/20131203211221140.jpg" alt="\">


Java IO流对象

1. 输入字节流InputStream

定义和结构说明:

从输入字节流的继承图可以看出:

InputStream 是所有的输入字节流的父类,它是一个抽象类。

ByteArrayInputStream、StringBufferInputStream、FileInputStream 是三种基本的介质流,它们分别从Byte 数组、StringBuffer、和本地文件中读取数据。PipedInputStream 是从与其它线程共用的管道中读取数据,与Piped 相关的知识后续单独介绍。

ObjectInputStream 和所有FilterInputStream的子类都是装饰流(装饰器模式的主角)。意思是FileInputStream类可以通过一个String路径名创建一个对象,FileInputStream(String name)。而DataInputStream必须装饰一个类才能返回一个对象,DataInputStream(InputStream in)。如下图示:

加载中...


实例操作演示:

【案例 】读取文件内容

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
 * 字节流
 * 读文件内容
 * */
importjava.io.*;
classhello{
   publicstaticvoid main(String[] args) throwsIOException {
       String fileName="D:"+File.separator+"hello.txt";
       File f=newFile(fileName);
       InputStream in=newFileInputStream(f);
       byte[] b=newbyte[1024];
       in.read(b);
       in.close();
       System.out.println(newString(b));
    }
}

注意:该示例中由于b字节数组长度为1024,如果文件较小,则会有大量填充空格。我们可以利用in.read(b);的返回值来设计程序,如下案例:

【案例】读取文件内容

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
 * 字节流
 * 读文件内容
 * */
importjava.io.*;
classhello{
   publicstaticvoid main(String[] args) throwsIOException {
       String fileName="D:"+File.separator+"hello.txt";
       File f=newFile(fileName);
       InputStream in=newFileInputStream(f);
       byte[] b=newbyte[1024];
       intlen=in.read(b);
       in.close();
       System.out.println("读入长度为:"+len);
       System.out.println(newString(b,0,len));
    }
}

注意:观察上面的例子可以看出,我们预先申请了一个指定大小的空间,但是有时候这个空间可能太小,有时候可能太大,我们需要准确的大小,这样节省空间,那么我们可以这样做:

【案例】读取文件内容

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
 * 字节流
 * 读文件内容,节省空间
 * */
importjava.io.*;
classhello{
   publicstaticvoid main(String[] args) throwsIOException {
       String fileName="D:"+File.separator+"hello.txt";
       File f=newFile(fileName);
       InputStream in=newFileInputStream(f);
       byte[] b=newbyte[(int)f.length()];
       in.read(b);
       System.out.println("文件长度为:"+f.length());
       in.close();
       System.out.println(newString(b));
    }
}

【案例】逐字节读

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
 * 字节流
 * 读文件内容,节省空间
 * */
importjava.io.*;
classhello{
   publicstaticvoid main(String[] args) throwsIOException {
       String fileName="D:"+File.separator+"hello.txt";
       File f=newFile(fileName);
       InputStream in=newFileInputStream(f);
       byte[] b=newbyte[(int)f.length()];
       for(inti = 0; i < b.length; i++) {
           b[i]=(byte)in.read();
       }
       in.close();
       System.out.println(newString(b));
    }
}

注意:上面的几个例子都是在知道文件的内容多大,然后才展开的,有时候我们不知道文件有多大,这种情况下,我们需要判断是否独到文件的末尾。

【案例】字节流读取文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
 * 字节流
 *读文件
 * */
importjava.io.*;
classhello{
   publicstatic void main(String[] args) throwsIOException {
       String fileName="D:"+File.separator+"hello.txt";
       File f=newFile(fileName);
       InputStream in=newFileInputStream(f);
       byte[] b=newbyte[1024];
       intcount =0;
       inttemp=0;
       while((temp=in.read())!=(-1)){
           b[count++]=(byte)temp;
       }
       in.close();
       System.out.println(newString(b));
    }
}

注意:当读到文件末尾的时候会返回-1.正常情况下是不会返回-1的。

【案例】DataInputStream类

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
importjava.io.DataInputStream;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.IOException;
  
publicclass DataOutputStreamDemo{
   publicstatic void main(String[] args) throwsIOException{
       File file = newFile("d:"+ File.separator +"hello.txt");
       DataInputStream input = newDataInputStream(newFileInputStream(file));
       char[] ch = newchar[10];
       intcount = 0;
       chartemp;
       while((temp = input.readChar()) != 'C'){
           ch[count++] = temp;
       }
       System.out.println(ch);
    }
}

【案例】PushBackInputStream回退流操作

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
importjava.io.ByteArrayInputStream;
importjava.io.IOException;
importjava.io.PushbackInputStream;
  
/**
 * 回退流操作
 * */
publicclass PushBackInputStreamDemo{
    publicstatic void main(String[] args) throwsIOException{
       String str = "hello,rollenholt";
       PushbackInputStream push = null;
       ByteArrayInputStream bat = null;
       bat = newByteArrayInputStream(str.getBytes());
       push = newPushbackInputStream(bat);
       inttemp = 0;
       while((temp = push.read()) != -1){
           if(temp == ','){
                push.unread(temp);
                temp = push.read();
                System.out.print("(回退"+(char) temp + ") ");
           }else{
                System.out.print((char) temp);
           }
       }
    }
}

2. 输出字节流OutputStream

定义和结构说明:

IO 中输出字节流的继承图可见上图,可以看出:

OutputStream 是所有的输出字节流的父类,它是一个抽象类。

ByteArrayOutputStream、FileOutputStream是两种基本的介质流,它们分别向Byte 数组、和本地文件中写入数据。PipedOutputStream 是向与其它线程共用的管道中写入数据,

ObjectOutputStream 和所有FilterOutputStream的子类都是装饰流。具体例子跟InputStream是对应的。

实例操作演示:

【案例】向文件中写入字符串

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
 * 字节流
 * 向文件中写入字符串
 * */
importjava.io.*;
classhello{
   publicstatic void main(String[] args) throwsIOException {
       String fileName="D:"+File.separator+"hello.txt";
       File f=newFile(fileName);
       OutputStream out =newFileOutputStream(f);
       String str="Hello World";
       byte[] b=str.getBytes();
       out.write(b);
       out.close();
    }
}

你也可以一个字节一个字节的写入文件:

【案例】逐字节写入文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
 * 字节流
 * 向文件中一个字节一个字节的写入字符串
 * */
importjava.io.*;
classhello{
   publicstatic void main(String[] args) throwsIOException {
       String fileName="D:"+File.separator+"hello.txt";
       File f=newFile(fileName);
       OutputStream out =newFileOutputStream(f);
       String str="Hello World!!";
       byte[] b=str.getBytes();
       for(inti = 0; i < b.length; i++) {
           out.write(b[i]);
       }
       out.close();
    }
}

【案例】向文件中追加新内容

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
 * 字节流
 * 向文件中追加新内容:
 * */
importjava.io.*;
classhello{
   publicstatic void main(String[] args) throwsIOException {
       String fileName="D:"+File.separator+"hello.txt";
       File f=newFile(fileName);
       OutputStream out =newFileOutputStream(f,true);//true表示追加模式,否则为覆盖
       String str="Rollen";
       //String str="\r\nRollen"; 可以换行
       byte[] b=str.getBytes();
       for(inti = 0; i < b.length; i++) {
           out.write(b[i]);
       }
       out.close();
    }
}

【案例】复制文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/**
 * 文件的复制
 * */
importjava.io.*;
classhello{
   publicstatic void main(String[] args) throwsIOException {
       if(args.length!=2){
           System.out.println("命令行参数输入有误,请检查");
           System.exit(1);
       }
       File file1=newFile(args[0]);
       File file2=newFile(args[1]);
         
       if(!file1.exists()){
           System.out.println("被复制的文件不存在");
           System.exit(1);
       }
       InputStream input=newFileInputStream(file1);
       OutputStream output=newFileOutputStream(file2);
       if((input!=null)&&(output!=null)){
           inttemp=0;
           while((temp=input.read())!=(-1)){
                output.write(temp);
           }
       }
       input.close();
       output.close();
    }
}

【案例】使用内存操作流将一个大写字母转化为小写字母

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
 * 使用内存操作流将一个大写字母转化为小写字母
 * */
importjava.io.*;
classhello{
   publicstatic void main(String[] args) throwsIOException {
       String str="ROLLENHOLT";
       ByteArrayInputStream input=newByteArrayInputStream(str.getBytes());
       ByteArrayOutputStream output=newByteArrayOutputStream();
       inttemp=0;
       while((temp=input.read())!=-1){
           charch=(char)temp;
           output.write(Character.toLowerCase(ch));
       }
       String outStr=output.toString();
       input.close();
       output.close();
       System.out.println(outStr);
    }
}

【案例】验证管道流:进程间通信

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/**
 * 验证管道流
 * */
importjava.io.*;
  
/**
 * 消息发送类
 * */
classSend implementsRunnable{
   privatePipedOutputStream out=null;
   publicSend() {
       out=newPipedOutputStream();
    }
   publicPipedOutputStream getOut(){
       returnthis.out;
    }
   publicvoid run(){
       String message="hello , Rollen";
       try{
           out.write(message.getBytes());
       }catch(Exception e) {
           e.printStackTrace();
       }try{
           out.close();
       }catch(Exception e) {
           e.printStackTrace();
       }
    }
}
  
/**
 * 接受消息类
 * */
classRecive implementsRunnable{
   privatePipedInputStream input=null;
   publicRecive(){
       this.input=newPipedInputStream();
    }
   publicPipedInputStream getInput(){
       returnthis.input;
    }
   publicvoid run(){
       byte[] b=newbyte[1000];
       intlen=0;
       try{
           len=this.input.read(b);
       }catch(Exception e) {
           e.printStackTrace();
       }try{
           input.close();
       }catch(Exception e) {
           e.printStackTrace();
       }
       System.out.println("接受的内容为 "+(newString(b,0,len)));
    }
}
/**
 * 测试类
 * */
classhello{
   publicstatic void main(String[] args) throwsIOException {
       Send send=newSend();
       Recive recive=newRecive();
        try{
//管道连接
           send.getOut().connect(recive.getInput());
       }catch(Exception e) {
           e.printStackTrace();
       }
       newThread(send).start();
       newThread(recive).start();
    }
}

【案例】DataOutputStream类示例

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
importjava.io.DataOutputStream;
importjava.io.File;
importjava.io.FileOutputStream;
importjava.io.IOException;
publicclass DataOutputStreamDemo{
   publicstatic void main(String[] args) throwsIOException{
       File file = newFile("d:"+ File.separator +"hello.txt");
       char[] ch = { 'A','B','C'};
       DataOutputStream out = null;
       out = newDataOutputStream(newFileOutputStream(file));
       for(chartemp : ch){
           out.writeChar(temp);
       }
       out.close();
    }
}

【案例】ZipOutputStream类

先看一下ZipOutputStream类的继承关系

java.lang.Object

java.io.OutputStream

java.io.FilterOutputStream

java.util.zip.DeflaterOutputStream

java.util.zip.ZipOutputStream

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.InputStream;
importjava.util.zip.ZipEntry;
importjava.util.zip.ZipOutputStream;
  
publicclass ZipOutputStreamDemo1{
   publicstatic void main(String[] args) throwsIOException{
       File file = newFile("d:"+ File.separator +"hello.txt");
       File zipFile = newFile("d:"+ File.separator +"hello.zip");
       InputStream input = newFileInputStream(file);
       ZipOutputStream zipOut = newZipOutputStream(newFileOutputStream(
                zipFile));
       zipOut.putNextEntry(newZipEntry(file.getName()));
       // 设置注释
       zipOut.setComment("hello");
       inttemp = 0;
       while((temp = input.read()) != -1){
           zipOut.write(temp);
       }
       input.close();
       zipOut.close();
    }
}

【案例】ZipOutputStream类压缩多个文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.InputStream;
importjava.util.zip.ZipEntry;
importjava.util.zip.ZipOutputStream;
  
/**
 * 一次性压缩多个文件
 * */
publicclass ZipOutputStreamDemo2{
   publicstatic void main(String[] args) throwsIOException{
       // 要被压缩的文件夹
       File file = newFile("d:"+ File.separator +"temp");
       File zipFile = newFile("d:"+ File.separator + "zipFile.zip");
       InputStream input = null;
       ZipOutputStream zipOut = newZipOutputStream(newFileOutputStream(
                zipFile));
       zipOut.setComment("hello");
       if(file.isDirectory()){
           File[] files = file.listFiles();
           for(inti = 0; i < files.length; ++i){
                input = newFileInputStream(files[i]);
                zipOut.putNextEntry(newZipEntry(file.getName()
                        + File.separator +files[i].getName()));
               inttemp = 0;
                while((temp = input.read()) !=-1){
                    zipOut.write(temp);
                }
                input.close();
           }
       }
       zipOut.close();
    }
}

【案例】ZipFile类展示

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
importjava.io.File;
importjava.io.IOException;
importjava.util.zip.ZipFile;
  
/**
 *ZipFile演示
 * */
publicclass ZipFileDemo{
   publicstatic void main(String[] args) throwsIOException{
       File file = newFile("d:"+ File.separator +"hello.zip");
       ZipFile zipFile = newZipFile(file);
       System.out.println("压缩文件的名称为:"+ zipFile.getName());
    }
}

【案例】解压缩文件(压缩文件中只有一个文件的情况)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
importjava.io.File;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.OutputStream;
importjava.util.zip.ZipEntry;
importjava.util.zip.ZipFile;
  
/**
 * 解压缩文件(压缩文件中只有一个文件的情况)
 * */
publicclass ZipFileDemo2{
   publicstatic void main(String[] args) throwsIOException{
       File file = newFile("d:"+ File.separator +"hello.zip");
       File outFile = newFile("d:"+ File.separator +"unZipFile.txt");
       ZipFile zipFile = newZipFile(file);
       ZipEntry entry =zipFile.getEntry("hello.txt");
       InputStream input = zipFile.getInputStream(entry);
       OutputStream output = newFileOutputStream(outFile);
       inttemp = 0;
       while((temp = input.read()) != -1){
           output.write(temp);
       }
       input.close();
       output.close();
    }
}

【案例】ZipInputStream类解压缩一个压缩文件中包含多个文件的情况


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 盆栽的长寿果树烂根怎么办 家里的石榴烂根怎么办 山桔盆栽烂根怎么办 养的植物烂根怎么办 桅子花叶子长霉怎么办 紫薇花叶子干了怎么办 高层玻璃阳台往下看恐高怎么办 比熊放阳台叫怎么办 海员入职体检不合格怎么办 联币金融立案投资人怎么办 联币金融的投资怎么办 养老保险领了几个月就挂了怎么办 高铁餐吧乘务员东西卖不出去怎么办 铁路局如果查出有乙肝怎么办 在火车站丢了东西怎么办 在新乡火车站丢了东西怎么办 自己的行李忘到高铁安检怎么办 高铁二等座睡觉怎么办 空少岁数大了怎么办 美国留学生办欧洲签证怎么办 苏州小区不让装充电桩怎么办 饿了么运力不足怎么办 书法落款写偏了怎么办 辐射4运行不流畅怎么办 vgs币忘了映射怎么办 货车把我的货物运输中损坏怎么办 道路货物运输从业资格证过期怎么办 高铁喷雾被扣了怎么办 宝宝不好好吸奶怎么办 宝宝不用劲吸奶怎么办 刚出生的宝宝不吃奶怎么办 老婆怀孕想吐怎么办呢 菜把下水道堵了怎么办 一楼厕所堵了怎么办 农村房屋确权有争议怎么办 盲审一个没过怎么办 本科生论文盲审不过怎么办 本科盲审没通过怎么办 一篇论文多次引用著作怎么办 学生毕业后改名学籍怎么办 大学毕业后改名字后学籍怎么办