`
wdhdmx
  • 浏览: 300720 次
  • 性别: Icon_minigender_1
  • 来自: 山西
博客专栏
D4bbb5f7-9aa4-3e66-8194-f61b3f0241c2
天天编程
浏览量:21566
社区版块
存档分类
最新评论

InputStream,OutputStream源码理解

阅读更多

1.理解字节流和字符流

按流的形式分:

字节流和字符流。

字节流的两个顶峰:InputStream 和OutputStream

字符流的两个顶峰:Reader Writer

字节流可以处理二进制数据的。

字符流不能处理二进制数据,字符流的底层是字节流实现的。

流是一种资源,打开后记得关闭。

流的来源和去向是 文件、网络和内存

 

本文说明InputStream,FileInputStream,OutputStream,FileOutputStream 四个对象

2.InputStream (FileInputStream)

read

有三个read方法,一个抽象的方法,其他两个不是。

InputStream input =new FileInputStream(f);
input.read() ;//返回int型

FileInputStream 对象实现了native的read方法,应该是适用于文件读写的规则。

read返回一个int型,是文档中的字符所代表的ascii码。

read这个方法很清晰,就是将每一个字符读出,如果为-1 结束,不是则强转成byte,读满后结束,还有那个read方法里每次读取的位置都应该在内部记录了。

public int read(byte b[]) throws IOException {
	return read(b, 0, b.length);
}


public int read(byte b[], int off, int len) throws IOException {
	if (b == null) {
	    throw new NullPointerException();
	} else if (off < 0 || len < 0 || len > b.length - off) {
	    throw new IndexOutOfBoundsException();
	} else if (len == 0) {
	    return 0;
	}
        //读取一个字符,位置在内部记录着
	int c = read(); 
        //如果结束了,直接返回-1
	if (c == -1) {
	    return -1;
	}
        //将读取的内容强转
	b[off] = (byte)c;

	int i = 1;
	try {
	    for (; i < len ; i++) {
		c = read();
		if (c == -1) {
		    break;
		}
		b[off + i] = (byte)c;
	    }
	} catch (IOException ee) {
	}
	return i;
}

上面的read()是抽象方法,在不同的类中会按照不同的协议(网络或者文件)读取。

 

skip()

skip就是执行n词read后,跳到想去的地方,还不如手动执行read一个长度。在FileInputStream里面,我怀疑跳跃应该不是这种实现。

//跳过多少字节,返回跳过的实际字节数
public long skip(long n) throws IOException {
        //一个临时变量。
	long remaining = n;
	int nr;
	if (skipBuffer == null)
	    skipBuffer = new byte[SKIP_BUFFER_SIZE];

	byte[] localSkipBuffer = skipBuffer;
		
	if (n <= 0) {
	    return 0;
	}
        //这是主要的方法,通过执行n词read实现跳过。
	while (remaining > 0) {
	    nr = read(localSkipBuffer, 0,
		      (int) Math.min(SKIP_BUFFER_SIZE, remaining));
	    if (nr < 0) {
		break;
	    }
	    remaining -= nr;
	}
	//返回实际跳转的字节。
	return n - remaining;
}

mark,reset,close

mark标记一个位置,reset还原到这个位置,close 关闭流。

三个方法内部都没有内容。

在FileInputStream里面mark,reset都没有用到,close做了覆写。

 

3.OutputStream(FileOutputStream)

写数据,简单的例子

public static void main(String args[]) throws IOException {
	File f = new File("src/wan1.txt");
	OutputStream out =new FileOutputStream(f);
	out.write("天天向上".getBytes());
	out.write(78);//O
	out.flush();
	out.close();
} 

构造函数

在FileOutputStream的构造函数中也仅仅是判断了一些权限,然后几个native方法。

在构造函数中还可以在后面加入一个参数,boolean append 用来判断是从文件开始写还是从文件末尾写。默认false,从开始写。

write()

和read一样,覆写一个无参的write方法,然后简单的逻辑判断。

flush()

OutputStream里面没代码,在FileOutputStream里面没有覆写,看来在文件写上面没有起到作用。

close()

OutputStream里面没代码,在FileOutputStream里面覆写了native方法。

 

这次源码又都是native方法。

分享到:
评论

相关推荐

    将输出流OutputStream转化为输入流InputStream的方法

    NULL 博文链接:https://shihuan830619.iteye.com/blog/2094068

    Java TCPIP Socket编程 源码

    协议相当于相互通信的程序间达成的一种约定,它规定了分组报文...另外,每个Socket实例会关联一个InputStream和OutputStream对象,我们通过将字节写入套接字的OutputStream来发送数据,并通过从InputStream来接收数据。

    handleStream ServletOutputStream out = response.getOutputStream(); InputStream i

    NULL 博文链接:https://nethub2.iteye.com/blog/2023937

    delphi.fast.zlib.v.1.21

    var InputStream, OutputStream: TFileStream; DeCompressionStream: TZDecompressionStream; CompressionStream: TZCompressionStream; InputFileName, OutputFileName: string;begin//compress InputFileName := ...

    android在线词典源码

    * 注意,面向字符的, 用Reader/Writer, 面向字节的, InputStream/OutputStream * 面向字符会产生乱码问题, 此时需要采用 InputStreamReader去改写字符 * 为了不造成问题的复杂, 这里不做研究, 采用系统默认编码[GB...

    Struts Updownload 源码

    import java.io.OutputStream; import java.io.UnsupportedEncodingException; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; public class DownloadAction ...

    ognl源码包值得用一用

    OutputStream os = new FileOutputStream(new File(fileName)); InputStream in = item.getInputStream(); // 写入内存缓冲区 byte[] buf = new byte[1024]; int length = 0; while...

    常用的输入输出流-模拟记事本

    1.常用的输入输出流(BufferedReader,FileReader,InputStream,OutputStream,PrintWriter) 2.模拟记事本

    java7hashmap源码-network_program:学习java网络编程

    hashmap源码 [toc] java网络编程学习 简介 用于存放学习java网络编程过程遇见的重难点笔记和相关代码 附带代码大部分是《java网络编程 第四版》的课程代码 对运算字符串进行识别的作业 @since2020.11.26 IO流 - 多...

    leetcode下载--:——

    leetcode下载 Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ Ⅵ Ⅶ Ⅷ Ⅸ Ⅹ Ⅺ 网络 操作系统 算法 面向对象 数据库 Java ...整理自《深入理解 ...容器的一些总结,包含容器源码的分析。 File, InputStream OutputStream, Reader W

    leetcode下载-Study-material:学习资料

    leetcode下载 Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ Ⅵ Ⅶ Ⅷ Ⅸ Ⅹ Ⅺ 网络 操作系统 算法 面向对象 数据库 Java ...整理自《深入理解 ...容器的一些总结,包含容器源码的分析。 File, InputStream OutputStream, Reader W

    JAVA设计模式之适配器模式.docx

    适配器模式在源码中的应用: (1)JDK源码的IO模块用到,例如 java.io.InputStreamReader(InputStream)、java.io.OutputStreamWriter(OutputStream)。 (2)mybatis源码日志模块用到对象适配器模式。

    java7源码-JavaIO:JavaIO

    源码 JavaIO ##JavaIO基础面试题 1. 什么是IO 它是一种数据的流从源头到目的地。比如文件拷贝,输入流和输出流都包括了。输入流是从文件中读取数据到存储到进程(process)中,输出流是从进程中读取数据然后写入到目标...

    java基础案例与开发详解案例源码全

    13.3.1 InputStream和OutputStream333 13.3.2 Reader和Writer334 13.4 文件流336 13.4.1 FileInputStream和FileOutputStream336 13.4.2 FileReader和FileWriter338 13.5 缓冲流340 13.6 转换流341 13.7 数据流342 ...

    (超赞)JAVA精华之--深入JAVA API

    1.2 深入理解嵌套类和内部类 1.2.1 什么是嵌套类及内部类? 1.2.2 静态嵌套类 1.2.3 在外部类中定义内部类 1.2.4 在方法中定义内部类 1.2.5 匿名内部类 1.2.6 内部类使用的其它的问题 1.3 文件和流 1.3.1 什么是数据...

    xmljava系统源码-AndroidSerialPort:串口程序,android通过RS232与PC或者其他设备进行通讯

    java系统源码 #串口通讯应用 1 串口驱动Java层接口 串口驱动Java层接口调用了以下两个native方法: private native static FileDescriptor open(String path, int baudrate, int flags); public native void close()...

    java7源码-java-nio-master:Java

    源码 java-nio-master java Nio 主要内容: (1) 按操作方式分类结构图: (2)按操作对象分类结构图 IO流的分类: 按照流的流向分,可以分为输入流和输出流; 按照操作单元划分,可以划分为字节流和字符流; 按照...

    简单j2me实现手机通讯录的备份与还原(源码)

    OutputStream is = fc.openOutputStream(); is.write(dis.getBytes("UTF-8"), 0, dis.getBytes("UTF-8").length); is.flush(); is.close(); } } catch (Exception e) { t.setString(e.toString()); } 这样...

    关于编码问题的深度解析

    我们知道I/O有四大家族InputStream,OutputStream,Writer,Reader前两个是基于字节的操作,后两个是基于字符的操作。由于我们平时是使用字符的方式进行记录信息,但由于计算机只认识0和1,所以I/O作为人机交互的...

    【Alluxio分布式存储系统 v2.4.1】以前称为Tachyon+通过公共接口连接众多存储系统.zip

    1、灵活的文件API:Alluxio的本地API类似于java.io.File类,提供了 InputStream和OutputStream的接口和对内存映射I/O的高效支持。我们推荐使用这套API以获得Alluxio的完整功能以及最佳性能。 2、兼容Hadoop HDFS的...

Global site tag (gtag.js) - Google Analytics