java之19天 IO字节流 和 缓冲区 (二)

本文详细介绍了如何使用自定义字节流缓冲区进行文件操作,包括文件读写、复制图片和复制mp3文件的技术细节。通过实践代码展示了不同场景下文件数据的高效处理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[size=medium][b]带行号的缓冲字符流
LineNumberReader
自定义带行号的缓冲字符流[/b][/size]


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();
}

}


[size=medium][b] 字节流[/b][/size]


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();
}

}

[size=medium][b]字节流 练习:复制一个图片[/b][/size]


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();
}
}



}

}

[size=medium][b] * 演示mp3的复制,通过缓冲区完成 [/b][/size]


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();

}

}


[size=medium][b]自定义字节流缓冲区[/b][/size]


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();
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值