输入流--outputStream

简介: 输入流--outputStream

输入流--outputStream

OutputStream类是Java IO API中所有输出流的基类。子类包括BufferedOutputStream,FileOutputStream等等。

OutputStream是一个典型的装饰者模式,使用的时候直接new子类。

utputStream可以输出到console,文件,磁盘等目标媒介中。

类图展示

OutputStream是以字节为单位的输出流的超类,提供了write()函数从输出流中读取字节数据。

ByteArrayOutputStream是字节数组输出流,写入ByteArrayOutputStream的数据被写入到一个byte数组,缓冲区会随着数据的不断写入而自动增长,可使用toByteArray()和toString()获取数据。

PipedOutputStream是管道输出流,和PipedInputStream一起使用,能实现多线程间的管道通信。

FilterOutputStream是过滤输出流,是DataOutputStream,BufferedOutputStream和PrintStream的超类

DataOutputStream是数据输出流,用来装饰其他的输出流,允许应用程序以与机器无关方式向底层写入基本Java数据类型。

BufferedOutputStream是缓冲输出流,它的作用是为另一个输出流添加缓冲功能。

PrintStream是打印输出流,用来装饰其他输出流,为其他输出流添加功能,方便的打印各种数据值

FileOutputStream是文件输出流,通常用于向文件进行写入操作。

ObjectOutputStream是对象输出流,它和ObjectInputStream一起对基本数据或者对象的持久存储

outputStream主要api方法

write():将数据写入输出流

public abstract void write(int b)
public void write(byte[] b)
public void write(byte[] b,int off,int len)
复制代码

close():关闭并且释放流资源

flush():刷新此输出流并强制写出所有缓冲的输出字节

代码示例:
// 模拟浏览器,给tomcat服务端发送符合http协议的请求消息
public static void main(String[] args) throws IOException
{

Socket s = new Socket("127.0.0.1", 80);
PrintWriter out = new PrintWriter(s.getOutputStream()); //这里的ture表示流会自动刷新,在后面可以不用使用flush()方法  
out.println("GET /myweb/test.jsp HTTP/1.1");
out.println("Accept: */*");
out.println("Accept-Language: zh-CN");
out.println("Accept-Encoding: gzip, deflate");
out.println();
out.flush(); // 清空缓存并输出流
InputStream in = s.getInputStream();
byte b[] = new byte[1024];
int leng = 0;
while((leng = in .read(b)) != -1)
{
    String str = new String(b, 0, leng);
    System.out.println(str);
}
s.close();

}
复制代码
FilterOutputStream类
FileOutputStream写入文件中
public static String[] readToString(String filePath1,String filePath2) {

InputStream is = new FileInputStream(filePath1);
FileOutputStream fos = new FileOutputStream(filePath2);
byte[] b = new byte[1024];
while ((is.read(b)) != -1) {
    fos.write(b);// 写入数据
}
is.close();
fos.close();// 保存数据

}
复制代码
ByteArrayOutputStream类
ByteArrayOutputStream在内存中创建了一个字节数组,所有发送到输出流的数据都会保存到该字节数组的缓冲区中。数据写入缓冲区以后,然后使用toByteArray()和toString()输出。
public static void main(String[] args)
{

ByteArrayOutputStream bos = null;
FileInputStream fs = null;
try
{
    bos = new ByteArrayOutputStream();
    fs = new FileInputStream("c:\\51gjie.txt");
    int len;
    while((len = fs.read()) != -1)
    {
        // 把读取到的数据逐个写到ByteArrayOutputStream中
        bos.write(len);
    }
    byte[] array = bos.toByteArray();
    // 指定utf-8解码的字符集
    System.out.println(new String(array, "utf-8"));
    fs.close();
}
catch(IOException e)
{}
finally
{
    fs.close();
}

}
复制代码
DataOutputStream类
DataOutputStream允许应用程序以与机器无关方式将Java基本数据类型(boolean,byte,int,long,string等)写到底层输出流。
public static void main(String[] args) throws IOException
{

FileOutputStream in = new FileOutputStream("c\\51gjie.txt");
DataOutputStream out = new DataOutputStream( in );
String string = "欢迎来到www.51gjie.com";
out.writeBytes(string);
out.writeChars(string);
out.writeUTF(string);
out.close();
System.out.println("写入成功!");

}
复制代码
BufferedOutputStream类

  1. 当创建BufferedOutputStream时,会创建一个内部缓冲区数组,应用程序可以向底层输出流写入字节数据,当写入数据时,可以不用每次都去调用底层方法,而是直接从缓存区获取数据。
  2. BufferedOutputStream缓冲输出流在输出的时候,不是直接一个字节一个字节的操作,而是先写入内存的缓冲区内。直到缓冲区满了或者我们调用close方法或flush方法,该缓冲区的内容才会写入目标。才会从内存中转移到磁盘上,因此效率是非常高的。

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

OutputStream os = new FileOutputStream("c:/51gjie.txt");
OutputStream bs = new BufferedOutputStream(os);
byte[] buffer = "欢迎来到www.51gjie.com".getBytes();
bs.write(buffer);
bs.close();//写入文件
os.close();

}
复制代码
如果文件太大,一次性读取这个大文件的所有数据,内存可能装不下,但是如果每次只读一个字节数据,会耗时太慢。因此用BufferedInputStream一次读取1024*8个字节数据,用BufferedOutputStream放入缓冲区,分批读写。代码如下:
public static void main(String[] args) throws IOException
{

BufferedInputStream bufferInput = null;
BufferedOutputStream bufferOutput = null;
try
{
    // 输入缓冲流
    InputStream input = new FileInputStream(new File("c:\\100MB.txt"));
    bufferInput = new BufferedInputStream(input);
    // 输出缓冲流
    OutputStream output = new FileOutputStream(new File("c:\\100MB_test.txt"));
    bufferOutput = new BufferedOutputStream(output);
    // 定义个8kb字节数组,作为缓冲区流
    byte[] bytes = new byte[1024 * 8];
    int len = 0;
    while((len = bufferInput.read(bytes)) != -1)
    {
        bufferOutput.write(bytes, 0, len);
    }
}
catch(IOException e)
{
}
finally
{
    try
    {
        if(bufferInput != null)
        {
            bufferInput.close();
        }
        if(bufferOutput != null)
        {
            bufferOutput.close();
        }
    }
    catch(IOException e)
    {
    }
}

}

相关文章
|
6月前
|
移动开发 Java Linux
IO流:字节输出流FileOutputStream的超详细用法
IO流:字节输出流FileOutputStream的超详细用法
|
12月前
InputStream读取数据
InputStream读取数据
|
12月前
|
Java
File操作-InputStream/OutputStream及是否创建文件
File操作-InputStream/OutputStream及是否创建文件
79 0
|
C语言 C++ 开发者
C++输入流和输出流介绍
C++ 又可以称为“带类的 C”,即可以理解为 C++ 是 C 语言的基础上增加了面向对象(类和对象)。在此基础上,学过 C 语言的读者应该知道,它有一整套完成数据读写(I/O)的解决方案: 使用 scanf()、gets() 等函数从键盘读取数据,使用 printf()、puts() 等函数向屏幕上输出数据; 使用 fscanf()、fgets() 等函数读取文件中的数据,使用 fprintf()、fputs() 等函数向文件中写入数据。 要知道,C 语言的这套 I/O 解决方案也适用于 C++ 程序,但 C++ 并没有“偷懒”,它自己独立开发了一套全新的 I/O 解决方案,其中就包含
81 0
|
存储 缓存 Java
【Java I/O 流】字符输入输出流:Reader 和 Writer
前面我们已经学会了字节流的使用,本篇开始介绍字符流。字符输入输出流是所有字符流的超类,学会了它们的方法,也基本上掌握了其子类的使用了。
124 0
|
存储 缓存 Java
【Java I/O 流】文件字符输入输出流:FileReader 和 FileWriter
本篇文章主要讲述“文件字符输入流”和“文件字符输出流”两个类的使用,并列举了一些读写案例,帮助学习。
559 0
|
存储 Java API
输入流--InputStream
输入流--InputStream
|
文件存储
IO流的字节输入输出流(InputStream,OutputStream)及文件复制
字节输出流与文件字节输出流 文件存储原理和记事本打开文件原理 OutputStream及FileOutputStream import java.io.FileOutputStream; import java.io.IOException; /* java.io.OutputStream:字节输出
|
消息中间件 前端开发 JavaScript
InputStream 和 OutputStream 基础
大家好,我是指北君。 PS:最近是跳槽的高峰期,我连日加班好多天,整理出了包含16000 多道面试题的面试宝典,并且指北君也会持续更新这份面试宝典中的题目,希望它能帮助大家找到自己心仪的工作!【文末有领取方式】
InputStream 和 OutputStream 基础
|
移动开发
字节流InputStream和OutputStream(二)上
字节流InputStream和OutputStream(二)
179 0
字节流InputStream和OutputStream(二)上