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 ...
随机推荐
- Codeforces 671 D. Roads in Yusland
题目描述 Mayor of Yusland just won the lottery and decided to spent money on something good for town. Fo ...
- Python3 sys.argv[ ]的用法解释
sys.argv[]说白了就是一个从程序外部获取参数的桥梁,这个"外部"很关键,所以那些试图从代码来说明它作用的解释一直没看明白.因为我们从外部取得的参数可以是多个,所以获得的是一 ...
- synchronized修饰static方法与非static方法的区别
1. 当synchronized修饰一个static方法时,多线程下,获取的是类锁(即Class本身,注意:不是实例),作用范围是整个静态方法,作用的对象是这个类的所有对象. 2. 当synchron ...
- Java获取随机数的3种方法
最小值---最大值(整数)的随机数 方法1 (数据类型)(最小值+Math.random()*(最大值-最小值+1)) 例: (int)(1+Math.random()*(10-1+1)) / ...
- pupeteer初体验
官方文档: https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#pagescreenshotoptions puppet ...
- python常用执行方式&变量&input函数
linux系统中执行py文件方式: ./a.py 需要执行权限 chmod -R 777(最大权限) 常用执行方式: 1. ./a.py2. python a.py 文件内部头加上 #!/usr/b ...
- 含有分类变量(categorical variable)的逻辑回归(logistic regression)中虚拟变量(哑变量,dummy variable)的理解
版权声明:本文为博主原创文章,博客地址:,欢迎大家相互转载交流. 使用R语言做逻辑回归的时候,当自变量中有分类变量(大于两个)的时候,对于回归模型的结果有一点困惑,搜索相关知识发现不少人也有相同的疑问 ...
- Go 语言条件语句
条件语句需要开发者通过指定一个或多个条件,并通过测试条件是否为 true 来决定是否执行指定语句,并在条件为 false 的情况在执行另外的语句. 下图展示了程序语言中条件语句的结构: Go 语言提供 ...
- Python 字符串字典内置函数&方法
Python字典包含了以下内置函数: 序号 函数及描述 1 cmp(dict1, dict2)比较两个字典元素. 2 len(dict)计算字典元素个数,即键的总数. 3 str(dict)输出字典可 ...
- DB2 911错误的解释
SQL0911N 因为死锁或超时,所以当前事务已回滚.原因码为 "<原因码>". 说明: 当前工作单元参与了未解决的对象争用,因此必须回滚. 原因码如下所示: 2 ...