Java中io流解析及代码实例

网友投稿 216 2023-02-28


Java中io流解析及代码实例

IO流

java中IO流分为两种,字节流和字符流,顾名思义字节流就是按照字节来读取和写入的,字符刘是按照字符来存取的;常用的文件读取用的就是字符流,在网络通信里面用的就是字节流

下面这张图是Java中IO流的总体框架:

字节流

Java中字节流一般都是以stream结尾的,输入的字节流叫InputStream,输出字节流叫OutputStream;InputStream和OutputStream是表示自己输入/输出的所有类的超类,是抽象类(abstract)

常用的字节流有:

1.FileInputStream/FileOutputStream

2.BufferedInputStream/BufferedOutputStream

3.SequenceInputStream(序列流)

4.ObjectInputStream/ObjectOutputStream(对象的输入输出流)

5.PrintStream(打印流)

字符流

Java中输入字符流是以Reader结尾的,输出字符流是以Writer结尾的,比如我们常见的FileReader和FileWriter就是个字符流,Reader和Witer是输入/输出字符流的超类,也是抽象类

常用的字符流有:

1.FileReader/FileWriter

2.BufferedReader/BufferedWriter

3.InputStremReader/OutputStreamWriter(转换流)

转换流

转换流就是将字节流转换为字符流的类,有两种:

InputStreamReader

OutputStreamWriter

InputStreamReader是个字符流(Reader),需要包装一个字节流(InputStream);

OutputStreamWriter是个字符流(Writer),需要包装一个字节流(OutputStream)

包装(decorate)

包装的作用的就是在原始的对象的基础上增加新的功能,比如BufferedReader包装一个Reader,实际就是对Reader功能的增强;原始的Reader只能按照一个字符一个字符的读取,经过包装之后形成的BufferedReader就具有了新的功能:直接读取一行(readLine)的功能,直观上说这就是所谓的Decorate.

在设计模式上这就是典型的装饰模式,其特点是:

1.装饰对象和真实对象有相同的接口。这样客户端对象就能以和真实对象相同的方式和装饰对象交互

2.装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能

对应到我们上来就是,BufferedReader和Reader都是个Reader,通过包装之后BufferedReader功能增强,但是依然可以当做Reader来用(OO的父类引用可以指向子类)

例子

字节流的例子

将mp3文件切割成多份数,然后重新组合起来

package cn.xdian.test;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.SequenceInputStream;

import java.util.Enumeration;

import java.util.Vector;

public class Demo2 {

public static void main(String[] args) throws IOException {

cutFile();

//切割MP3文件

mergeFlile();

//合并MP3文件

}

//合并MP3

public static void mergeFlile() throws IOException{

File dir = new File("/home/gavinzhou/music_test");

//找到文件夹下所有的MP3文件

Vector vector = new Vector();

File[] files = dir.listFiles();

for (File file : files){

if(file.getName().endsWith(".mp3")){

vector.add(new FileInputStream(file));

}

}

//通过Vector获取迭代器

Enumeration e = vector.elements();

//创建序列流

SequenceInputStream inputStream = new SequenceInputStream(e);

//输出流

FileOutputStream fileOutputStream = new FileOutputStream("/home/gavinzhou/conbine.mp3");

//读取分割的MP3文件

byte[] buf = new byte[1024];

int length = 0 ;

while((length = inputStream.read(buf))!=-1){

fileOutputStream.write(buf,0,length);

}

//关闭流

fileOutputStream.cloFCxUpse();

inputStream.close();

}

//切割MP3

public static void cutFile() throws IOException{

File file = new File("/home/gavinzhou/test.mp3");

File dir = new File("/home/gavinzhou/music_test");

//输入字节流

FileInputStream fileInputStream = new FileInputStream(file);

//读取文件

byte[] buf = new byte[1024*1024];

int length = 0;

for (int i = 0 ; (length = fileInputStream.read(buf))!=-1 ; i++){

FileOutputStream fileOutputStreFCxUpam = new FileOutputStream(new File(dir,"part"+i+".mp3"));

fileOutputStream.write(buf,0,length);

fileOutputStream.close();

}

//关闭流

fileInputStream.close();

}

}

字符流的例子

拷贝文件A变为文件B

package cn.xidian.test;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.File;

import java.io.FileReader;

import java.io.FileWriter;

import java.io.IOException;

public class Demo1 {

public static void main(String[] args) throws IOException {

File sourceFile = new File("/home/gavinzhou/a.txt");

File desFile = new File("/home/gavinzhou/b.txt");

//创建输入流

BufferedReader input = new BufferedReader(new FileReader(sourceFile));

//创建输出流

BufferedWriter output = new BufferedWriter(new FileWriter(desFile));

//读取源文件,写入到新的文件

String line = null;

while((line = input.readLine()) != null){

output.write(line);

output.newLine();

}

//关闭输入输出流

input.close();

output.close();

}

}

打印流的例子

package cn.xidian.test;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.PrintStream;

/*

打印流可以打印任意类型的数据,打印数据之前都会先把数据转换成字符串再进行打印

*/

class Animal{

String name;

String color;

public Animal(String name,String color){

this.name = name;

this.color = color;

}

FCxUp @Override

public String toString() {

return "名字:"+this.name+ " 颜色:"+ this.color;

}

}

public class Demo6 {

public static void main(String[] args) throws IOException {

/*

File file = new File("/home/gavinzhou/a.txt");

//创建打印流

PrintStream printStream = new PrintStream(file);

//打印任何信息到文件中

printStream.println(97);

printStream.println(3.14);

printStream.println('a');

printStream.println(true);

Animal a = new Animal("老鼠", "黑色");

printStream.println(a);

//更改标准的输入输出

System.setOut(printStream); //标准输出是到屏幕上

System.out.println("test.......");

*/

//收集异常的日志信息。

File logFile = new File("/home/gavinzhou/test.log");

PrintStream logPrintStream = new PrintStream( new FileOutputStream(logFile,true) );

try{

int c = 4/0;

//引起异常

System.out.println("c="+c);

int[] arr = null;

System.out.println(arr.length);

}

catch(Exception e){

e.printStackTrace(logPrintStream);

//输出到文件而不是屏幕上

}

}

}

总结

以上就是本文关于Java中io流解析及代码实例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:

Java探索之Thread+IO文件的加密解密代码实例

Java IO流相关知识代码解析

java的IO流详细解读

如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:java IO数据操作流、对象序列化、压缩流代码解析
下一篇:spring boot集成shiro详细教程(小结)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~