程序中都是以流的形式进行数据的传输和保存,在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. Struts2框架07 Struts2 + Spring + Mybatis 整合

    1 导包 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.o ...

  2. (转)Linux网络协议栈(三)——网络设备(1)

    网络设备(network device)是内核对网络适配器(硬件)的抽象与封装,并为各个协议实例提供统一的接口,它是硬件与内核的接口,它有两个特征:(1)    作为基于硬件的网络适配器与基于软件的协 ...

  3. Qt嵌入式开发环境搭建

    一.Qt版本介绍 按照不同的图形界面来划分,分为四个版本: 1.Win32版:适用于windows平台 2.X11版:适用于各种X系统的Linux和Unix平台 3.Mac版:适用于苹果的MacOS ...

  4. MySQL介绍与安装

    mysql介绍 #mysql就是一个基于socket编写的C/S架构的软件 #客户端软件 mysql自带:如mysql命令,mysqldump命令等 python模块:如pymysql 数据库管理软件 ...

  5. python部分运算符理解

    1.//取整除 5//3得到1 2.%取余 5%3得到2 3.<<左移 2<<2得到8 2用二进制表示为10,向左移两位得到1000,即十进制的8 4.>>右移 1 ...

  6. java 抽象方法

    int 是基本数据类型Integer是其包装类,注意是一个类.为什么要提供包装类呢???一是为了在各种类型间转化,通过各种方法的调用.否则 你无法直接通过变量转化.比如,现在int要转为Stringi ...

  7. Openwrt单独编译某一个模块而不是整个固件

    make package/rt2860v2/compile 就是在make menuconfig那个目录下执行此命令就会编译rt2860v2这个模块

  8. 记一次安装kolla遇到DockerException: Error while fetching server API version: Timeout value connect was Timeout的问题

    1)环境信息: docker版本:17.09,当docker的版本是12.06时,也会报这个错误 [root@localhost ~]# docker --version Docker version ...

  9. 大众点评CAT开源监控系统剖析

    参考文档: 大众点评的实时监控系统分析(一) CAT_source_analyze 透过CAT,来看分布式实时监控系统的设计与实现 深度剖析开源分布式监控CAT [分布式监控CAT] Client端源 ...

  10. Automake基本用法

    一. 确认你的系统安装有GNU的如下软件: 1. automake2. autoconf3. m44. perl5. 如果你需要产生共享库(shared library)则还需要GNU Libtool ...