Java基础---Java---IO流-----LineNumberReader方法及原理、自定义一个LineNumberReader、字节流、图片复制、mp3复制、
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复制、的更多相关文章
- java基础之IO流(二)之字符流
java基础之IO流(二)之字符流 字符流,顾名思义,它是以字符为数据处理单元的流对象,那么字符流和字节流之间的关系又是如何呢? 字符流可以理解为是字节流+字符编码集额一种封装与抽象,专门设计用来读写 ...
- java基础之IO流(一)字节流
java基础之IO流(一)之字节流 IO流体系太大,涉及到的各种流对象,我觉得很有必要总结一下. 那什么是IO流,IO代表Input.Output,而流就是原始数据源与目标媒介的数据传输的一种抽象.典 ...
- Java基础之IO流整理
Java基础之IO流 Java IO流使用装饰器设计模式,因此如果不能理清其中的关系的话很容易把各种流搞混,此文将简单的几个流进行梳理,后序遇见新的流会继续更新(本文下方还附有xmind文件链接) 抽 ...
- Java中的IO流,Input和Output的用法,字节流和字符流的区别
Java中的IO流:就是内存与设备之间的输入和输出操作就成为IO操作,也就是IO流.内存中的数据持久化到设备上-------->输出(Output).把 硬盘上的数据读取到内存中,这种操作 成为 ...
- 【java基础】]IO流
IO流 概念: 流的概念源于unix中管道(pipe)的概念,在unix中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备,外部文件等 一个流,一定能够会有源和去向(目的地),他 ...
- java基础之 IO流
javaIO流 IO流 : (input output) 输入输出流 :输入 :将文件读到内存中 输出:将文件从内存输出到其他地方. IO技术的作用:主要就是解决设备和设备之间的数据传输问题 ...
- java基础44 IO流技术(输出字节流/缓冲输出字节流)和异常处理
一.输出字节流 输出字节流的体系: -------| OutputStream:所有输出字节流的基类(抽象类) ----------| FileOutputStream:向文件输出数据的输出字节流(把 ...
- Java基础系列——IO流
---恢复内容开始--- Java对数据的操作都是通过流的方式,数据的输入和输出是相对内存来说的,将外设的数据读到内存:输入流:将内存的数据写到外设:输出流. 流按操作数据分为两种:字节流,字符流. ...
- 黑马程序员——JAVA基础之IO流FileReader,FileWriter
------- android培训.java培训.期待与您交流! ---------- IO(Input Output)流 IO流用来处理设备之间的数据传输 Java对数据的操作是通过流的方式 J ...
- java基础06 IO流
IO用于在设备间进行数据传输的操作. Java IO流类图结构: IO流分类 字节流: InputStream FileInputStream BufferedInputStream Output ...
随机推荐
- dp之背包总结篇
//新手DP学习中 = =!! 前言:背包问题在dp中可以说是经典,作为一个acmer,到现在才正式学习dp,可以说是比较失败的.我个人比较认同一点,想要做一个比较成功的acmer,dp.搜索.数学必 ...
- hdu5569 BestCoder Round #63 (div.2)
题意: 给你一个矩阵,要求从左上角走到右下角,走个的费用:a[1]*a[2] + a[3]*a[4] + ......+ a[2n-1]*a[2n] 思路: 果然不机智,自己把自己套路了 对于每个奇数 ...
- urllib,request 设置代理
通常防止爬虫被反主要有以下几个策略: 1.动态设置User-Agent(随机切换User-Agent,模拟不同用户的浏览器信息) 2.使用IP地址池:VPN和代理IP,现在大部分网站都是根据IP来b ...
- input中v-model和value不能同时调用时解决方案
<input type="text" v-model="keyWord" value="请输入地名地址" > 当使用如上代码时, ...
- Safari 3D transform变换z-index层级渲染异常
(猛戳来源:http://www.zhangxinxu.com/wordpress/?p=5569)
- 数据挖掘_requests模块的get方法
关于requests模块 之前在跟大家讲通过字典列表批量获取数据的时候用过这个模块 安装过程就不再讲解了 requests模块是python的http库,可以完成绝大部分与http应用相关的工作,所以 ...
- angular2+ionic2架构介绍
不要用angular的语法去写angular2,有人说二者就像Java和JavaScript的区别. 1. 项目所用:angular2+ionic2+typescript 2. 项目结构 3. S ...
- 用burpsuite暴力破解后台
[实验原理] Burp Suite是Web应用程序测试的最佳工具之一,其多种功能执行各种任务.请求的拦截和修改,扫描web应用程序漏洞,以暴力破解登录表单,执行会话令牌等多种的随机性检查. Burp ...
- Laravel-admin 七牛云上传文件到七牛云出现卡顿失败情况
由于所做项目需要管理后台众多,所以选择了Laravel-admin后台框架进行开发.节省了权限控制以及页面处理等问题的时间 Laravel-admin文档地址 http://laravel-admin ...
- Kinect2.0 MultiSourceFrameReader 的 AcquireLatestFrame 方法获取不到帧的解决方案
先把大致要写的东西写一下,手里的活忙完了再完善. 在代码中使用下边的语句,获取Kinect中,colorFrame, depthFrame, bodyIndex三种帧,但是经常会遇到在后边的程序中处理 ...