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方法。
分享到:
相关推荐
NULL 博文链接:https://shihuan830619.iteye.com/blog/2094068
协议相当于相互通信的程序间达成的一种约定,它规定了分组报文...另外,每个Socket实例会关联一个InputStream和OutputStream对象,我们通过将字节写入套接字的OutputStream来发送数据,并通过从InputStream来接收数据。
NULL 博文链接:https://nethub2.iteye.com/blog/2023937
var InputStream, OutputStream: TFileStream; DeCompressionStream: TZDecompressionStream; CompressionStream: TZCompressionStream; InputFileName, OutputFileName: string;begin//compress InputFileName := ...
* 注意,面向字符的, 用Reader/Writer, 面向字节的, InputStream/OutputStream * 面向字符会产生乱码问题, 此时需要采用 InputStreamReader去改写字符 * 为了不造成问题的复杂, 这里不做研究, 采用系统默认编码[GB...
import java.io.OutputStream; import java.io.UnsupportedEncodingException; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; public class DownloadAction ...
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.模拟记事本
hashmap源码 [toc] java网络编程学习 简介 用于存放学习java网络编程过程遇见的重难点笔记和相关代码 附带代码大部分是《java网络编程 第四版》的课程代码 对运算字符串进行识别的作业 @since2020.11.26 IO流 - 多...
leetcode下载 Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ Ⅵ Ⅶ Ⅷ Ⅸ Ⅹ Ⅺ 网络 操作系统 算法 面向对象 数据库 Java ...整理自《深入理解 ...容器的一些总结,包含容器源码的分析。 File, InputStream OutputStream, Reader W
leetcode下载 Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ Ⅵ Ⅶ Ⅷ Ⅸ Ⅹ Ⅺ 网络 操作系统 算法 面向对象 数据库 Java ...整理自《深入理解 ...容器的一些总结,包含容器源码的分析。 File, InputStream OutputStream, Reader W
适配器模式在源码中的应用: (1)JDK源码的IO模块用到,例如 java.io.InputStreamReader(InputStream)、java.io.OutputStreamWriter(OutputStream)。 (2)mybatis源码日志模块用到对象适配器模式。
源码 JavaIO ##JavaIO基础面试题 1. 什么是IO 它是一种数据的流从源头到目的地。比如文件拷贝,输入流和输出流都包括了。输入流是从文件中读取数据到存储到进程(process)中,输出流是从进程中读取数据然后写入到目标...
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 ...
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 什么是数据...
java系统源码 #串口通讯应用 1 串口驱动Java层接口 串口驱动Java层接口调用了以下两个native方法: private native static FileDescriptor open(String path, int baudrate, int flags); public native void close()...
源码 java-nio-master java Nio 主要内容: (1) 按操作方式分类结构图: (2)按操作对象分类结构图 IO流的分类: 按照流的流向分,可以分为输入流和输出流; 按照操作单元划分,可以划分为字节流和字符流; 按照...
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作为人机交互的...
1、灵活的文件API:Alluxio的本地API类似于java.io.File类,提供了 InputStream和OutputStream的接口和对内存映射I/O的高效支持。我们推荐使用这套API以获得Alluxio的完整功能以及最佳性能。 2、兼容Hadoop HDFS的...