A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王金科 中级黑马   /  2012-8-19 00:33  /  2288 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package cn.study.io;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/*
* 字节缓冲区
* */
public class CopyMp3 {
/**
  * @param args
  * @throws IOException
  */
public static void main(String[] args) throws IOException {
  // TODO Auto-generated method stub
  BufferedInputStream bufis = new BufferedInputStream(new FileInputStream("Beyond - 光辉岁月.mp3"));
  BufferedOutputStream bufos = new BufferedOutputStream(new FileOutputStream("abc.mp3"));
  int by = 0;
  while((by=bufis.read())!=-1){
   bufos.write(by);
  }
  bufos.close();
  bufis.close();
}
}
以上代码使用了字节缓冲区.


一下代码自定义了一个1024大小的字节数组
package cn.study.io;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/*
* 拷贝图片
* 思路:
* 1,用字节读取流对象和图片关联
* 2,用字节写入流对象创建一个图片文件,用于存储获取到的图片数据
* 3,通过循环读写,完成数据的存储
* 4,关闭资源
* */
public class CopyPic {
/**
  * @param args
  * @throws IOException
  */
public static void main(String[] args) throws IOException {
  // TODO Auto-generated method stub
  FileInputStream fis = null;
  FileOutputStream fos = null;
  try {
   fis = new FileInputStream("00.jpg");
   fos = new FileOutputStream("01.jpg");
   
   byte[] buf = new byte[1024];
   int len = 0;
   while((len=fis.read(buf))!=-1){
    fos.write(buf,0,len);
   }
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }finally{
   try {if(fos!=null)
     fos.close();
   } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   try {if(fis!=null)
     fis.close();
   } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
  
}
}
我想问的是字节缓冲区的默认大小是多少啊?

2 个回复

倒序浏览
1.1 使用allocate()静态方法
ByteBuffer buffer=ByteBuffer.allocate(256);
以上方法将创建一个容量为256字节的ByteBuffer,如果发现创建的缓冲区容量太小,唯一的选择就是重新创建一个大小合适的缓冲区.

1.2 通过包装一个已有的数组来创建
如下,通过包装的方法创建的缓冲区保留了被包装数组内保存的数据.
ByteBuffer buffer=ByteBuffer.wrap(byteArray);

如果要将一个字符串存入ByteBuffer,可以如下操作:
String sendString="你好,服务器. ";
ByteBuffer sendBuffer=ByteBuffer.wrap(sendString.getBytes("UTF-16"));

2.回绕缓冲区
buffer.flip();
这个方法用来将缓冲区准备为数据传出状态,执行以上方法后,输出通道会从数据的开头而不是末尾开始.回绕保持缓冲区中的数据不变,只是准备写入而不是读取.
===================================
这个基本上都默认是1024吧,但也有特殊情况。它的值可以改变
windsock缓冲区大小默认为8192字节,尝试用API函数setsocketopt修改,似乎也修改成功了,代码如下:

VB code
    Dim lResult As Long
    Dim bufSize As Long
    bufSize = CLng(1024) * 1024
    lResult = setsockopt(Winsock1.SocketHandle, SOL_SOCKET, SO_RCVBUF, bufSize, 4)
    If (lResult = SOCKET_ERROR) Then
        MsgBox "Error setting SO_RCVBUF option: " & CStr(Err.LastDllError)
    End If
    lResult = setsockopt(Winsock1.SocketHandle, SOL_SOCKET, SO_SNDBUF, bufSize, 4)
    If (lResult = SOCKET_ERROR) Then
        MsgBox "Error setting SO_SNDBUF option: " & CStr(Err.LastDllError)
    End If
   
    bufSize = 0
    lResult = getsockopt(Winsock1.SocketHandle, SOL_SOCKET, SO_RCVBUF, bufSize, 4)
    If (lResult = SOCKET_ERROR) Then
        MsgBox "Error getting SO_RCVBUF option: " & CStr(Err.LastDllError)
    End If
    'bufSize=1024*1024,说明设置成功

回复 使用道具 举报
杨习平 发表于 2012-8-19 01:11
1.1 使用allocate()静态方法
ByteBuffer buffer=ByteBuffer.allocate(256);
以上方法将创建一个容量为256字 ...

哥们,你好,我想问的是字节缓冲区的默认大小是多少?用什么方法可以显示出它的长度
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马