Java I/O流操作(二)---缓冲流[转]
转自:http://blog.csdn.net/johnny901114/article/details/8710403
bw.flush();
其实BufferReader也是差不多的,这里就不多讲
FileReader fr =new FileReader("test.txt");
BufferedReader br =new BufferedReader(fr);
String line =null;
//注意readLine方法读取的内容不包括换行符
while((line=br.readLine())!=null){
System.out.println(line);
}
package i18n;
public class test {
}
class Person {
public void eat() {
System.out.println("吃饭");
}
}
public class PersonEnhance {
private Person p;
// 把需要增强 的类传进去初始化
public PersonEnhance(Person p) {
this.p = p;
}
public void enhanceEat() {
System.out.println("开胃酒");
p.eat();
System.out.println("甜点");
}
}
但是这让我想到了java 的动态代理,他也是在某个方法的基础上增加额外的功能,那么她们有什么区别呢?
装饰类和被装饰的类是应该继承或实现相同的接口,而java的动态代理不是,

setLineNumber(int) andgetLineNumber() 方法分别设置获取行号public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("test.txt");
LineNumberReader lnr = new LineNumberReader(fr);
String num = null;
while ((num = lnr.readLine()) != null) {
System.out.println(lnr.getLineNumber() + ":" + num);
}
}
控制台输出:

public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("test.txt");
LineNumberReader lnr = new LineNumberReader(fr);
String num = null;
// 设置行号的开始值为100
lnr.setLineNumber(100);
while ((num = lnr.readLine()) != null) {
System.out.println(lnr.getLineNumber() + ":" + num);
}
}
输出结果为:

public String readLine() throws IOException {
int lineNumber=0;
lineNumber++;
StringBuilder buffer =new StringBuilder();
int i = 0;
while ((i =reader.read()) != -1) {
if ((char) i =='\r') {
continue;
}
if ((char) i =='\n') {
return buffer.toString();
}else {
buffer.append((char) i);
}
}
if (buffer.length() != 0) {
return buffer.toString();
}
return null;
}
public static void writeData()throws Exception{
OutputStream out =new FileOutputStream("D:\\test2.txt");
out.write("hello inputStream!".getBytes());
}
public static void readData() throws Exception {
InputStream is = new FileInputStream("D:\\test2.txt");
int num = 0;
while ((num = is.read()) != -1) {
System.out.println((char) num);
}
}
但是这样效率比较低,因为读取一次写一次,我们可以使用缓冲:
public static void readData2()throws Exception {
InputStream is =new FileInputStream("D:\\test2.txt");
int num = 0;
byte[] buffer =newbyte[1024];
//把读取到的数据放进字节数组里面
while ((num = is.read(buffer)) != -1) {
System.out.println(new String(buffer, 0, num));
}
}
在InputStream类中有这样一个方法available()返回int 他的作用是返回文件内容的长度 那么我们就可以这样读取数据,而不用while循环了
public static void readData3()throws Exception {
InputStream is =new FileInputStream("D:\\test2.txt");
//返回文件的长度
int num = is.available();
把字节数组的长度定义成文件长度,那么这个数组就刚好装下这个文件了
byte[] buffer =newbyte[num];
is.read(buffer);
System.out.println(new String(buffer));
}
InputStream is = new FileInputStream("D:\\imagetest\\desk.jpg");
OutputStream os = new FileOutputStream("E:\\desk1.jpg");
byte[] buffer = new byte[1024];
int readNum = 0;
int a=0;
while((readNum=is.read(buffer))!=-1){
System.out.println(a++);
os.write(buffer, 0, readNum);
}
使用java缓冲输出流
BufferedOutputStream buffOs =new BufferedOutputStream(new FileOutputStream("F:\\KuGou\\baby2 - baby one more time.mp3"));
BufferedInputStream buffIs =new BufferedInputStream(new FileInputStream("F:\\KuGou\\baby - baby one more time.mp3"));
int len = 0;
while((len=buffIs.read())!=-1){
buffOs.write(len);
}
buffOs.close();
buffIs.close();
public static void main(String[] args) throws IOException {
InputStream is = System.in;
StringBuilder buffer = new StringBuilder();
int i = 0;
while (true) {
i = is.read();
if ('\r' == i)
continue;
if ('\n' == i) {
String value = buffer.toString();
// 如果录入的是over那么则退出
if ("over".equals(buffer.toString()))
break;
System.out.println(value);
// 清空缓冲区 以免下次录入时不会和前面录入的汇合
buffer.delete(0, buffer.length());
} else {
buffer.append((char) i);
}
}
}
System.out.println(is.read());
public static void main(String[] args) throws IOException {
InputStream is = System.in;
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line = null;
while ((line = br.readLine()) != null) {
if (line.equals("over")) {
break;
}
System.out.println(line.toUpperCase());
}
}
对应的OutputStreamWriter是字符流向字节流转换的桥梁 也就是读进来的是字符,写进去的是字节,在上面的基础上我们可以这样改写:
public static void main(String[] args) throws IOException {
InputStream is = System.in;
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
OutputStreamWriter osw = new OutputStreamWriter(System.out);
BufferedWriter bw = new BufferedWriter(osw);
String line = null;
while ((line = br.readLine()) != null) {
if (line.equals("over")) {
break;
}
bw.write(line);
// 注意使用字符流要注意flush
bw.flush();
// System.out.println(line.toUpperCase());
}
}

Java I/O流操作(二)---缓冲流[转]的更多相关文章
- JAVA基础复习与总结<八> 缓冲流_数据流_对象流_IO总结
缓冲流.数据流以及对象流 一.缓冲流 缓冲流的概念:在读写的时候,对于单字节的读取会造成硬盘的频繁读写,增加访问次数,降低了读取文件的效率.而引入缓冲流之后,就可以将多个字节写入缓冲区,在缓冲区积累之 ...
- Java IO流之【缓冲流和文件流复制文件对比】
与文件流相比,缓冲流复制文件更快 代码: package Homework; import java.io.BufferedOutputStream; import java.io.File; imp ...
- 使用文件流与使用缓冲流完成文件的复制操作性能对比,文件流 FileInputStream FileOutputStream 缓冲流: BufferedInputStream BufferedOutputStream
package seday06; import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOExc ...
- File类与常用IO流第八章——缓冲流
第八章.缓冲流 缓冲流概述 缓冲流,也叫高效流,是对4个基本的FileXxx流的增强.按照数据类型分为4类: 输入缓冲流 输出缓冲流 字节缓冲流 BufferedInputStream Buffe ...
- JAVA基础学习day20--IO流二-缓冲流、字节流
一.缓冲流 1.1.字符流的缓冲区 缓冲区的出现是为了提高IO的读写效率 对应类 BufferedReader BufferedWriter 缓冲区要结合流才可以使用 在流的基础上对流的功能进行了增强 ...
- java写文件读写操作(IO流,字节流)
package copyfile; import java.io.*; public class copy { public static void main(String[] args) throw ...
- Java IO流之字符缓冲流
字符流: 1.加入字符缓存流,增强读取功能(readLine) 2.更高效的读取数据 BufferedReader 从字符输入流读取文本,缓冲各个字符,从而实现字符.数组和行的高效读取. FileRe ...
- java IO流之三 使用缓冲流来读写文件
原文:http://blog.csdn.net/haluoluo211/article/details/52183219 一.通过BufferedReader和BufferedWriter来读写文件 ...
- Java - IO System类支持和缓冲流
System类的支持和缓冲流 System类对IO的支持 在System类中,为了支持IO操作提供了三个常量: 错误输出: public static final PrintStream err; 输 ...
随机推荐
- poj2864
#include<iostream> #include<cstdio> #include<cmath> using namespace std; int main ...
- mysql SELECT FOUND_ROWS()与COUNT(*)用法区别
在mysql中 FOUND_ROWS()与COUNT(*)都可以统计记录,如果都一样为什么会有两个这样的函数呢,下面我来介绍SELECT FOUND_ROWS()与COUNT(*)用法区别 SEL ...
- [置顶] hdu4747 Mex 线段树
题意:给你一个序列,让你求出对于所有区间<i, j>的mex和,mex表示该区间没有出现过的最小的整数. 思路:从时限和点数就可以看出是线段树,并且我们可以枚举左端点i, 然后求出所有左端 ...
- UIScrollview不全屏,解决方案
self.edgesForExtendedLayout = UIRectEdgeNone;
- 一个tabBarController管理多个Storyboard
随着项目的业务逻辑越来越复杂,随着项目越来越大,那么我们Storybard中得控制器就越来越多, 就越来越难以维护.然而使用Storyborad又能更方便的帮助我们做屏幕适配(PS:尤其在6.6+出来 ...
- DDL
在DDL(Data Definition Language)中,创建.删除.修改使用create.drop.alter关键字 数据库的创建 create database 数据库名选择数据库 use ...
- DOM 样式操作
通过js动态的修改样式 更新样式的方法:一.使用.style方法修改样式,缺点是使样式混杂在js中,再次修改不易.二.更新class属性,更改样式.三.一次性更改很多元素样式(如换肤操作),更改样式表 ...
- C/C++中的far和near两个指针
Dos 的设计是基于16位的CPU的,也就是CPU中的每个寄存器(Register)只有16位,只能存放0-65535(64K)的值.为了能访问大于64K的内存,人们用了分段的方法,用两个16位的数来 ...
- Vim配置 终端背景色配置
在终端下使用vim进行编辑时,默认情况下,编辑的界面上是没有显示行号.语法高亮度显示.智能缩进 等功能的.为了更好的在vim下进行工作,需要手动设置一个配置文件:.vimrc.在启动vim时,当前用户 ...
- php Mysql 和Mysqli数据库函数整合
PHP Mysql和Mysqli数据库函数整合 服务器如果支持mysqli函数将优先mysqli函数进行数据库操作 否则将调用mysql函数进行数据库操作 用法SQL::connect(host,us ...