程序中都是以流的形式进行数据的传输和保存,在java.io包中数据流操作的两大类是字节流和字符流。

1. 字节流

  InputStream和OutputStream是所有表示字节流的类的父类,它们都是抽象类,不能实例化。

InputStream抽象类方法:
  public int read(byte b[]){ return read(b, 0, b.length); }      ->从输入流读取数据字节到缓冲区数组b中,并返回实际读取的字节数。
  public int read(byte b[], int off, int len)                             -> 循环调用read(), 从输入流中读取最多 len 个字节。
  public abstract int read();                                                  -> 从输入流读取下一个数据字节,返回int类型值。如果已到达流末尾则返回-1。

  public long skip(long n)
  public int available() throws IOException {return 0;}
  public void close() throws IOException {}

  public boolean markSupported() {return false;}
  public synchronized void mark(int readlimit) {}
  public synchronized void reset() throws IOException { throw new IOException("mark/reset not supported"); }

OutputStream抽象类方法:
  public void write(byte b[]) {write(b, 0, b.length);}   -> 函数体中调用 write(b, 0, b.length);
  public void write(byte b[], int off, int len)               -> 函数体中循环进行单个字符写操作 write(b[off + i]);
  public abstract void write(int b);
  public void flush() {}       -> 刷新此输出流并强制写出所有缓冲的输出字节。
  public void close() {}

public class IOStreamTest {
public static final int BUFFERED_SIZE = 1024; public static void main(String[] args) throws IOException {
testFileStream();
testBufferedStream();
} public static void testFileStream() throws IOException {
FileInputStream fis = new FileInputStream(new File("C://in.txt"));
FileOutputStream fos = new FileOutputStream(new File("C://out.txt"));
byte[] buffer = new byte[BUFFERED_SIZE];
while(true) {
if(fis.available() < BUFFERED_SIZE) {
int remain = -1;
while((remain = fis.read()) != -1) // 单个字符的读写操作
fos.write(remain);
break;
} else {
fis.read(buffer); // 使用缓冲区进行读写操作
fos.write(buffer);
}
}
fis.close();
fos.close();
} public static void testBufferedStream() throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("C:\\in.txt"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("C:" + File.separator +"outb.txt"));
byte[] buffer = new byte[BUFFERED_SIZE];
while(bis.read(buffer) != -1)
bos.write(buffer);
bos.flush(); // 将输入流缓冲区中的数据全部写出
bis.close();
bos.close();
}
}

2. 字符流

  Java中的字符流处理的最基本单位是Unicode码元(大小2字节),一个Unicode代码单元的范围是0x0000~0xFFFF。在以上范围内的每个数字都与一个字符相对应,Java中的String类型默认就把字符以Unicode规则编码后存储在内存中。然而与存储在内存中不同,存储在磁盘上的数据通常有着各种各样的编码方式。使用不同的编码方式,相同的字符会有不同的二进制表示。实际上字符流是这样工作的:

  • 输出字符流:把要写入文件的字符序列(实际上是Unicode码元序列)转为指定编码方式下的字节序列,所以它会使用内存缓冲区来存放转换后得到的字节序列,等待都转换完毕再一同写入磁盘文件中。然后再写入到文件中;
  • 输入字符流:把要读取的字节序列按指定编码方式解码为相应字符序列(实际上是Unicode码元序列从)从而可以存在内存中。
public class IOStreamTest {
public static final int BUFFERED_SIZE = 1024; public static void main(String[] args) throws IOException {
FileReader fr = new FileReader(new File("C://in.txt"));
FileWriter fw = new FileWriter(new File("C://out.txt"));
char[] buffer = new char[BUFFERED_SIZE];
while(fr.read(buffer) != -1)
fw.write(buffer);
fr.close();
fw.close();
}
}

字节流和字符流的区别:

  字符流只能处理文本数据,而字节流既可以操作文本文件,也可以操作非文本文件(二进制文件如图片、视频等); 字节流默认不使用缓冲区;字符流使用缓冲区。

Java 字节流和字符流的更多相关文章

  1. java 字节流和字符流的区别 转载

    转载自:http://blog.csdn.net/cynhafa/article/details/6882061 java 字节流和字符流的区别 字节流与和字符流的使用非常相似,两者除了操作代码上的不 ...

  2. java 字节流和字符流的区别

    转载自:http://blog.csdn.net/cynhafa/article/details/6882061 java 字节流和字符流的区别 字节流与和字符流的使用非常相似,两者除了操作代码上的不 ...

  3. Java进阶(四十五)java 字节流与字符流的区别

    java 字节流与字符流的区别(转载)   字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢?   实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作 ...

  4. java字节流和字符流,以及java文件操作

    A.首先说字节流:1.字节流在操作的时候不会用到缓冲区(也就是内存)2.字节流可用于任何类型的对象,包括二进制对象3.字节流处理单元为1个字节,操作字节和字节数组.InputStream是所有字节输入 ...

  5. java 字节流与字符流的区别

    字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢?实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作 ...

  6. (转)java字节流和字符流的区别

    转载: http://www.cnblogs.com/dolphin0520/category/361055.html 字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同 ...

  7. Java字节流与字符流基本操作

    在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据时要使用输入流读取数据,而当程序需要将一些数据保存起来时,就要使用输出流. 在java.io包中流的操作主要有字节流.字符流两大类,两类都 ...

  8. java 字节流与字符流的区别 (转)

    字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢? 实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操 ...

  9. Java字节流与字符流

    九.字节流与字符流 9.1 IO的分类 <段落>根据数据的流向分为:输入流和输出流. 输入流 :把数据从其他设备上读取到内存中的流. 输出流 :把数据从内存 中写出到其他设备上的流. 数据 ...

  10. java 字节流与字符流的区别详解

    字节流与字符流 先来看一下流的概念: 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入 ...

随机推荐

  1. 【总结整理】WebGIS学习-thinkGIS(三):关于影像金字塔、瓦片行列号、分辨率resolution

    http://www.thinkgis.cn/topic/541a5206da8db186fd0673ba 1.前言 在上一节中我们知道了屏幕上一像素等于实际中多少单位长度(米或经纬度)的换算方法,而 ...

  2. 100211D Police Cities

    传送门 分析 看到这个题我们的第一反应自然是Tarjan缩点,在这之后我们可以发现实际只要在缩点之后所有出度或入度为0的点布置警察局就可以达到要求,我们用dpij表示考虑前i个出度或入度为0的点共布置 ...

  3. Python--详解TKinter类库

    为了学习python3.5的tkinter,于是我去官网找了找相关部件的一些文档,读起来有点绕口,觉得还是自己来实践实践,看看视频感觉用处会更大,然后就有了下面的一部分常用的总结, 查看tkinter ...

  4. 一劳永逸搭建android开发环境(android官网reference sample api tutorial全下载)

    [摘要]本文简单介绍了android开发环境的搭建,重点介绍了SDK manager和AVD升级问题:并提供了android reference,sample,api,及docs的下载信息. [1]为 ...

  5. NPOI读取Excel文件

    public class ExcelOperator { public static List<DataTable> Read(string fileName) { List<Dat ...

  6. JavaScript面向切面编程入门

    来源极客网学习视频 关键词Javascript AOP编程 例子1: function test() { alert(2); } //理解,所谓的传入一个"回调",该怎样设计bef ...

  7. FileInfo类和DirectoryInfo类

    FileInfo类和DirectoryInfo类可以方便地对文件和文件夹进行操作. 1. FileInfo类(非静态类) FileInfo类和File类之间许多方法调用都是相同的,但是FileInfo ...

  8. 删除XML文档中某节点

    前几天Insus.NET在写了一系列XML文档进行操作.创建 <怎样创建XML文档> http://www.cnblogs.com/insus/p/3276944.html       & ...

  9. C++日志模块实现的经验之谈

    以类的方式对日志模块进行封装,可创建一个单实例的接口或创建一个全局的日志对象指针,同时提供相应的对外写日志接口. 写日志的接口采用可变参数来建立,可使用va_list类型和##args参数,同时在写日 ...

  10. js学习路线

    JavaScript 数据类型 JavaScript 变量 Javascript 运算符 JavaScript 流程控制 JavaScript 数组 JavaScript 函数基础 JavaScrip ...