LineNumberReader

跟综行号的缓冲字符输入流,些类定义了setLineNumber(int)和getLineNumber(int),它们可分别用于设置和获取当前行号

import java.io.*;
class LineNumberReaderDemo{
	public static void main(String []args) throws IOException{
		FileReader fr=new FileReader("PersonDemo.java");
		LineNumberReader lnr=new LineNumberReader(fr);
		String line=null;
		lnr.setLineNumber(100);//可以定义它从100开始
		while((line=lnr.readLine())!=null{
			System.out.println("lnr.getLineNumber()+":"+line");//调用LineNumberReader方法
		}
		lnr.close();//关闭流

	}
}

自定义一个LineNumberReader并实现里面的方法:

import java.io.*;
class MyLineNumberReader{
	private Reader r;
	private int lineNumber;
	MyLineNumberReader(Reader r){//将被包装的对象传递进来
		this.r=r;
	}
	public String myReadLine() throws IOException{
		lineNumber++;
		StringBuilder sb=new StringBuilder();
		int ch=0;
		while((!ch=r.read()!=-1){
			if(ch=='\r')
			continue;
			if(ch=='\n')
			else //进行添加到缓冲区里
			return sb.toString();
			sb.append((char)ch);
		}
		if(!sb.length()!=0)
			return sb.toString();
		return null;
	}
	public void setLineNumber(int lineNumber){
		this.lineNumber=lineNumber;
	}
	public void getLineNumber(){
		return lineNumber;
	}

	public void myclose(){
		r.close();
	}
}
class MyLineNumberReaderDemo{
	public static void main(String[] args) throws IOException{
		FileReader fr=new FileReader("buf.java");
		MyLineNumberReader mylnr=new MyLineNumberReader(fr);
		String line=null;
		while((line=mylnr.readLine())!=null){
			System.out.println(mylnr.getLineNumber()+":"+line);
		}
		mylnr.myClose();
	}
}

优化后的自定义类:注意区别

import java.io.*;
class MyLineNumberReader extends MyBufferedReader{

	private int lineNumber;
	MyLineNumberReader(Reader r){//将被包装的对象传递进来
		super(r);
	}
	public String myReadLine() throws IOException{
		lineNumber++;
		return super.myReadLine(r);
	}
	public void setLineNumber(int lineNumber){
		this.lineNumber=lineNumber;
	}
	public void getLineNumber(){
		return lineNumber;
	}

}

字符流:

FileReader

FileWriter

BufferedReader

BufferedWriter



字节流:

InputStream (读)

OutputStream (写)

字符流使用的是字节数组byte[],能操作很多媒体文件。

需求:想要操作图片数据。这时就要用到字节流。

import java.io.*;
class FileStream{
	public void static void(String[] args){
		writeFile();//结果是写入abcde到fos.txt
		readFile();//结果是a,b,c,d,e(不是一行)
		readFile1();//结果是abcde(是一行)
		readFile2();//结果是5,返回字节流的个数。
	}
	public static void readFile2()throws IOException{
		FileInputStream fis=new FileInputStream("fos.txt");
		//int num=fis.available();
		//System.out.println(num);
		byte[] buf=new byte[fis.available()];//定义一个刚刚好的缓冲区,不用再循环了。
		fis.read(buf);
		System.out.println(new String(buf);
		fis.close();
	}

	public static void readFile1()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()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 WriteFile() throws IOException{
		FileOutputStream fos=new FileOutStream("fos.txt");
		String =get
		fos.write("abcde".getBytes());
		fos.close();//关闭流
	}
}

字符流本质上走的是字节,但是它要把字节临时存起来。如一个中文有两个字节。

复制一个图片

1.用字节读取流对象和图片关联

2.用字节写入流对象创建一个图片文件,用于存储到的图片数据

3.通过循环读写,完成数据的存储

4.关闭资源

字符流也是可以复制图片的,但是复制后的图片可能看不了。因为读一段要去编码表里面查表,而字节码在读取的过程中可能会发生变化,所以可能看不了。字符流只用来处理文字数据。

import java.io.*;
class CopyPic{
	public static void main(){
		FileOutputStream fos=null;
		FileIntputStream fis=null;
		try{
			fos=new FileOutputStream(c:\\2.jpg);
			fis=new FileIutputStream(c:\\1.jpg);
			byte [] buf=new byte[1024];
			int len=0;
			while((len=fis.read(buf))!=-1){
				fos.write(buf,0,len);
			}
		}catch(IOException e){
			throw new RuntimeException("复制文件失败");
		}finally{
			try{
			  if(fis!=null)
			  fis.close();
			}catch(IOException e){
				throw new RuntimeException("读取关闭失败");
			}
			try{
			  if(fos!=null)
			  fos.close();
			}catch(IOException e){
				throw new RuntimeException("写入关闭失败");
			}
		}
	}
}

一个mp3文件的复制,通过缓冲区:

import java.io.*;
class CopyMp3{
	public  static void main(String[] args) throws IOException{
		long start=System.out.currentTimeMillis();
		copy();
		long end=System.out.currentTimeMillis();
		System.out.println((end-start)+"毫秒");//输出一共消耗了多长时间
	}
	public static void copy() throws IOException{
		BufferedInputStream bufis=new BufferedInputStream(new FileInputStream(c:\\ylzs.mp3));
		BufferedOnputStream bufis=new BufferedOnputStream(new FileOnputStream(D:\\ylzs.mp3));
		//上面的缓冲区里面都是数组。
		itn by=0;
		while((by=bufis.read())!=-1){
			bufos.writer(by);//写入
		}
		bufos.close();
		bufis.close();

	}
}

import java.io.*;
class MyBufferedInputStream{
	private InputStream in;
	private byte[] buf=new byte[1024*4];
	private int pos=0,count=0;
	MyBufferedInputStream (InputStream in){
		this.in=in;
	}
	//一次读取一个字节,从缓冲区(字节数组)获取
	public int myRead()throw IOException{
		//通过in对象读取硬盘上的数据,并存储在buf中,
		if(count==0){
	   	count=in.read(buf);//记录个数
			byte b=buf(pos);
			pos=0;
			count--;
			pos++;
			return b&0xff;
		}else if(count>0){
			byte b=buf(pos);
			pos=0;
			count--;
			pos++;
			return b&0xff;
		}
		return -1;
	}
	public void myClose(){
		in.close();
	}
}



mp3文件都是由二进制组成的。

一个f是4个1

byte:-1  ----> int :-1

11111111  ---->提升了一个int类型,

那么我只要在前面补0,即可以保留原字节数据不变,又可以避免-1的出现。相与,与后8进行相与。read方法在做提升,write在做强转

                                                   11111111

00000000 00000000 00000000 11111111

--------------------------------------------------------

00000000 00000000 00000000 11111111

Java基础---Java---IO流-----LineNumberReader方法及原理、自定义一个LineNumberReader、字节流、图片复制、mp3复制、的更多相关文章

  1. java基础之IO流(二)之字符流

    java基础之IO流(二)之字符流 字符流,顾名思义,它是以字符为数据处理单元的流对象,那么字符流和字节流之间的关系又是如何呢? 字符流可以理解为是字节流+字符编码集额一种封装与抽象,专门设计用来读写 ...

  2. java基础之IO流(一)字节流

    java基础之IO流(一)之字节流 IO流体系太大,涉及到的各种流对象,我觉得很有必要总结一下. 那什么是IO流,IO代表Input.Output,而流就是原始数据源与目标媒介的数据传输的一种抽象.典 ...

  3. Java基础之IO流整理

    Java基础之IO流 Java IO流使用装饰器设计模式,因此如果不能理清其中的关系的话很容易把各种流搞混,此文将简单的几个流进行梳理,后序遇见新的流会继续更新(本文下方还附有xmind文件链接) 抽 ...

  4. Java中的IO流,Input和Output的用法,字节流和字符流的区别

    Java中的IO流:就是内存与设备之间的输入和输出操作就成为IO操作,也就是IO流.内存中的数据持久化到设备上-------->输出(Output).把 硬盘上的数据读取到内存中,这种操作 成为 ...

  5. 【java基础】]IO流

    IO流 概念: 流的概念源于unix中管道(pipe)的概念,在unix中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备,外部文件等 一个流,一定能够会有源和去向(目的地),他 ...

  6. java基础之 IO流

    javaIO流   IO流 : (input  output) 输入输出流 :输入 :将文件读到内存中 输出:将文件从内存输出到其他地方.   IO技术的作用:主要就是解决设备和设备之间的数据传输问题 ...

  7. java基础44 IO流技术(输出字节流/缓冲输出字节流)和异常处理

    一.输出字节流 输出字节流的体系: -------| OutputStream:所有输出字节流的基类(抽象类) ----------| FileOutputStream:向文件输出数据的输出字节流(把 ...

  8. Java基础系列——IO流

    ---恢复内容开始--- Java对数据的操作都是通过流的方式,数据的输入和输出是相对内存来说的,将外设的数据读到内存:输入流:将内存的数据写到外设:输出流. 流按操作数据分为两种:字节流,字符流. ...

  9. 黑马程序员——JAVA基础之IO流FileReader,FileWriter

    ------- android培训.java培训.期待与您交流! ---------- IO(Input Output)流  IO流用来处理设备之间的数据传输 Java对数据的操作是通过流的方式 J ...

  10. java基础06 IO流

    IO用于在设备间进行数据传输的操作. Java IO流类图结构:   IO流分类 字节流: InputStream FileInputStream BufferedInputStream Output ...

随机推荐

  1. 51Nod 1530 稳定方块

    瓦西亚和皮台亚摆放了m个方块.方块被编号为0到m-1(每个号码出现恰好一次).现在建立一个座标系OX表示地面,OY的方向是竖直向上的.每一方块的左下角有一个座标而且是整点座标. 摆放好的方块一定要是稳 ...

  2. [HNOI2006]超级英雄

    题目描述 现在电视台有一种节目叫做超级英雄,大概的流程就是每位选手到台上回答主持人的几个问题,然后根据回答问题的多少获得不同数目的奖品或奖金.主持人问题准备了若干道题目,只有当选手正确回答一道题后,才 ...

  3. [bzoj4883][Lydsy2017年5月月赛]棋盘上的守卫

    来自FallDream的博客,未经允许,请勿转载, 谢谢. 在一个n*m的棋盘上要放置若干个守卫.对于n行来说,每行必须恰好放置一个横向守卫:同理对于m列来说,每列 必须恰好放置一个纵向守卫.每个位置 ...

  4. 使用JAXB解析xml文件(二)

    前面一章简单演示了JAXB的用法,这个章节主要梳理一下JAXB常见的几个注解 1.@XmlRootElement 用于类级别的注解,对应xml的跟元素,常与 @XmlType 和 @XmlAccess ...

  5. Python【第二课】 字符串,列表,字典,集合,文件操作

    本篇内容 字符串操作 列表,元组操作 字典操作 集合操作 文件操作 其他 1.字符串操作 1.1 字符串定义 特性:不可修改 字符串是 Python 中最常用的数据类型.我们可以使用引号('或&quo ...

  6. mysql 使用问题?

    linux中安装了mysql客户端和服务器端,为什么无法使用,总是报错呢 解决办法:使用dpkg -r mysql命令删除掉mysql-client和mysql-server了,还是不行,而且查看软件 ...

  7. js匿名函数,闭包

    http://www.cnblogs.com/chenxianbin89/archive/2010/01/28/1658392.html

  8. jquery easyui datagrid改变某行的值

    $("#DeterminateMembers").datagrid("updateRow",{index:index,row:{fzr:"0" ...

  9. Algorithm in Practice - Sorting and Searching

    Algorithm in Practice Author: Zhong-Liang Xiang Date: Aug. 1st, 2017 不完整, 部分排序和查询算法, 需添加. Prerequisi ...

  10. Docker 第一篇 认识Docker 的作用好处

    Docker 第一篇 认识Docker 的作用好处 (1)什么是Docker (2)Docker 优势劣势 Docker是去年开始关注并学习的,因为项目用到了AspnetCore 了解了之后总感觉会用 ...