使用Charset和buffer时需要注意的一个小问题

我们经常使用Charset指定字符集用来在CharBuffer和ByteBuffer之间进行转换,但在这个过程有个小问题是需要注意的。
buffer有三个指针变量:position,limit,capacity,position指向当前位置,limit之后的位置都是不可读写的,capacity代表这个buffer的容量,它们间的关系是:
0<=postion<=limit<=capacity
buffer提供了多个方法来改变这几个指针变量,这里介绍最常用的postion(),limit(),capacity(),flip()和clear();
前面三个很明显是分别指定三个指针变量的位置了,至于flip(),它的作用相当于limit(position);
position(0);
即让limit指向当前已读/写的位置,让后面的数据都不可读写,然后让position指向开始位置;而clear()并非把数据全部清零,它的作用相当于
limit(capacity);
position(0);
clear()与flip()的唯一区别是前者让所有数据重新可读写(并不擦除之前的数据),后者指定当前位置之后的数据都不可读写,我们一般在读/写完成后flip(),需要重新读写前clear();

看下面的代码:
public class CharsetTransform {
public static void main(String[] args) {
Charset cn = Charset.forName("GBK");

CharBuffer cbuff = CharBuffer.allocate(8);
cbuff.put("小");
cbuff.put("精");
cbuff.put("灵");
[color=red]cbuff.flip();[/color]
ByteBuffer bbuff = cn.encode(cbuff);
for (int i = 0; i < bbuff.capacity(); i++) {
System.out.print(bbuff.get() + " ");
}
[color=red]bbuff.flip();[/color]
System.out.println("\n" + cn.decode(bbuff).toString());
}
}

红色代码flip()把position重新指定为0,如果不这样做,代码中的encode/decode后的字符串是空的,因为当前position后并无内容。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个使用 JSP 实现文件上传和下载的示例代码: 文件上传: ```jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.io.*,java.util.*" %> <%@ page import="javax.servlet.*,javax.servlet.http.*" %> <% // 设置上传文件的保存路径 String savePath = getServletContext().getRealPath("/") + "uploads"; File fileSaveDir = new File(savePath); if (!fileSaveDir.exists()) { fileSaveDir.mkdir(); } // 处理上传文件 String fileName = "", filePath = ""; for (Part part : request.getParts()) { fileName = extractFileName(part); filePath = savePath + File.separator + fileName; part.write(filePath); } out.println("文件上传成功!"); // 获取文件名 private String extractFileName(Part part) { String contentDisposition = part.getHeader("content-disposition"); String[] items = contentDisposition.split(";"); for (String item : items) { if (item.trim().startsWith("filename")) { return item.substring(item.indexOf("=") + 2, item.length() - 1); } } return ""; } %> ``` 文件下载: ```jsp <%@ page language="java" contentType="application/octet-stream" pageEncoding="UTF-8"%> <%@ page import="java.io.*,javax.servlet.*,javax.servlet.http.*" %> <% String fileName = request.getParameter("file"); String filePath = getServletContext().getRealPath("/") + "uploads" + File.separator + fileName; File file = new File(filePath); if (file.exists()) { response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\""); response.setContentType("application/octet-stream"); FileInputStream inputStream = new FileInputStream(file); OutputStream outputStream = response.getOutputStream(); byte[] buffer = new byte[4096]; int bytesRead = -1; while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } inputStream.close(); outputStream.close(); } else { out.println("文件不存在!"); } %> ``` 注意:这只是一个简单的示例,实际应用中还需要做一些错误处理和安全性检查。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值