Java复习7.输入输出流
Java复习7.输入输出流 20131005
前言:
Java中涉及数据的读写,都是基于流的,这一块的知识相当重要,而且在Java中的数据,char字符是16bit的,所以存在字节流和字符流的区别。如果是字符文件的输入输出,使用字符流(以Reader/Writer为抽象基类),而其他的数据是二进制的,需要使用字节流(以InputStream和OutputStream为抽象基类)。
其实不止文件,网络数据传输也是输入输出流。
目录
1.字节流和字符流... 2
1.1字节输入流:... 2
1.2字节输出流:... 5
2.字符流... 6
2.1字符数据流输入:... 6
2.2字符数据流输出:... 7
3.使用缓冲数据流,提高IO的效率,减少IO的次数... 7
3.1缓冲字节流: 8
3.2缓冲字符流:... 9
为了便于理解,附图一张:
1.字节流和字符流
字节流就是数据的基本单位是byte,字符流使用字符组成的,基本单位是char,在Java中char是由两个字节保存的。所有的InputStream/OutputStream的子类都可以用于处理二进制数据,他是按照字节存储的,但是对于字符的文本文件,使用字符流比较好。
首先是字节流,基类是InputStream/OutputStream
1.1字节输入流:
InputStream in = null;
try {
String filePath = ClassLoader.getSystemResource("a.txt").getPath();
System.out.println("FilePath:"+filePath);
/*
* 以字节流的方式打开文件,读取的是一个二进制流 byte[] ,如果不存在该文件,则会抛出异常,FileNotFoundException *
*/
in = new FileInputStream(filePath);
byte[] buf = new byte[100];
// read file from inputstream
/*
* public int read(); read next byte data, if to the file end return -1;
* public int read(byte[] buf);
* Reads up to b.length bytes of data from this input stream into an array of bytes.
* return the total number of bytes read into the buffer, or -1 if there is no more data
* because the end of the file has been reached.
* we should clear the buf or record the read byte number.
*
*/
if(in != null){
/*
* 比较正规的读取方式,这样每一次获取的是一定字节数的byte,保存在响应的字节中,然后
* 将字节数组转换成String输出结果
*/
/*int read_byte_number = -1;
int count = 0;
while( (read_byte_number = in.read(buf, 0, 100)) != -1){
System.out.print(new String(buf,0,read_byte_number));
count++;
}
System.out.println("count:" + count);
*/
/*
* 在文件中的数据,一个ASCII对应的是一个字节,但是一个汉字或者其他的字符,保存在文件中是两个字节
* 我们读取的时候使用read只是读取的一个字节,所以对于ASCII的字符是可以读取出来的,返回值对应的ASCII的int
* 可以将它转换成相应的char;但是对于汉字是不可以的,每次只是读取的一个字符。
*/
int i = in.read();
System.out.println(i+":" + (char)i);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(in != null){
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
1.2字节输出流:
OutputStream out = null;
try {
/*
* if the file does not exist, it will create the file
* if the file exists, but append default is false, it will clear the file write new content
* we can use the parameter append = true to append context to the end
*/
out = new FileOutputStream("b.txt",true);
out.write('腾');
/*
* public void write(int b); 可以是一个char但是,如果在ASCII之外的字符,就只能写一byte结构很坑,不可预期
* public void write(byte[] buf);
* public void write(byte[] buf, int start, int length);
*/
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(out != null){
try {
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2.字符流
使用字节流是不可以处理中文的,这样我们就必须使用字符流。字符流的基类是Reader/Writer
Reader BufferedReader
InputStreamReader FileReader
Writer BufferedWriter
OutputStreamWriter FileWriter
PrintWriter
这几个是常见的使用的。
2.1字符数据流输入:
Reader reader= null;
try {
reader = new FileReader(ClassLoader.getSystemResource("a.txt").getPath());
char[] buf = new char[10];
int count = 0;
while((count = reader.read(buf,0,10)) != -1){
System.out.print(new String(buf,0,count));
}
/*
* use public int read() function return 0x0000~0xffff int value
*/
/*int a;
while((a=reader.read()) != -1){
System.out.println((char)a);
}
*/
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(reader != null){
try {
reader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2.2字符数据流输出:
Writer out = null;
try {
// FileWriter(String filename, boolean append = false);
//FileWriter(File file, boolean append = false);
out = new FileWriter("a.txt",true);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
char buf[] = {'杨','腾','飞','a','b','c'};
if(out != null){
try {
System.out.println(new String(buf,0,buf.length));
out.write(buf, 0, buf.length);
out.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(out != null){
try {
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
3.使用缓冲数据流,提高IO的效率,减少IO的次数
2中的操作数据流的方法特别低效,不适合远程操作或者是大型项目,我们使用缓冲数据流提高IO的性能。
3.1缓冲字节流:
InputStream FileInputStream
FilterInputStream BufferedInputStream
OutputStream FileOutputStream
FilterOutputStream BufferedOutputStream
将FileInputStream/FileOutputStream转换成
BufferedInputStream/BufferedOutputStream
BufferedInputStream bis = null;
try {
bis = new BufferedInputStream(new FileInputStream("a.txt"));
byte [] buf = new byte[10];
int count = -1;
while( (count = bis.read(buf, 0, 10)) != -1){
System.out.print(new String(buf,0,count));
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(bis != null){
try {
bis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
BufferedOutputStream bos = null;
try {
bos = new BufferedOutputStream(new FileOutputStream("b.txt",true));
byte[] buf = null;
String a = "杨腾飞a";
buf = a.getBytes();
bos.write(buf,0,buf.length);
bos.flush();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(bos != null){
try {
bos.flush();
bos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
3.2缓冲字符流:
BufferedReader/BufferedWriter
BufferedReader breader = new BufferedReader(new FileReader(“filename”))
Example:
BufferedReader breader = null;
try {
breader = new BufferedReader(new FileReader("a.txt"));
char[] buf = new char[10];
int count = -1;
while( (count = breader.read(buf, 0, 10)) != -1){
System.out.print(new String(buf,0,count));
}
//每一次获取一行数据,当遇到行结束的时候,终止,返回的是一个字符串,但是不包含换行符。
/*
String a ;
while((a=breader.readLine()) != null){
System.out.println(a);
}
*/
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
缓冲输出流的话,详细你也会了吧,就这样了
在Java 中的输入输出流是十分重要的一个知识点,后面的网络编程也是需要用到这些输入输出流。
追梦的飞飞
于广州中山大学 20131005
HomePage: http://yangtengfei.duapp.com
Java复习7.输入输出流的更多相关文章
- 第27章 java I/O输入输出流
java I/O输入输出流 1.编码问题 import java.io.UnsupportedEncodingException; /** * java涉及的编码 */ public class En ...
- JAVA Io 缓冲输入输出流
java中提供带缓冲的输入输出流.在打开文件进行写入或读取操作时,都会加上缓冲,提高了IO读写性能. 1. BufferedInputStream 缓冲输入流 2. BufferedOutputStr ...
- Java I/O输入输出流详解
一.文件的编码 开发时一定要注意项目默认的编码!!!!!!!! 文件操作的时候一定要记得关闭!!!!!!!! ASCII:美国标准 ...
- Java IO学习--输入输出流
一.Java IO的定义 I/O:输入输出系统,由输入输出控制系统和外围设备两部分组成. Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是基于数据流进行输入输 ...
- java实验8-Java输入输出流
1 读写文件 [实验目的] (1)掌握文本文件的读写方法. (2)掌握随机文件的读写方法. (3)掌握InputStream.OutputStream抽象类的基本使用. (4)掌握FileInputS ...
- Java工具类-输入输出流
输入输出流 1.概念 输入输出流:文件复制,上传 输出流: System.out.println() 写操作,程序将字符流写入到"目的地",比如打印机和文件等 输入流 :Scann ...
- java学习笔记-输入输出流
================File类 =====================InputStream ==================OutputStream ============== ...
- Java中的输入输出流
FileInputStream和FileOutputStream 创建含磁盘文件的输入 输出流对象. FileInputStream继承自InputStream,用于读取本地文件中的字节数据,由于所有 ...
- 《三》Java IO 字节输入输出流
那么这篇博客我们讲的是字节输入输出流:InputStream.OutputSteam(下图红色长方形框内),红色椭圆框内是其典型实现(FileInputSteam.FileOutStream) ...
随机推荐
- 机器学习实战python3 决策树ID3
代码及数据:https://github.com/zle1992/MachineLearningInAction 决策树 优点:计算复杂度不高,输出结果易于理解,对中间值的缺失不敏感,可以处理不相关特 ...
- Selenium(Webdriver)自动化测试常问到的问题解答(转自:潜龙0318)
今天朋友问我了几个关于Selenium自动化测试的问题,我看了一下感觉还比较典型.结合我以往自动化测试的经验,给出了一些儿粗浅的答案,希望能帮大家,如果大家有什么好的看法,希望相互交流,相互学习! ( ...
- Python --之练习题
一,两个小组对战,对战规则如下:team1 = ['a','b','c']team2 = ['x','y','z'] #a 不和x对战,b 不和y,z 对战# for i in team1: #法一# ...
- CSS清除浮动大全的8种方法
清除浮动是每一个 web前台设计师必须掌握的机能.css清除浮动大全,共8种方法. 浮动会使当前标签产生向上浮的效果,同时会影响到前后标签.父级标签的位置及 width height 属性.而且同样的 ...
- 照着官网来安装openstack pike之environment设置
安装openstack前的准备环境: 两个centos7系统的环境:192.168.101.10 node1,192.168.101.11 node2 控制节点node1,计算节点node2 1.统一 ...
- 20145216史婧瑶《Java程序设计》第四次实验报告
实验四 Android环境搭建 实验内容 搭建Android环境 运行Android 修改代码,能输出学号 实验步骤 1.搭建Android环境 2.安装Android,核心是配置JDK.SDK 3. ...
- 20145309《Java程序设计》第八周学习总结
日志 •java.util.logging包提供了日志功能相关类与接口,使用日志的起点是logger类,Logger类的构造函数标示为protected,不是java.util.logging同包的类 ...
- 学Git,用Git ①
本月开始接触到Git版本管理工具,觉得很有意思,在这里总结一下学习Git的一些心得体会. 要在Mac上完整的使用git进行版本管理,需要熟悉Mac终端操作命令和Git操作命令两种命令,索性两种命令加在 ...
- git如何回退单个文件到某一个commit
答:操作步骤如下: 1. git log "filename" (如:git log README) 2. git reset "commit-id" &quo ...
- 手动装配Bean
代码: import org.springframework.context.ApplicationContext; import org.springframework.context.suppor ...