难道这两天不是特别忙
静下心来复习复习JAVA基础
抽空好好回顾了下IO方面的知识
主要是关于字节流与字符流的一个总结
字节流
顾名思义
以字节为单位进行IO操作
最大的两个父类是
InputStream与OutputStream
都是抽象类
需要通过多态
初始化具体实现的子类来进行读写操作
字符流
顾名思义
是以字符为单位进行IO操作的
一个字符为两个字节
最大的两个父类为
Writer和Reader这两个抽象类
当就字节流与字符流抽象类中的方法来看
其实方法名,返回值类型等都很相似
只是在传入参数部分
字节流的write()方法需要传入的是字节数组
字符流的write()方法需要传入的是字符数组(String也算字符数组?)
但是我们都知道字符数组和字节数组是很容易通过getBytes()和new String()来互换的
字节流和字符流的根本区别显然不在此处
那么到底字节流和字符流的主要区别是什么呢?
一.字节流在操作时不会用到缓冲区(内存),是直接对文件本身进行操作的。而字符流在操作时使用了缓冲区,通过缓冲区再操作文件。
二.在硬盘上的所有文件都是以字节形式存在的(图片,声音,视频),而字符值在内存中才会形成。
上面两点能说明什么呢?
针对第一点,
我们知道,如果一个程序频繁对一个资源进行IO操作,效率会非常低。此时,通过缓冲区,先把需要操作的数据暂时放入内存中,以后直接从内存中读取数据,则可以避免多次的IO操作,提高效率
针对第二点,
真正存储和传输数据时都是以字节为单位的,字符只是存在与内存当中的,所以,字节流适用范围更为宽广
三。字符流其实是通过转换流变化为字节流再进行IO操作
我们知道Reader和Writer都是抽象类,要进行具体的操作,都需要通过多态,利用具体实现的类中具体实现的方法进行操作
比如,我们适用字符流向文件中写入字符串,可能的代码如下
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
public class WriterTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
File f=new File("E:"+File.separator+"test.txt");
Writer writer=new FileWriter(f);
writer.write("Hello World");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
查看FileWriter源码
package java.io;
public class FileWriter extends OutputStreamWriter {
public FileWriter(String fileName) throws IOException {
super(new FileOutputStream(fileName));
}
public FileWriter(String fileName, boolean append) throws IOException {
super(new FileOutputStream(fileName, append));
}
public FileWriter(File file) throws IOException {
super(new FileOutputStream(file));
}
public FileWriter(File file, boolean append) throws IOException {
super(new FileOutputStream(file, append));
}
public FileWriter(FileDescriptor fd) {
super(new FileOutputStream(fd));
}
}
可以轻松发现
FileWriter并非直接是Writer的子类,而是转换流OutputWriter的子类
FileWriter做的唯一的事:就是根据文件名,得到一个OutputStream,然后通过调用父类的构造器传入转换流OutputWriter中
继续查看OutputWriter中代码
package java.io;
import java.nio.charset.Charset;
import java.nio.charset.CharsetEncoder;
import sun.nio.cs.StreamEncoder;
public class OutputStreamWriter extends Writer {
private final StreamEncoder se;
public OutputStreamWriter(OutputStream out, String charsetName)
throws UnsupportedEncodingException
{
super(out);
if (charsetName == null)
throw new NullPointerException("charsetName");
se = StreamEncoder.forOutputStreamWriter(out, this, charsetName);
}
public void write(String str, int off, int len) throws IOException {
se.write(str, off, len);
}
}
我们发现:
在转换流中,其实只是通过传入需要转换的字节流来构造一个StreamEncoder类对象
然后调用此StreamEncoder类对象se来完成write()方法,通过字节流输出
以上只分析了输出流,显然,对于输入流,道理是相同的
分享到:
相关推荐
### Java学习IO流小结——字符流 #### 知识点概述 在Java中,处理文件和数据流是一项基本而重要的任务。IO流是Java语言中处理输入/输出的重要工具,它包括字节流和字符流两大类。本文将重点讨论字符流的相关概念...
JAVA IO流小结 JAVA IO流是指Java语言中用来实现输入/输出操作的机制。IO流是指任何有能力产出数据的数据源对象或者有能力接收数据的数据源对象。他屏蔽了实际的I/O设备处理数据的细节。 一、流的定义和分类 流是...
##### 1.4 字符集小结 通过对ASCII码表、GBK字符集和Unicode字符集的理解,我们可以总结以下几点: - **ASCII码表**:包含基本的英文字符,每个字符使用一个字节编码。 - **GBK字符集**:主要用于中文字符的编码,...
本文将对Android中文件读写的基本原理、字节流与字符流的区别以及输入流和输出流的操作进行深入探讨。 首先,理解Android中文件读写的原理至关重要。所有文件在存储时都是以字节的形式存在的,无论是文本文件还是二...
8. 数据流小结: 在Java I/O编程中,理解不同类型的流及其用途至关重要。字节流和字符流分别处理二进制和文本数据,过滤流提供了额外的功能,管道流实现了线程间的通信,对象流使得对象可以持久化。掌握这些基础,...
Java 中IO流字符流详解及实例 Java 中的 IO 流字符流是指 Java 语言中对基本输入/输出流的扩展,用于处理字符流。字符流是指将文本文件或字符串按照某种编码方案(如 UTF-8、UTF-16BE、GBK 等)序列化为字节序列的...
Java中IO流详解 Java中IO流详解是指Java语言中负责输入输出操作的类库,主要...小结:Java中IO流详解是一个复杂的知识点,包括字节流、字符流和转换流等几个方面。了解Java中IO流的工作原理和使用方法是非常重要的。
4. 字符流和字节流:Java中字符流和字节流是指处理字符和字节的流,包括Reader、Writer、InputStream和OutputStream等类和对象。 5. Java流编程应用:Java流编程有广泛的应用,如文本处理、数据存储、网络通信等。 ...
- **字符流**(Character Streams):以16位字符的形式处理数据。 - `Reader`/`Writer` ### 关键流类型介绍 #### FileInputStream/FileOutputStream - **FileInputStream**:从文件系统中的某个文件中获得输入...
总的来说,Java I/O流系统提供了一个强大的框架来处理各种数据输入输出,无论是字节流还是字符流,都有丰富的类库供开发者选择。理解这些类的功能和使用场景,可以帮助我们编写出高效、稳定的代码。
#### 小结 通过本文的学习,我们不仅深入了解了Java中流的基本概念、分类和使用方法,还掌握了序列化的原理和实现方式。无论是进行数据读写还是对象状态的保存与恢复,掌握流和序列化的相关知识都是Java开发者不可...
响应对象提供两个输出流,字节流(getOutputStream())和字符流(getWriter()),但不能同时使用。 以上就是JavaWeb学习小结的主要内容,这些知识构成了JavaWeb开发的基础,对于理解Web应用的工作原理至关重要。
I/O流处理文件、网络通信等数据传输,分为字节流和字符流,有输入流和输出流之分。异常处理是通过try-catch-finally结构来捕获和处理程序运行时可能出现的问题,保证程序的健壮性。 4. **集合IO** 集合框架与I/O流...
#### 九、小结 Java I/O系统是Java编程的重要组成部分,通过掌握不同的流类及其使用方法,可以有效地处理文件读写、网络通信等常见的输入输出操作。了解I/O流的基本概念、分类以及常用的类和接口,可以帮助开发者更...
### Java语言基础小结 #### 一、JDK, JRE, JVM的关系 - **JVM(Java Virtual Machine)**:Java虚拟机是Java程序跨平台运行的核心,它负责执行Java字节码(.class文件),确保Java程序可以在不同的平台上运行而...
小结 本文介绍了 Java 实现文件拷贝的七种方式,包括使用字节流和字符流实现文件拷贝。这些方式可以根据不同的应用场景和文件类型选择使用。同时,我们也学习了使用缓冲区来提高文件拷贝的速度和效率。
#### 字节流与字符流的区别 - **字节流**操作的最小单位是8位的字节,适用于二进制数据(如图片)。 - **字符流**操作的最小单位是16位的Unicode字符,适用于文本数据。 #### 文件的读取 - **字节流读取** - `...