过年过的在家带着无聊但是什么也不想干,哎,废了废了
今天做OSS文件下载的时候,怎么整都是乱码,整崩溃了。
官网给的例子也是有点狗(如下)
// Endpoint以杭州为例,其它Region请按实际情况填写。
String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
String accessKeyId = "<yourAccessKeyId>";
String accessKeySecret = "<yourAccessKeySecret>";
String bucketName = "<yourBucketName>";
String objectName = "<yourObjectName>";
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// ossObject包含文件所在的存储空间名称、文件名称、文件元信息以及一个输入流。
OSSObject ossObject = ossClient.getObject(bucketName, objectName);
// 读取文件内容。
System.out.println("Object content:");
BufferedReader reader = new BufferedReader(new InputStreamReader(ossObject.getObjectContent()));
while (true) {
String line = reader.readLine();
if (line == null) break;
System.out.println("\n" + line);
}
// 数据读取完成后,获取的流必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。
reader.close();
// 关闭OSSClient。
ossClient.shutdown();
ossObject.getObjectContent()这个返回的是一个InputStream,是一个字节流。
然后用InputStreamReader(该类从数据源读取字节并将其解码为使用指定的字符集的字符)转化为字符,然后加上缓冲。
这样读取我感觉有问题,我特意查了查资料如下:
字节流是一种执行8位字节输入和输出的机制,基本单元为字节;而字符流是Java中执行16位Unicode输入和输出操作的机制,基本单元为Unicode码元。
字节流是最基本的,采用ASCII编码;它通常用于处理二进制数据,它是按字节来处理的,实际上它可以处理任意类型的数据,但它不支持直接写入或读取Unicode码元。
字符流采用Unicode编码,它是按虚拟机的encode来处理,也就是要进行字符集的转化;它通常处理文本数据,它支持写入及读取Unicode码元。
这样按照例子读取后就一直乱码,我不知道是不是这里的原因,有没有大佬解释一下。
但是我改成了字节流读取就没有乱码问题了。
public static byte[] readStream(InputStream inStream) throws Exception{
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
while((len=inStream.read(buffer))!=-1){
outStream.write(buffer,0,len);
}
outStream.close();
inStream.close();
return outStream.toByteArray();
}
好不容易写写代码,整了半天这个。
希望疫情早点过去吧,加油鸭。