带行号的缓冲字符流
LineNumberReader
自定义带行号的缓冲字符流
字节流
字节流 练习:复制一个图片
* 演示mp3的复制,通过缓冲区完成
自定义字节流缓冲区
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();
}
}