草庐IT

何为输入流,何为输出流,何为缓冲流

悠然画中仙 2024-05-31 原文

在沈阳华清远见的学习之输入输出流~

文章目录


前言

        流(Stream)是指在计算机的输入输出操作中各部件之间的数据流动。按照数据的传输方向,流可分为输入流与输出流,它是java中比较重要的知识点,无论是面试考试,还是实际工作中,这都是经常能够看到的身影,所以今天我写下这篇文章,希望各位看官可以更好地了解流的相关知识。


1、输入流

1.1字节输入流(InputStream)

        字节流处理单元为1个字节,操作字节和字节数组。

package com.hqyj.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class Test {

	public static void main(String[] args) throws IOException {
		File file = new File("文件地址");
		if (file.exists()) {
			FileInputStream fis = null;//判断文件是否存在
			try {
				// 创建一个文件字节流进行对文件读取
				fis = new FileInputStream(file);
				// 创建字节数组作为传递载体
				byte b[] = new byte[1024];
				// 判断每次读取到的内容数量,不为-1则说明还有内容
				int length = 0;
				// 创建一个字符串对象来承载读取到的内容
				StringBuffer str = new StringBuffer();
				// 循环读取,数量为-1则说明读取完成
				while ((length = fis.read(b)) != -1) {
					// 将每次读取到的内容制作成字符串,拼接在原字符串的后面
					str.append(new String(b, 0, length));
				}
				// 显示字符串
				System.out.println(str);
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			} finally {
				// 关流
				fis.close();
			}

		} else {
			System.out.println("文件不存在");
		}
	}

}

1.2字符输入流(Reader)

        字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好。

package com.hqyj.test;

import java.io.File;
import java.io.FileReader;
import java.io.FileNotFoundException;
import java.io.IOException;

public class Test {

	public static void main(String[] args) throws IOException {
		File file = new File("文件地址");
		if (file.exists()) {
			FileReader fr = null;//判断文件是否存在
			try {
				// 创建一个文件字节流进行对文件读取
				fr = new FileReader(file);
				// 创建字节数组作为传递载体
				char[] c= new char[1024];
				// 判断每次读取到的内容数量,不为-1则说明还有内容
				int length = 0;
				// 创建一个字符串对象来承载读取到的内容
				StringBuffer str = new StringBuffer();
				// 循环读取,数量为-1则说明读取完成
				while ((length = fr.read(c)) != -1) {
					// 将每次读取到的内容制作成字符串,拼接在原字符串的后面
					str.append(new String(c, 0, length));
				}
				// 显示字符串
				System.out.println(str);
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			} finally {
				// 关流
				fr.close();
			}

		} else {
			System.out.println("文件不存在");
		}
	}

}

2、输出流

2.1字节输出流(OutputStream)

package com.hqyj.test;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;

public class Test2 {

	public static void main(String[] args) throws IOException {
		Scanner scan = new Scanner(System.in);
		String str = scan.next();
		File file = new File("文件地址");
		if (file.exists()) {
			FileOutputStream fos = null;
			try {
				fos = new FileOutputStream(file,true);
				fos.write(str.getBytes());
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			} finally {
				fos.close();
			}

		} else {
			System.out.println("文件不存在");
		}
	}

}

2.2字符输出流(Writer)

package com.hqyj.test;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;

public class Test2 {

	public static void main(String[] args) throws IOException {
		Scanner scan = new Scanner(System.in);
		String str = scan.next();
		File file = new File("文件地址");
		if (file.exists()) {
			FileWriter fw = null;
			try {
				fw = new FileWriter(file,true);
				fw.write(str.getBytes());
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			} finally {
				fw.close();
			}

		} else {
			System.out.println("文件不存在");
		}
	}

}

3、文件复制

首先要提到的是字节流与字符流的区别:

(1)字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。

(2)字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好

(3)如果是音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点

(4)所有文件的储存是都是字节(byte)的储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘。在读取文件(特别是文本文件)时,也是一个字节一个字节地读取以形成字节序列

        说完了输入流与输出流,接下来就是他们的应用啦,最经典的例子就是文件复制的问题,这里用字节流举例

package com.hqyj.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class Test2 {

	public static void main(String[] args) throws IOException {
		File file = new File("文件1地址");
		File file1 = new File("文件2地址");
		FileInputStream fis = null;
		FileOutputStream fos = null;

		fis = new FileInputStream(file);
		fos = new FileOutputStream(file1);
		byte b[] = new byte[1024];
		int length = 0;
		while ((length = fis.read(b)) != -1) {
			fos.write(b);
		}
		fis.close();
		fos.close();
	}

}

4、缓冲流

字节流:BufferedInputStream,BufferedOutputStream

字符流:BufferedReader,BufferedWritter

        缓冲流是一个特别的流,缓冲流的基本原理是创建流对象时候,会创建一个内置的默认大小的缓冲区数组,通过缓冲区书写,他的作用是提高系统读写速度,这里用上面的文件复制加缓冲流进行举例

package com.hqyj.test;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Test3 {

	public static void main(String[] args) throws IOException {
		FileInputStream fis = new FileInputStream(
				new File("文件1地址"));
		FileOutputStream fos = new FileOutputStream(
				new File("文件2地址"));
		BufferedInputStream bis = new BufferedInputStream(fis);
		BufferedOutputStream bos = new BufferedOutputStream(fos);
		byte[] bytes = new byte[1024];
		while (bis.read(bytes) != -1) {
			bos.write(bytes);
		}
		bos.flush();
		bis.close();
		bos.close();
		fis.close();
		fos.close();
		

	}

}

        缓冲流减少了CPU通过内存访问磁盘的次数,极大的提高了读写的速度和效率,IO流操作文件内容都是在缓冲流内部的缓冲数组之中的。


总结

        以上就是今天要讲的内容,何为输入流,何为输出流,何为字节流,他们的作用是什么,怎么使用,有什么优缺点,希望对各位读者能有所帮助。

有关何为输入流,何为输出流,何为缓冲流的更多相关文章

  1. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  2. ruby - 如何为 emacs 安装 ruby​​-mode - 2

    我刚刚为fedora安装了emacs。我想用emacs编写ruby。为ruby​​提供代码提示、代码完成类型功能所需的工具、扩展是什么? 最佳答案 ruby-mode已经包含在Emacs23之后的版本中。不过,它也可以通过ELPA获得。您可能感兴趣的其他一些事情是集成RVM、feature-mode(Cucumber)、rspec-mode、ruby-electric、inf-ruby、rinari(用于Rails)等。这是我当前用于Ruby开发的Emacs配置:https://github.com/citizen428/emacs

  3. ruby - 通过 erb 模板输出 ruby​​ 数组 - 2

    我正在使用puppet为ruby​​程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby​​不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这

  4. ruby - 如何进行排列以有效地定制输出 - 2

    这是一道面试题,我没有答对,但还是很好奇怎么解。你有N个人的大家庭,分别是1,2,3,...,N岁。你想给你的大家庭拍张照片。所有的家庭成员都排成一排。“我是家里的friend,建议家庭成员安排如下:”1岁的家庭成员坐在这一排的最左边。每两个坐在一起的家庭成员的年龄相差不得超过2岁。输入:整数N,1≤N≤55。输出:摄影师可以拍摄的照片数量。示例->输入:4,输出:4符合条件的数组:[1,2,3,4][1,2,4,3][1,3,2,4][1,3,4,2]另一个例子:输入:5输出:6符合条件的数组:[1,2,3,4,5][1,2,3,5,4][1,2,4,3,5][1,2,4,5,3][

  5. ruby - 将 spawn() 的标准输出/标准错误重定向到 Ruby 中的字符串 - 2

    我想使用spawn(针对多个并发子进程)在Ruby中执行一个外部进程,并将标准输出或标准错误收集到一个字符串中,其方式类似于使用Python的子进程Popen.communicate()可以完成的操作。我尝试将:out/:err重定向到一个新的StringIO对象,但这会生成一个ArgumentError,并且临时重新定义$stdxxx会混淆子进程的输出。 最佳答案 如果你不喜欢popen,这是我的方法:r,w=IO.pipepid=Process.spawn(command,:out=>w,:err=>[:child,:out])

  6. ruby - Ruby 是否使用 $stdout 来写入 puts 和 return 的输出? - 2

    我想知道Ruby用来在命令行打印这些东西的输出流:irb(main):001:0>a="test"=>"test"irb(main):002:0>putsatest=>nilirb(main):003:0>a=>"test"$stdout是否用于irb(main):002:0>和irb(main):003:0>?而且,在这两次调用之间,$stdout的值是否有任何变化?另外,有人能告诉我打印/写入这些内容的Ruby源代码吗? 最佳答案 是的。而且很容易向自己测试/证明。在命令行试试这个:ruby-e'puts"foo"'>test.

  7. ruby-on-rails - 无法在 Rails 助手中捕获 block 的输出 - 2

    我在使用自定义RailsFormBuilder时遇到了问题,从昨天晚上开始我就发疯了。基本上我想对我的构建器方法之一有一个可选block,以便我可以在我的主要content_tag中显示其他内容。:defform_field(method,&block)content_tag(:div,class:'field')doconcatlabel(method,"Label#{method}")concattext_field(method)capture(&block)ifblock_given?endend当我在我的一个Slim模板中调用该方法时,如下所示:=f.form_field:e

  8. ruby - 鸭子输入字符串、符号和数组的优雅方式? - 2

    这是针对我无法破坏的现有公共(public)API,但我确实希望对其进行扩展。目前,该方法采用字符串或符号或任何其他在作为第一个参数传递给send时有意义的内容我想添加发送字符串、符号等列表的功能。我可以只使用is_a吗?数组,但还有其他发送列表的方法,这不是很像ruby​​。我将调用列表中的map,所以第一个倾向是使用respond_to?:map。但是字符串也会响应:map,所以这行不通。 最佳答案 如何将它们全部视为数组?String的行为与仅包含String的Array相同:deffoo(obj,arg)[*arg].eac

  9. ruby-on-rails - 如何为空白字段编写 rspec? [Rails3.1] - 2

    我使用rails3.1+rspec和factorygirl。我对必填字段(validates_presence_of)的验证工作正常。我如何让测试将该事实用作“成功”而不是“失败”规范是:describe"Addanindustrywithnoname"docontext"Unabletocreatearecordwhenthenameisblank"dosubjectdoind=Factory.create(:industry_name_blank)endit{shouldbe_invalid}endend但是我失败了:Failures:1)Addanindustrywithnona

  10. ruby-on-rails - 连接字符串时如何在 <%=%> block 内输出 html_safe? - 2

    考虑一下:现在这些情况:#output:http://domain.com/?foo=1&bar=2#output:http://domain.com/?foo=1&bar=2#output:http://domain.com/?foo=1&bar=2#output:http://domain.com/?foo=1&bar=2我需要用其他字符串输出URL。我如何保证&符号不会被转义?由于我无法控制的原因,我无法发送&。求助!把我的头发拉到这里:\编辑:为了澄清,我实际上有一个像这样的数组:@images=[{:id=>"fooid",:url=>"http://

随机推荐