站长工具seo综合查询收费吗,网站优化竞争对手分析,网站标题 关键字,淮南最新消息今天在字节流中#xff0c;文件中的中文显示的是乱码。
在计算机存储体系中#xff0c;以字节为最小存储单位#xff0c;一个英文占一字节。
字符集类型
ASCII字符集#xff0c;又叫编码表#xff0c;编码表中有128个数据#xff0c;其中大小写字母、符号、数字等。GB2312…在字节流中文件中的中文显示的是乱码。
在计算机存储体系中以字节为最小存储单位一个英文占一字节。
字符集类型
ASCII字符集又叫编码表编码表中有128个数据其中大小写字母、符号、数字等。GB2312字符集1981年5月1日实施的简体中文汉字编码国家标准收录了7445个图形字符其中包括6763个简体汉字。BIG5字符集台湾地区繁体中文标准字符集共收录13053个中文字1984年实施。GBK字符集2000.3.17发布收录21003个汉字。包含国家标准GB13000-1中的全部中日韩汉字和BIG编码中的所有汉字。简体中文Windows系统默认使用GBK系统显示ANSIUnicode字符集国家标准字符集它将世界各种语言的每一个字符定义一个唯一的编码以满足跨语言、跨平台文本信息转换。
GBK 存储规则
GBK存储英文完全兼容ASCII码。 存储中文 扩展解码都是直接转为十进制
Unicode万国码存储规则
UTF存储英文有三个规则UTF-8编码规则、UTF-16规则、UTF-32规则 UTF存储中文 乱码出现原因
读取数据时未读完整个汉字当利用字节流读取文字时一个汉字会被分为3个字节读取 编码和解码时的方式不统一eg 防止乱码出现办法
不要用字节流读取文本文件编码解码使用同一个码表同一个编码方式 编码与解码方法
编码将我们要存储的数据根据一定的规则编译为计算机能够存储的字节数据
public byte[ ] getBytes()使用默认方式进行编码public byte[ ] getBytes(String charsetName)使用指定方式进行编码
解码
String(byte[ ] bytes)使用默认方式进行解码String(byte[ ] bytes,String charsetName)使用指定方式进行编码 字符流
字符流的底层是字节流 字符流字节流字符集 特点
输入流一次读一个字节遇到中文时一次读多个字节与字符集有关输出流底层会把数据按照指定的编码方式进行编码变成字节在写到文件中 适合纯文本文件的读写操作。
字符流Reader字符输入流 Writer字符输出流 FileReader
使用步骤
1.创建字符输入流对象
public FileReader(File fille)创建字符输入流关联本地文件public FileReader(String pathname)创建字符输入流关联本地文件
File对象表示的文件路径以及字符串表示的文件路径如果文件不存在就会报错
2.读取数据
public int read()读取数据读到末尾返回-1public int read(char[ ] buffer)读取多个数据读到末尾返回-1
空参读取按字节进行读取遇到中文一次读多个字节读取后解码返回一个整数read返回的十进制是字符集上的数字读到文件末尾read方法返回-1
3.释放资源 public int close() //释放资源/关流 空参read()方法的使用
有参read()方法的使用 FileWriter
FileWrite构造方法
public FileWriter(File file )创建字符输出流关联本地文件public FileWriter(String pathname)创建字符输出流关联本地文件public FileWriter(File file,boolean append)创建字符输出流关联本地文件续写public FileWriter(String pathname,boolean append)创建字符输出流关联本地文件续写
FileWrite成员方法
void write(int c)写出一个字符void write(String str)写出一个字符串void write(String strint off,int len)写出一个字符串的一部分void write(char[ ] cbuf)写出一个字符数组void write(char[ ] cbufint off,int len)写出字符数组的一部分
使用流程
1.创建字符输出流对象
参数是字符串表示的路径或者File对象如果文件不存在会创建一个新的文件但是要保证父级路径是存在的如果文件已经存在则会清空文件如果不想清空可以打开续写开关
2.写数据
如果write方法的参数是整数但是实际上写到本地文件中的是整数在字符集上对应的字符
3.释放资源
每次使用完流都要释放资源 使用步骤代码实现 StringBuilder类
对字符串拼接原理String类在Java流程控制中有说明 利用StringBuilder可变字符串序列解决浪费内容问题。
String和StringBuilder的区别
String内容不可变StringBuilder内容可变
StringBuilder主要构造方法
StringBuilder无参构造创建一个空白可变字符串对象StringBuilder(String str)指定字符串内容的构造方法
代码演示 StringBuilder方法
public StringBuilder append(任意类型)添加数据并返回对象本身public StringBuilder reverse()返回相关的字符序列
代码演示 所以在添加数据时可以不创建另一个对象存数据。 反转顾名思义将sb中的内容从后往前输出。
StringBuilder和String相互转换
StringBuilder转换为String public String toString():通过toString()就可以实现 String转换为StringBuilder public StringBuilder(String s) 代码演示 拼接字符串
定义一个方法把int数组中的数据按照指定的格式拼接成一个字符串返回调用该方法在控制台输出结果。egint[ ] arr{1,2,3}l执行方法后输出结果[1,2,3] 综合练习
拷贝
字节流任意类型的文件
字符流读取纯文本文件中的数据往纯文本文件中写出数据
拷贝一个文件夹加考虑子文件夹 //拷贝文件夹下所有内容
public class Test1 {public static void main(String[] args) throws IOException {//创建对象数据源File srcnew File(D:\\test);//目的地File destnew File(D:\\dest);//调用方法开始拷贝copydir(src,dest);}//创建拷贝方法private static void copydir(File src, File dest) throws IOException {//dest不存在创建dest文件夹dest.mkdirs();//1.进入数据源File[] files src.listFiles();//记录文件夹中的文件及路//2.遍历数组for (File file:files){//增强for循环将数组files中的每一项赋值给fileif (file.isFile()){//3.判断文件拷贝 文件开始文件结束dest是文件夹FileInputStream fisnew FileInputStream(file);//要拷贝的文件FileOutputStream fosnew FileOutputStream(new File(dest,file.getName()));//文件的目的地byte[] bytesnew byte[1024];//一个读取1024个字节int len;while ((lenfis.read(bytes))!-1){fos.write(bytes,0,len);}fos.close();//4.关闭资源先开的后关fis.close();}else{//4.判断文件夹递归copydir(file,new File(dest,file.getName()));//要拷贝的文件夹目的地}}}
}
文件加密
为了保证文件的安全性需要对原始文件进行加密存储再使用的时候在对其进行解密处理。
加密原理对原始文件中的每一个字节数据进行更改然后将更改以后的数据存储到新的文件中。
解密原理读取加密之后的文件按照加密的规则反向操作变成原始文件。 //文件加密
public class Test2 {public static void main(String[] args) throws IOException {//异或^ 相同为0 不同为1//eg100^10110 110^10100FileInputStream fisnew FileInputStream(C_S\\b.png);FileOutputStream fosnew FileOutputStream(C_S\\b1.png);//加密处理int b;while ((bfis.read())!-1){fos.write(b^2);}fos.close();fis.close();}
}
修改文件中的数据
文本文件中有以下的数据2-1-9-4-7-8
将文件中的数据进行排序变成以下的数据1-2-4-7-8-9
代码实现 //更改文件内容
public class Test3 {public static void main(String[] args) throws IOException {//1.读取数据FileReader frnew FileReader(C_S\\a.txt);//数据读入程序StringBuilder sbnew StringBuilder();//StringBuilder功能拼接读取到的数据int ch;while ((chfr.read())!-1){sb.append((char)ch);//将读取到的数据拼接到sb中}fr.close();System.out.println(sb);//2.排序String strsb.toString();//将sb内容变成字符串形式String[] arrstrstr.split(-);//根据-进行切割得到字符串类型的219478ArrayListInteger listnew ArrayList();for(String s:arrstr){//遍历字符串数组int i Integer.parseInt(s);//一次能够将一个字符串类型整数变成int性整数list.add(i);//将转换后的数字保存在list集合中}System.out.println(list);//测试集合是否有数字Collections.sort(list);//集合中的排序方法默认从小到大System.out.println(list.size());//3.写出FileWriter fwnew FileWriter(C_S\\a.txt);for (int i 0; i list.size(); i) {//遍历集合listif (ilist.size()-1){//如果说集合中最后一位则直接输出fw.write(list.get(i));//不能直接写iwrite会将其转换对应ASII码// “”将其转换为字符串输出}else {//不是最后一位加-输出fw.write(list.get(i)-);}}fw.close();}
}