不一致的文件编码读取和写入文件乱码解决方案

这些天来获得android数据加密中的应用。为了避免加密、解密算法被破解,我将成为核心的加密和解密算法使用JNI封装在一起,只有接口暴露java一层。

工作流程是这种:

1、通过自己写的加密解密工具将数据加密;

2、将加密的数据放在android的asserts目录下;

3、在首次使用数据时将asserts目录下的数据复制到一个隐藏目录下;

4、解密隐藏目录下的文件。

在用加密工具将数据加密好了,在程序解密这个数据文件的过程中,发现解密出来的文件是原来文件大小的2倍,而且全是乱码,跟踪发现,主要问题出如今第3步,读写文件的编码方式不一致导致了文件乱码,之前我是用例如以下的方法来读取asserts目录下的内容的:

public static String readFileFromAssets(Context context, String fileName) throws IOException {
		if (null == context || TextUtils.isEmpty( fileName )){
			return null;
		}

		AssetManager assetManager = context.getAssets();
		InputStream input = assetManager.open(fileName);
		ByteArrayOutputStream output = new ByteArrayOutputStream();
		byte[] buffer = new byte[1024];
		int length = 0;
		while ((length = input.read(buffer)) != -1) {
			output.write(buffer, 0, length);
		}
		output.close();
		input.close();

		return output.toString();
	}

问题就出在我将读取出来的内容转换成了字符串,ByteArrayOutputStream的toString方法将文件内容转换成utf-8的编码了,但用C语言读写文件默认都是asii编码方式,读写文件的编码方式不一致导致了乱码问题,问题找到了,解决方法也就出来了,例如以下:

public static byte[] readFileFromAssets(Context context, String fileName) throws IOException {
		if (null == context || TextUtils.isEmpty( fileName )){
			return null;
		}

		AssetManager assetManager = context.getAssets();
		InputStream input = assetManager.open(fileName);
		ByteArrayOutputStream output = new ByteArrayOutputStream();
		byte[] buffer = new byte[1024];
		int length = 0;
		while ((length = input.read(buffer)) != -1) {
			output.write(buffer, 0, length);
		}
		output.close();
		input.close();

		return output.toByteArray( );
		//return output.toString();
	}

将读取asserts文件的内容以byte数组的形式在它返回。

版权声明:本文博主原创文章,博客,未经同意不得转载。

时间: 2024-08-25 09:40:12

不一致的文件编码读取和写入文件乱码解决方案的相关文章

Java 读取、写入文件——解决乱码问题

读取文件流时,经常会遇到乱码的现象,造成乱码的原因当然不可能是一个,这里主要介绍因为文件编码格式而导致的乱码的问题.首先,明确一点,文本文件与二进制文件的概念与差异. 文本文件是基于字符编码的文件,常见的编码有ASCII编码,UNICODE编码.ANSI编码等等.二进制文件是基于值编码的文件,你可以根据具体应用,指定某个值是什么意思(这样一个过程,可以看作是自定义编码.) 因此可以看出文本文件基本上是定长编码的(也有非定长的编码如UTF-8).而二进制文件可看成是变长编码的,因为是值编码嘛,多少

Redis 中文入库成功,读取数据写入文件乱码问题

最近需要用到redis ,但是在编码这个问题上,纠结了很久. 需求 : 每天一个进程将中文文件入库到redis中(不定时更新) ,另外几个进程读取redis中的信息 ,并处理数据结果. 使用的redis模块 : redis-py 问题 : 入库正常,读取数据成功,以GBK编码写入文件出现异常. 通过以下参数连接 redis : client  = redis.StrictRedis(host='localhost', port=6379, db=0, password="***") 从

PHP 大文件的读取和写入问题

在通常的学习和开发中,因为我们很少会接触到大量数据的读取和写入,所以当突然有了这种需求的时候,我们可 能仍然会按照一些比较快捷的方法,像file_get_contents,fread等方法来读取文件,不过这样以来如果读取的文件太 大,就会产生问题,在实现大文件读取和写入的时候查找了网上的一些资料,不过有些例子给的不是很符合我的需 求,所以我就结合网上已有的例子,再写一篇总结性的博客吧. 那么究竟会产生什么问题呢,这就要说一些PHP的底层实现数,file_get_contents和fread来说一

读取和写入 文件 (NSFIleManger 与 NSFileHandle)

读取和写入 文件 //传递文件路径方法 -(id)initPath:(NSString *)srcPath targetPath:(NSString *)targetPath { self = [super init]; if (self != nil) { _srcPath = [srcPath copy]; _targetPath = [targetPath copy]; } return self; } //开始读文件 -(void)startRead { NSFileManager *f

Java I/O---RandomAccessFile类(随机访问文件的读取和写入)

1.JDK API中RandomAccessFile类的描述 此类的实例支持对随机访问文件的读取和写入.随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组.存在指向该隐含数组的光标或索引,称为文件指针:输入操作从文件指针开始读取字节,并随着对字节的读取而前移此文件指针.如果随机访问文件以读取/写入模式创建,则输出操作也可用:输出操作从文件指针开始写入字节,并随着对字节的写入而前移此文件指针.写入隐含数组的当前末尾之后的输出操作导致该数组扩展.该文件指针(实现数组随机读写)可以通过

HTML5的FileAPI实现文件的读取及超大文件的上传

HTML5的FileAPI实现文件的读取及超大文件的上传 2015-02-04 一.FileAPI实现本地文件的信息读取 <html> ????<head> ????<title>FormData</title>? ????<script?type="text/javascript"> //选择文件时调用 function?selectfile(){ ????//控制台显示??得到文件列表对象??文件数组 ????//cons

C#读取和写入文件

一.读取文件 如果你要读取的文件内容不是很多, 可以使用 File.ReadAllText(FilePath) 或指定编码方式 File.ReadAllText(FilePath, Encoding)的方法. 它们都一次将文本内容全部读完,并返回一个包含全部文本内容的字符串 string str = File.ReadAllText(@"c:\temp\ascii.txt"); //也可以指定编码方式  string str2 = File.ReadAllText(@"c:\

php中读取以及写入文件的方法总结

==>读取文件内容(方法一) $fileData = fread($fileStream,filesize($filePath)); 注意: 文本文件读取到网页上显示时,由于换行符不被解释,文本不换行显示, 解决办法:将\r\n替换为<br/>[str_replace('\r\n','<br/>',$fileData);] ==>读取文件内容(方法二) file_get_contents($filePath); 将整个文件读取到一个字符串(内部自动关闭文件流) ==&g

《程序实现》从xml、txt文件里读取数据写入excel表格

直接上码 import java.io.BufferedReader; import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; impo