会员可以在此提问,百战程序员老师有问必答
对大家有帮助的问答会被标记为“推荐”
看完课程过来浏览一下别人提的问题,会帮你学得更全面
截止目前,同学们一共提了 132837个问题

老师,这里使用BufferedInputStream和BufferedOutputStream定义的处理流,是不是与自定义byte[]数组缓冲区然后read(byte[] b)并不一样?


我的理解:

1)处理流仍然是一个字节一个字节从数据源中读取数据,只是将这些字节缓存在处理流定义的字节数组中,之后等满了以后(达到8192个字节)再读入到程序中;

2)而自定义的缓冲区是一次直接从数据源中读取多个字节(比如定义的1024个字节数组)到程序中。


处理小文件的时候,自定义的会不会效率更高一下?

处理大文件的时候使用那个更好一些?

两个结合在一块使用适用吗?(比如第二段代码中的适用)


第一段代码:

package cn.ljp;

import java.io.*;

public class TestBufferedInputStream02 {
    public static void main(String[] args) {
        // 1) 定义字节流和处理流
        InputStream fis = null;
        InputStream fib = null;
        OutputStream fos = null;
        OutputStream fob = null;
        try{
            fis = new FileInputStream("f:/a.png");
            fib = new BufferedInputStream(fis);
            fos = new FileOutputStream("f:/aa.png");
            fob = new BufferedOutputStream(fos);
            int emp = 0;
            long start = System.currentTimeMillis();
            while((emp = fib.read()) != -1){
                System.out.println(emp);
                fob.write(emp);
            }
            fob.flush();
            long stop = System.currentTimeMillis();
            System.out.println("花费时间" + (stop - start) + "毫秒");
        }catch(Exception e){
            e.printStackTrace();
        }finally {
            try{
                if(fib != null)
                    fib.close();
                if(fis != null)
                    fis.close();
                if(fob != null)
                    fob.close();
                if(fos != null)
                    fos.close();
            }catch(Exception e){
                e.printStackTrace();
            }
        }
    }
}

第二段代码:

package cn.ljp;

import java.io.*;

public class TestBufferedInputStream {
    public static void main(String[] args) {
        // 1) 定义字节流和处理流
        InputStream fis = null;
        InputStream fib = null;
        OutputStream fos = null;
        OutputStream fob = null;
        try{
            fis = new FileInputStream("f:/a.png");
            fib = new BufferedInputStream(fis);
            fos = new FileOutputStream("f:/aa.png");
            fob = new BufferedOutputStream(fos);
            byte[] buff = new byte[1204];
            int emp = 0;
            long start = System.currentTimeMillis();
            while((emp = fib.read(buff)) != -1){
                System.out.println(emp);
                fob.write(buff,0,emp);
            }
            fob.flush();
            long stop = System.currentTimeMillis();
            System.out.println("花费时间" + (stop - start) + "毫秒");
        }catch(Exception e){
            e.printStackTrace();
        }finally {
            try{
                if(fib != null)
                    fib.close();
                if(fis != null)
                    fis.close();
                if(fob != null)
                    fob.close();
                if(fos != null)
                    fos.close();
            }catch(Exception e){
                e.printStackTrace();
            }
        }

    }
}


JAVA 全系列/第二阶段:JAVA 基础深化和提高/IO 流技术(旧) 1546楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/容器 1548楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/常用类 1549楼

截屏2021-09-09 上午11.45.30.png

为什么这里没有出现线程01的交替输出

JAVA 全系列/第二阶段:JAVA 基础深化和提高/多线程技术(旧) 1550楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/XML 技术(旧) 1552楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/常用类 1553楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/容器(旧) 1554楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/XML 技术(旧) 1555楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/常用类 1556楼

缓冲字节流和缓冲字符流问题

老师,我在测试缓冲字节流_缓冲字符流时,发现缓冲字节流可以读取复制文本、视频、图片等文件,复制的文件大小一致可以正常打开。缓冲字符流复制视频和图片后,文档变大了,而且无法打开,复制文档后,打开出现乱码情况。

这个是什么原因导致。


import java.io.*;

public class TestCopy2 {
    public static void main(String[] args) {
        BufferedReader br= null;
        BufferedWriter bw= null;
        long start= 0;
        try {
            br = new BufferedReader(new FileReader("G:\\1.txt"));
            bw = new BufferedWriter(new FileWriter("F:\\1.txt"));
            start = System.currentTimeMillis();
            String line=null;
            while((line=br.readLine())!=null) {
                bw.write(line);
                bw.newLine();
                bw.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(bw!=null){
                try {
                    bw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(br!=null){
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        long end=System.currentTimeMillis();
        System.out.println("耗时:"+(end-start));

    }
}


JAVA 全系列/第二阶段:JAVA 基础深化和提高/IO 流技术(旧) 1557楼

客户端:

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;


public class Client  {
    public static void main(String[] args) {
        //1.创建Socket对象
        Socket client = null;
        DataOutputStream dos =null;
        DataInputStream dis=null;
        try {
            client = new Socket("localhost",8888);
            //2.发送请求,获取输出流>请求
             dos =new DataOutputStream(client.getOutputStream());
            dos.writeUTF("我是客户端:服务器你好!");
            //3.响应请求,获取输入流>响应
             dis= new DataInputStream(client.getInputStream());
            System.out.println(dis.readUTF());
        } catch (IOException e) {
            e.printStackTrace();
        }
        //4.关闭流
        finally {
            IOClose.closeAll(dis,dos,client);
        }
    }
}

服务端:

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;


public class Server {
    public static void main(String[] args) {
        //创建ServerSocket对象
        ServerSocket server = null;
        //监听是否有客户端发送请求
        Socket client =null;
        //获取socke对象
        //获取输入流>得到客户端的请求
        DataInputStream dis = null;
        //获取输出流>给客户端发送消息
        DataOutputStream dos =null;
        try {
            server = new ServerSocket(8888);
             client =server.accept();
             dis=new DataInputStream(client.getInputStream());
            System.out.println(dis.readUTF());
             dos = new DataOutputStream(client.getOutputStream());
            dos.writeUTF("客户端您好:我是服务器,我收到了你的信息");
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            //关闭流
            IOClose.closeAll(dos,dis,client,server);
        }
    }
}

服务端运行结果:

image.png

客户端运行结果:

image.png


老师我的代码安装视频中敲的,为什么控制台没有收到任何输出啊


JAVA 全系列/第二阶段:JAVA 基础深化和提高/手写服务器项目(旧) 1559楼

课程分类

百战程序员微信公众号

百战程序员微信小程序

©2014-2025百战汇智(北京)科技有限公司 All Rights Reserved 北京亦庄经济开发区科创十四街 赛蒂国际工业园
网站维护:百战汇智(北京)科技有限公司
京公网安备 11011402011233号    京ICP备18060230号-3    营业执照    经营许可证:京B2-20212637