android 读写编码,Android 网络字幕文件保证编码一致的文件读写

这是一段读入网络字幕文件并写出在本地的code。

private String writeToLocalPath(String url){

String tmpPath = null;

String subtitleLocalPath = null;

if (Tools.isSambaPlaybackUrl(url)) {

Log.i(TAG,"HttpBean.setmSmbUrl url:"+url);

HttpBean.setmSmbUrl(url);

Log.i(TAG,"before convertSambaToHttpUrl's imagePath:"+url);

String sambaPath = HttpBean.convertSambaToHttpUrl(url);

Log.i(TAG,"convertSambaToHttpUrl's result sambaPath:"+sambaPath);

tmpPath = sambaPath;

} else {

tmpPath = url;

}

final String realPath = tmpPath;

if (Tools.isNetPlayback(realPath)) {

try {

is = new URL(realPath).openStream();

} catch (MalformedURLException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

} else {

try {

File mFile = new File(realPath);

is = new FileInputStream(mFile);

} catch (IOException e) {

e.printStackTrace();

}

}

if (is == null) {

Log.i(TAG,"is is null");

return null;

}

String charset = GetCharset(realPath);

try {

mInputStreamReader = new InputStreamReader(is,charset);

}catch (Exception e) {

e.printStackTrace();

}

// One line read

try {

mBufferedReader = new BufferedReader(mInputStreamReader);

char byteArray [] = new char[1024*8+1];

int readNum = 0;

int offset = 0;

int index = realPath.lastIndexOf(".");

String postFix = realPath.substring(index,realPath.length());

subtitleLocalPath = "/data/subtitle"+postFix;

File outPutLocalSubtitleFile = new File(subtitleLocalPath);

mOutputStreamWriter = new OutputStreamWriter(new FileOutputStream(outPutLocalSubtitleFile),charset);

mBufferedWriter = new BufferedWriter(mOutputStreamWriter);

while ((readNum = mBufferedReader.read(byteArray,0,1024*8))>0){

mBufferedWriter.write(byteArray,0,readNum);

offset += readNum;

Log.i(TAG,"andrew_read_write:"+readNum+","+offset);

}

mBufferedReader.close();

mBufferedWriter.close();

mInputStreamReader.close();

mOutputStreamWriter.close();

if (is!=null) {

is.close();

}

if (isForGetCharset!=null) {

isForGetCharset.close();

}

} catch (FileNotFoundException e){

e.printStackTrace();

} catch (IOException e){

e.printStackTrace();

}

try {

String command = "chmod 777 " + subtitleLocalPath;

Log.i(TAG, "command = " + command);

Runtime runtime = Runtime.getRuntime();

Process proc = runtime.exec(command);

} catch (IOException e) {

Log.i(TAG,"chmod fail!!!!");

e.printStackTrace();

}

return subtitleLocalPath;

}

通过

public String GetCharset(final String filePath) {

String charset = "GBK";

byte[] first3Bytes = new byte[3];

try {

boolean checked = false;

if (bis != null) {

bis.close();

}

if (Tools.isNetPlayback(filePath)) {

try {

isForGetCharset = new URL(filePath).openStream();

} catch (MalformedURLException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

if (isForGetCharset == null) {

Log.i(TAG,"isForGetCharset is null");

return null;

}

bis = new BufferedInputStream(isForGetCharset);

} else {

File file = new File(filePath);

bis = new BufferedInputStream(new FileInputStream(file));

}

// bis.mark(0);

int read = bis.read(first3Bytes, 0, 3);

if (read == -1)

return charset;

if (first3Bytes[0] == (byte) 0xFF && first3Bytes[1] == (byte) 0xFE) {

charset = "UTF-16LE";

checked = true;

} else if (first3Bytes[0] == (byte) 0xFE

&& first3Bytes[1] == (byte) 0xFF) {

charset = "UTF-16BE";

checked = true;

} else if (first3Bytes[0] == (byte) 0xEF

&& first3Bytes[1] == (byte) 0xBB

&& first3Bytes[2] == (byte) 0xBF) {

charset = "UTF-8";

checked = true;

} else if (first3Bytes[0] == (byte) 0xFF

&& first3Bytes[1] == (byte) 0xFE) {

charset = "unicode";

checked = true;

} else if (first3Bytes[0] == (byte) 0x5B

&& first3Bytes[1] == (byte) 0x30) {

charset = "ISO8859-1";

checked = true;

} else {

charset = "GBK";

checked = true;

}

// bis.reset();

if (!checked) {

while ((read = bis.read()) != -1) {

if (read >= 0xF0)

break;

if (0x80 <= read && read <= 0xBF)

break;

if (0xC0 <= read && read <= 0xDF) {

read = bis.read();

if (0x80 <= read && read <= 0xBF)

continue;

else

break;

} else if (0xE0 <= read && read <= 0xEF) {

read = bis.read();

if (0x80 <= read && read <= 0xBF) {

read = bis.read();

if (0x80 <= read && read <= 0xBF) {

charset = "UTF-8";

break;

} else

break;

} else

break;

}

}

}

bis.close();

} catch (Exception e) {

e.printStackTrace();

try {

bis.close();

} catch (IOException e1) {

e1.printStackTrace();

}

}

return charset;

}

(1)首先获取网络文件的文件流

主要是通过OpenStream获取到InputStream对象

if (Tools.isNetPlayback(realPath)) {

try {

is = new URL(realPath).openStream();

} catch (MalformedURLException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

} else {

try {

File mFile = new File(realPath);

is = new FileInputStream(mFile);

} catch (IOException e) {

e.printStackTrace();

}

}

(2)为了加快读写速度使用字符读写器,需要使用字节流转字符流的转化类:InputStreamReader

使用获取到文件的编码来初始化对象,这样才能保证按照文件的真正编码方式读出来。

try {

mInputStreamReader = new InputStreamReader(is,charset);

}   catch (Exception e) {

e.printStackTrace();

}

(3)用InputStreamReader对象初始化一个字符读入类对象

mBufferedReader = new BufferedReader(mInputStreamReader);

(4)创建一个字符写出类对象

先根据本地路径创建文件,然后用文件创建字节写出类对象,然后使用读写文件时缓存下来的编码方式

以此来初始化字符写出类对象

subtitleLocalPath = "/data/subtitle"+postFix;

File outPutLocalSubtitleFile = new File(subtitleLocalPath);

mOutputStreamWriter = new OutputStreamWriter(new FileOutputStream(outPutLocalSubtitleFile),charset);

(5)然后就可以边读边写文件了

读入多少字符,就写出多少字符。

while ((readNum = mBufferedReader.read(byteArray,0,1024*8))>0){

mBufferedWriter.write(byteArray,0,readNum);

offset += readNum;

Log.i(TAG,"andrew_read_write:"+readNum+","+offset);

}

(6)最后close掉字符流,字节流

mBufferedReader.close();

mBufferedWriter.close();

mInputStreamReader.close();

mOutputStreamWriter.close();

if (is!=null) {

is.close();

}

if (isForGetCharset!=null) {

isForGetCharset.close();

}

(7)再说下怎么识别文件编码:

主要是根据文件的头三个字符进行分类判断。

不过网上应该有很多这样的例子,随便抄QAQ

结尾附上一篇总结的不错的文章:http://blog.csdn.net/lanhuzi9999/article/details/31389963

数据中心机房是现代信息技术的核心设施,它承载着企业的重要数据和服务,因此,其基础设计与规划至关重要。在制定这样的方案时,需要考虑的因素繁多,包括但不限于以下几点: 1. **容量规划**:必须根据业务需求预测未来几年的数据处理和存储需求,合理规划机房的规模和设备容量。这涉及到服务器的数量、存储设备的容量以及网络带宽的需求等。 2. **电力供应**:数据中心是能源消耗大户,因此电力供应设计是关键。要考虑不间断电源(UPS)、备用发电机的容量,以及高效节能的电力分配系统,确保电力的稳定供应并降低能耗。 3. **冷却系统**:由于设备密集运行,散热问题不容忽视。合理的空调布局和冷却系统设计可以有效控制机房温度,避免设备过热引发故障。 4. **物理安全**:包括防火、防盗、防震、防潮等措施。需要设计防火分区、安装烟雾探测和自动灭火系统,设置访问控制系统,确保只有授权人员能进入。 5. **网络架构**:规划高速、稳定、冗余的网络架构,考虑使用光纤、以太网等技术,构建层次化网络保证数据传输的高效性和安全性。 6. **运维管理**:设计易于管理和维护的IT基础设施,例如模块化设计便于扩展,集中监控系统可以实时查看设备状态,及时发现并解决问题。 7. **绿色数据中心**:随着环保意识的提升,绿色数据中心成为趋势。采用节能设备,利用自然冷源,以及优化能源管理策略,实现低能耗和低碳排放。 8. **灾难恢复**:考虑备份和恢复策略,建立异地灾备中心,确保在主数据中心发生故障时,业务能够快速恢复。 9. **法规遵从**:需遵循国家和地区的相关法律法规,如信息安全、数据保护和环境保护等,确保数据中心的合法运营。 10. **扩展性**:设计时应考虑到未来的业务发展和技术进步,保证机房有充足的扩展空间和升级能力。 技术创新在数据中心机房基础设计及规划方案中扮演了重要角色。例如,采用虚拟化技术可以提高硬件资源利用率,软件定义网络(SDN)提供更灵活的网络管理,人工智能和机器学习则有助于优化能源管理和故障预测。 总结来说,一个完整且高效的数据中心机房设计及规划方案,不仅需要满足当前的技术需求和业务目标,还需要具备前瞻性和可持续性,以适应快速变化的IT环境和未来可能的技术革新。同时,也要注重经济效益,平衡投资成本与长期运营成本,实现数据中心的高效、安全和绿色运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值