`
Luob.
  • 浏览: 1571436 次
  • 来自: 上海
社区版块
存档分类
最新评论
阅读更多
带行号的缓冲字符流
LineNumberReader
自定义带行号的缓冲字符流


import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;
import java.io.Reader;

/**
 * 基于带行号的 缓冲的类
 */
public class LineNumberRreaderDemo {

	public static void main(String[] args) throws IOException {

		method();
		
		//method_1();
		
	}
	//使用自定义模拟的 行号缓冲类
	public static void method() throws IOException{
		FileReader fr=new FileReader("E:\\workspace4\\exam\\src\\com\\itheima\\day18\\SystemDemo.java");
		
		MyLineNumberReader mnr=new MyLineNumberReader(fr);
		mnr.setLineNumber(101);
		String line=null;
		while((line=mnr.myReadLine())!=null){
			System.out.println(mnr.getLineNumber()+":"+line);
		}
		mnr.close();
	}
	
	//使用java自带的
	public static void method_1() throws IOException{

		FileReader fr=new FileReader("E:\\workspace4\\exam\\src\\com\\itheima\\day18\\SystemDemo.java");
		
		LineNumberReader lnr=new LineNumberReader(fr);
		
		String line=null;
		lnr.setLineNumber(101); //从101开始
		while((line=lnr.readLine())!=null){
			System.out.println(lnr.getLineNumber()+":"+line);
		}
		lnr.close();
		
	}
}



//练习:模拟一个带行号的缓冲区 简化 下面的类
class MyLineNumberReader1 extends MyBufferedReader1{
	private int lineNumber;
	
	MyLineNumberReader1(Reader fr) {
		super(fr);
	}
	public String myReadLine() throws IOException{
		lineNumber++;
		return super.myReaderLine();
	}
	
	public void setLineNumber(int lineNumber){
		this.lineNumber=lineNumber;
	}
	
	public int getLineNumber(){
		return lineNumber;
	}
	
}

//发现下面的 的代码 有重复  
class MyLineNumberReader{
	private Reader r;
	private int lineNumber;
	
	public MyLineNumberReader(Reader r){
		this.r=r;
	}
	
	public void setLineNumber(int lineNumber){
		this.lineNumber=lineNumber;
	}
	
	public int getLineNumber(){
		return lineNumber;
	}
	
	public String myReadLine() throws IOException{
		StringBuilder sb=new StringBuilder();
		lineNumber++;
		int ch=0;
		while((ch=r.read())!=-1){
			if(ch=='\r')
				continue;
			if(ch=='\n')
				return sb.toString();
			else
				sb.append((char)ch);
		}
		if(sb.length()>0)
			return sb.toString();
		
		return null;
		
	}
	
	public void close() throws IOException{
		r.close();
	}
	
}


字节流

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 字符流
 * Writer
 * Reader
 * 
 * FileWriter
 * FileReader
 * 
 * BufferedWriter
 * BufferedReader
 * 
 * 字节流
 * InputStream
 * OutputStream
 * 
 * BufferedInputStream
 * BufferedOutputStream
 *
 *需求: 想要操作图片数据,这是就需要用到字节流
 */
public class FileStream {

	public static void main(String[] args) throws IOException {
		
		 //	writeFile();
		System.out.println("开始");
		//readFile_1();
		//readFile_2();
		readFile_3();
		System.out.println("结束");
	}
	
	public static void writeFile() throws IOException{
		
		FileOutputStream fos=new FileOutputStream("fos.txt");
		fos.write("abc".getBytes()); //发现没有关闭 ,没有  刷新 文件中也有 文本了
		fos.close();  //不写时候 ,文件中有文本
		
	}

	//一次读取一个 
	public static void readFile_1() throws IOException{
		FileInputStream fis=new FileInputStream("fos.txt");
		int ch=0;
		while((ch=fis.read())!=-1){
			System.out.println((char)ch);
		}
		fis.close();
	}
	
	//一次读取一个数组
	public static void readFile_2() throws IOException{
		FileInputStream fis=new FileInputStream("fos.txt");
		
		byte[] buf=new byte[1024];
		int len=0;
		while((len=fis.read(buf))!=-1){
			System.out.println(new String(buf,0,len));
		}
		fis.close();
		
	}
	
	//返回文档的长度
	public static void readFile_3() throws IOException{
		FileInputStream fis=new FileInputStream("fos.txt");
		byte[] buf=new byte[fis.available()];  //定义好一个刚刚好大小的缓冲区
		
		int num=fis.available();  //数据不大的时候  可以这样使用 ,拷贝大的电影的时候.
		System.out.println("文件中字符数量="+num);
		fis.read(buf);
		
		System.out.println(new String(buf));
		
		fis.close();
	}
	
}

字节流 练习:复制一个图片

import java.io.FileInputStream;
import java.io.FileOutputStream;

/**
 * 字节流 练习:复制一个图片
 * 
 * 思路:
 *    1)用字节流读取流对象和图片关联
 *    2)使用字节流对象创建一个图片文件,用于存储获取到的图片数据.
 *    3)通过循环读写,完成数据的存储.
 *    4)关闭资源.
 */
public class CopyPic {
	public static void main(String[] args) {
		copyPic();
	}
	
	public static void copyPic(){
		FileInputStream fis=null;
		FileOutputStream fos=null;
		try {
			fis=new FileInputStream("c:\\1.jpg");
			fos=new FileOutputStream("c:\\2.jpg");
			byte[] buf=new byte[1024];
			int len=0;
			while((len=fis.read(buf))!=-1){
				fos.write(buf,0,len);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			if(fis!=null)
				try {
					fis.close();
				} catch (Exception e) {
					e.printStackTrace();
				}
			if(fos!=null)
				try {
					fos.close();
				} catch (Exception e) {
					e.printStackTrace();
				}
		}
		
		
		
	}

}

* 演示mp3的复制,通过缓冲区完成

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 演示mp3的复制,通过缓冲区 
 *	BufferedInputStream
 *	BufferedOutputStream
 *	
 */
public class CopyMp3 {
	public static void main(String[] args)throws IOException {
		
		long start=System.currentTimeMillis();
		//copy_1();
		copy_2();//速度快 1000ms
		long end=System.currentTimeMillis();
		System.err.println(end-start);
	}
	
	
	//一个一个的读取 然后 一个一个的写 
	public static void copy_1() throws IOException{
		BufferedInputStream bufis=new BufferedInputStream(new FileInputStream("D:\\Kugou\\元若蓝 - 绿袖子.mp3"));
		BufferedOutputStream bufos=new BufferedOutputStream(new FileOutputStream("C:\\元若蓝 - 绿袖子.mp3"));
		
		int by=0;
		while((by=bufis.read())!=-1){
			bufos.write(by);
		}
		bufis.close();
		bufos.close();
	}

	//每次读取一个数组 ,然后写一个 
	public static void copy_2()throws IOException{
		BufferedInputStream bufis=new BufferedInputStream(new FileInputStream("D:\\Kugou\\元若蓝 - 绿袖子.mp3"));
		BufferedOutputStream bufos=new BufferedOutputStream(new FileOutputStream("C:\\元若蓝 - 绿袖子.mp3"));
		
		byte[] buf=new byte[1024];
		int len=0;
		while((len=bufis.read(buf))!=-1){
			bufos.write(buf,0,len);
		}
		bufis.close();
		bufos.close();
		
	}
	
}


自定义字节流缓冲区

import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

public class MyBufferedInputStreamDemo {

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		
		MyBufferedInputStream mbufis=new MyBufferedInputStream(new FileInputStream("D:\\Kugou\\元若蓝 - 绿袖子.mp3"));
		BufferedOutputStream bufos=new BufferedOutputStream(new FileOutputStream("C:\\元若蓝 - 绿袖子.mp3"));
		
		int by=0;
		while((by=mbufis.myRead())!=-1){
			bufos.write(by);
		}
		mbufis.myClose();
		bufos.close();
	}

}

class MyBufferedInputStream{
	private InputStream in;
	private byte[] buf=new byte[1024];
	private int pos=0,count=0;
	
	MyBufferedInputStream(InputStream in){
		this.in=in;
	}	
	
	//一次读取一个字节,从缓存区(字节数组)获取.
	public int myRead() throws IOException{
		//通过in对象读取硬盘上的数据,并存储咋buf中
		if(count==0){
			count=in.read(buf);
			if(count<=0)
				return -1;
			pos=0;
		}
		byte b=buf[pos];
		pos++;
		count--;
		return b&0xff;
	}
	
	
	public void myClose() throws IOException{
		in.close();
	}
}
0
3
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics