Java 字节流和字符流
程序中都是以流的形式进行数据的传输和保存,在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 字节流和字符流的更多相关文章
- java 字节流和字符流的区别 转载
转载自:http://blog.csdn.net/cynhafa/article/details/6882061 java 字节流和字符流的区别 字节流与和字符流的使用非常相似,两者除了操作代码上的不 ...
- java 字节流和字符流的区别
转载自:http://blog.csdn.net/cynhafa/article/details/6882061 java 字节流和字符流的区别 字节流与和字符流的使用非常相似,两者除了操作代码上的不 ...
- Java进阶(四十五)java 字节流与字符流的区别
java 字节流与字符流的区别(转载) 字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢? 实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作 ...
- java字节流和字符流,以及java文件操作
A.首先说字节流:1.字节流在操作的时候不会用到缓冲区(也就是内存)2.字节流可用于任何类型的对象,包括二进制对象3.字节流处理单元为1个字节,操作字节和字节数组.InputStream是所有字节输入 ...
- java 字节流与字符流的区别
字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢?实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作 ...
- (转)java字节流和字符流的区别
转载: http://www.cnblogs.com/dolphin0520/category/361055.html 字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同 ...
- Java字节流与字符流基本操作
在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据时要使用输入流读取数据,而当程序需要将一些数据保存起来时,就要使用输出流. 在java.io包中流的操作主要有字节流.字符流两大类,两类都 ...
- java 字节流与字符流的区别 (转)
字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢? 实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操 ...
- Java字节流与字符流
九.字节流与字符流 9.1 IO的分类 <段落>根据数据的流向分为:输入流和输出流. 输入流 :把数据从其他设备上读取到内存中的流. 输出流 :把数据从内存 中写出到其他设备上的流. 数据 ...
- java 字节流与字符流的区别详解
字节流与字符流 先来看一下流的概念: 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入 ...
随机推荐
- sqlplus 连接数据库执行SP
.bashrc export HOME= export LANG="C" .bash_profile #明码 #export LOG_USER=lhcx #export LOG_P ...
- VS2010 rdlc报表无法显示“数据源”选项
- [转]SQL 模糊查询
在进行数据库查询时,有完整查询和模糊查询之分. 一般模糊查询语句如下: SELECT 字段 FROM 表 WHERE 某字段 Like 条件 其中关于条件,SQL提供了四种匹配模式: 1,% :表 ...
- DB2--sql计算时间差和格式化时间
格式化时间 db2 格式化时间使用的 TO_CHAR(TIMESTAMP('2017-10-24 21:18:12'),'YYYY-MM-DD'): 测试sql:SELECT TO_CHAR(TIME ...
- 项目一:第八天 1、前台系统导入 实现客户注册 发验证码,邮件 springdata-redis存储数据 3、实现客户登陆
1 前台系统客户注册功能 页面:signup.html 1.1 验证手机号是否注册(邮箱同样) 1. 使用Jquery-validate插件进行相关校验,使用校验规则 <input type=& ...
- ROS Learning-026 (提高篇-004 A Mobile Base-02) 控制移动平台 --- “分封制”
ROS 提高篇 之 A Mobile Base-02 - 控制移动平台 - "分封制" 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ub ...
- Python 安装 第三方库的安装技巧
Python 安装 第三方库的安装技巧 我的电脑:Windows 10 64位. Python IDE 软件:PyCharm 2016.1.4 Python version : Python 3.5. ...
- HDOJ 1196 Lowest Bit
题目大意是给一个1-100的整数,要求首先转化成2进制,然后从最低位开始数起到不是0的位停止,输出这些位代表队额10进制数 #include <iostream> using namesp ...
- php学习笔记-while循环
while(condition) { func(); //break the loop } while循环的执行顺序是先判断condition是不是true,如果是true,那么就执行while循环体 ...
- python3-字典中存储列表
# Auther: Aaron Fan #示例1:#存储所点披萨的信息pizza = { '外皮':'厚的', '配料列表':['香菇', '奶酪'],}#概述所点的比萨print('您点了一道&qu ...