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

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的方法

    首先,我们需要理解`OutputStream`和`InputStream`这两个核心的I/O类。`OutputStream`是用于写出数据到目的地的流,而`InputStream`则是用于读取数据的流。在Java中,它们是Java.io包下的基础类,提供了多种子类来...

    corejava7源码

    通过源码,我们可以看到InputStream、OutputStream、Reader、Writer以及NIO(New IO)的相关实现,这对于我们进行文件操作、网络通信等非常有帮助。 6. 网络编程:Java提供了Socket和ServerSocket类来进行网络通信...

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

    标签中的"源码"提示我们可能需要深入理解`ServletOutputStream` 和`InputStream` 的内部实现,包括它们如何与网络I/O交互,以及如何处理缓冲区和数据编码等问题。而"工具"可能指的是使用这些流类来构建各种服务器端...

    java源码文档src

    例如,`java.io`包下的`File`类用于文件操作,`InputStream`和`OutputStream`接口及其子类处理输入输出流,`java.nio`包引入了非阻塞I/O模型,提高了性能。通过深入理解这些类和接口,开发者能更好地进行文件操作、...

    Android经典设计源码-IOStreamSample.rar

    《Android经典设计源码-IOStreamSample》是一个深入解析Android平台下I/O流(InputStream和OutputStream)使用的设计实例。在Android开发中,I/O流是处理数据输入输出的基础工具,对于任何涉及文件读写、网络通信的...

    java 源码 java 源码

    这个项目可能会使用Java的I/O流(InputStream/OutputStream)和文件操作类(FileReader/FileWriter)来处理文件内容。GUI方面,它会使用Java Swing组件,如JTextArea、JButton等来构建编辑区域和菜单栏。此外,还...

    Socket案例源码

    在这个“Socket案例源码”中,我们将会深入理解Socket如何用于构建对话监听客户端,并且涉及到了多线程的概念。下面,我们将详细探讨相关知识点。 首先,Socket是基于TCP/IP协议族的通信接口,它允许应用程序通过...

    java初学者学习源码

    Java的InputStream、OutputStream、Reader、Writer等类提供了丰富的功能。源码中可能包含对这些类的使用,从中可以学习到输入输出的基本操作。 6. **多线程**:Java内置了对多线程的支持,Thread类和Runnable接口是...

    ~_~java之经典源码大全~_~

    源码可能展示了InputStream、OutputStream、Reader、Writer及其子类的使用。 7. **反射机制**:Java的反射API能动态获取类的信息并操作对象,源码可能包含Class类的使用、方法的动态调用和字段的访问等。 8. **...

    140个java源码实例源码整理

    6. **I/O流**:Java的I/O流系统非常强大,包括文件读写、网络通信等,实例将展示如何使用InputStream、OutputStream、Reader、Writer等类。 7. **网络编程**:Java提供了Socket编程接口,实例可能包含客户端和...

    android pdf阅读源码

    5. **文件操作**:源码还需要处理PDF文件的读取和保存,可能使用Android的File、InputStream/OutputStream和ContentProvider等API。 6. **事件处理**:为了响应用户的交互,如点击、滚动和触摸手势,源码中会包含一...

    《core java》全部源码

    5. **I/O流**:Java的I/O流系统用于读写文件、网络通信等,源码将展示如何使用InputStream、OutputStream、Reader、Writer以及BufferedReader、BufferedWriter等类进行数据传输。 6. **网络编程**:Java提供了...

    fileManager 文件管理源码

    总的来说,"fileManager 文件管理源码" 是一个集成了文件操作、Web交互、权限控制等多个技术点的系统,对于学习和理解Java Web开发,特别是文件管理相关的功能实现,有着很高的参考价值。深入研究其源码可以帮助我们...

    疯狂Java flashget源码

    3. **网络I/O**:Java的Socket编程和InputStream/OutputStream类是进行网络通信的基础。源码中可能会用到BufferedInputStream和BufferedOutputStream来提高I/O效率,以及HttpURLConnection或HttpClient类来处理HTTP...

    蓝牙聊天 源码

    在这个蓝牙聊天应用中,开发者可能使用了Android的BluetoothAdapter类来检测和管理设备的蓝牙功能,BluetoothSocket类来创建连接,以及InputStream和OutputStream来处理数据的发送和接收。应用通常会有一个用户界面...

    Java Socket实现网络通话源码程序

    - **服务器端**:创建ServerSocket,监听指定端口,调用`accept()`接收客户端连接,然后获取InputStream和OutputStream进行数据交换。 - **数据传输**:客户端和服务器通过各自的InputStream和OutputStream进行...

    Java2核心技术卷二 配套源码

    源码会展示如何使用InputStream、OutputStream、Reader、Writer及其子类进行数据的读写。 5. **异常处理**:Java的异常处理机制通过try-catch-finally语句块来捕获和处理运行时错误。源码会演示如何正确地抛出和...

    rt.jar的源码

    `InputStream`和`OutputStream`是所有输入/输出流的基类,`FileInputStream`和`FileOutputStream`则用于与文件交互。 至于sun目录下的源码,它包含了Oracle JDK特有的实现,如JNI(Java Native Interface)、JVM...

    Android应用源码之IOStreamSample.zip

    总之,`Android应用源码之IOStreamSample.zip`是一个宝贵的资源,可以帮助开发者深入理解Android中IO流的使用,提升对Android源码的理解,并能将其运用到实际项目中,解决数据读写和传输的各种问题。

    JAVA JDK实例开发宝典源码

    6. **输入输出流**:Java的I/O流系统是处理数据传输的关键,源码会涵盖文件读写、网络通信、序列化等场景,让你了解InputStream、OutputStream、Reader、Writer等类的使用。 7. **反射机制**:反射是Java的高级特性...

Global site tag (gtag.js) - Google Analytics