FileOutputStream输出数字到txt文件时乱码

愿乘风破浪 2017-08-18 12:00:34
FileOutputStream fs1 = new FileOutputStream("D:\\text1.txt");
fs1.write(1);
fs1.close();


1.之前看到一个解释是说,int类型为4个字节,而write()方法只能写入一个字节,于是舍弃了高位24个,只保留低位8个,导致了txt文件出现乱码?

2.那么我写入一个整数65,按照上述的解释,是不能完整的读取到这些字节的,那么为什么txt文件会显示对应的ascii码表的值A?
3.字节流与txt文件之间底层到底是怎么进行转换的,希望大佬们能详细说明一下(详细、详细、详细),有点搞蒙了。

4.读取这个txt文件的时,为什么下述两种方法会有差别:
4.1
FileInputStream fis1 = new FileInputStream("D:\\text1.txt");
int num1;
String s ="";
while((num1=fis1.read())!=-1){
s =s+num1;
}
System.out.println(s);

这个代码可以正常拿到写入的值
4.2
		FileInputStream fis = new FileInputStream("D:\\text1.txt");
byte[] b = new byte[1024];
int num = fis.read(b);
String str = new String(b,0,num);
System.out.println(str);

这个为什么不行。
...全文
1590 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
110成成 2017-08-21
  • 打赏
  • 举报
回复
只写入低八位,应该是这样的,而且默认是转成ASCII码,超过ASCII码范围的都会变为乱码 比如输入int 11085 对应二进制 10101101001101 只会截取低八位 所以为01001101 对弈 ascii为M。
愿乘风破浪 2017-08-21
  • 打赏
  • 举报
回复
问题一和二:查了下资料,write(int a)方法一次只能读取一个字节,就只能读取到int的低8位,低8位囊括了-128-127这个范围,所以问题2也就解释得通了,之前太傻了没想到。
愿乘风破浪 2017-08-21
  • 打赏
  • 举报
回复
有老铁回答 1 2 3 问题么,求解释啊
愿乘风破浪 2017-08-21
  • 打赏
  • 举报
回复
第四部分弄懂了 4.1 比如写入一个整数1到txt文件,于是将1在ASCII中对应的值存储到txt文件中,用fis.read()拿到该txt文件内容在ascii码表中对应的十进制的值,于是又拿到了1 4.2 fis.read(b)是将该txt文件内容在ascii码表中对应的十进制的值存储到一个字节数组,此时字节数组里面装着一个1,然后再把这个数组变成字符串,先从字节-字符-字符串,即找到十进制1在ASCII表中对应的字符,再讲字符变成字符串,字符串本身就是一个字符数组。
自由自在_Yu 2017-08-21
  • 打赏
  • 举报
回复
num1=fis1.read();这个num1是读取的返回值,只是一个整数,用来判断后面是否还有内容, 实际文件中写入的内容不是num1
愿乘风破浪 2017-08-21
  • 打赏
  • 举报
回复
没有牛逼的老铁么
愿乘风破浪 2017-08-21
  • 打赏
  • 举报
回复
6楼说得对,刚刚试了下,结帖了。
IO流: Input Output 输入输出流 自己去扩展: 1. 对象序列化和反序列化生成一个 2. 流的种类: io包下 扩展nio包下 1. IO分类: 输入流 输出流 字节流 InputStream(抽象类) OutputStream(抽象类) 字符流 Reader (抽象类) Writer(抽象类) 2.字节流:(重点) * 使用场景: * 1.字节流处理除了文本、文字相关所有的流问题,如,png/jpg/avi/map4/mp3/exe * 2.字符流只处理文本、文字相关(编码乱码问题) * * 1.输入流 abstract class InputStream:这个抽象类是表示输入字节流的所有类的超类。 * | * FileInputStream 子类:文件字节输入流 * 1. 构造方法 * FileInputStream(String name) name:表示(绝对路径、相对路径)文件名 * FileInputStream(File file) * * 2. 普通方法: //1. int read(byte[] b) 从输入流读取一些字节数,并将它们存储到缓冲区 b 。 最常用 * //2. int read() 从输入流读取数据的下一个字节。 //3. int read(byte[] b, int off, int len) 从输入流读取最多 len字节的数据到一个字节数组。 * 2.输出流 abstract class OutputStream:这个抽象类是表示输出字节流的所有类的超类。 * | * FileOutputStream 子类:文件字节输出流 * 1. 构造方法 FileOutputStream(String name) name:表示(绝对路径、相对路径)文件FileOutputStream(String name, boolean append) append:表示是否在该文件末尾追加数据,如果为true,表示追加,false,表示从头开始覆盖 * FileOutputStream(File file) FileOutputStream(File file, boolean append) * * 2. 普通方法: //1. void write(byte[] b, int off, int len) 将 len字节从位于偏移量 off的指定字节数组写入此文件输出流。 最常用 * //2. void write(byte[] b)将 b.length个字节从指定的字节数组写入此文件输出流。 //3. void write(int b) 将指定的字节写入此文件输出流。 3. 注意事项: 1. 必须要关闭IO流,节约资源开销 2. 关闭IO流原则,先开后关 3. IO流工具类的抽取,将所有的关流(字节流和字符流)方法抽取出来,优化代码 4. 字符流:(重点) * 使用场景:使用于处理文本相关的文件 * * Reader 抽象类: * |子类 * InputStreamReader(转换流) * |子类 * FileReader:适用于读取字符相关的文件 * 1. 构造方法: * 1.FileReader(File file) 2.FileReader(String fileName) fileName:文件名(相对路径/绝对路径) * * 2. 读取方法: * 3. int read(char[] c)读取字符到char数组中 最常用 * 2. int read()读取一个字符 * 3. int read(char[] c,int start,int length)读取制定长度的字符到char数组中 * * Writer 抽象类: * |子类 * OutputStreamWriter(转换流) * |子类 * FileWriter:适用于写出字符相关的文件 * 1. 构造方法: * 1.FileWriter(File file) 默认是false 2.FileWriter(File file, boolean append) append:表示是在文件末尾追加还是从头覆盖,如果true追加,false覆盖,默认是false 3.FileWriter(String fileName) 默认是false 4.FileWriter(String fileName, boolean append) fileName:文件名(相对路径/绝对路径) * 2. 写出方法: * 1. public Writer append(CharSequence csq,int start,int end) * 2. public Writer append(char c) * 3. public Writer append(CharSequence csq) * 4. public void write(char[] c) * 5. public void write(String str) * 6. public void write(String str,int start,int end) 5. 乱码问题:(掌握) GBK: 中文2个字节 英文、数字:1字节 UTF-8: 中文3~6个字节 英文、数字:1字节 编码:将字符串转换为字节 * 1. byte[] getBytes() 根据默认字符集将当前字符串转换为字节数组 * 2. byte[] getBytes(String charsetName) UTF-8/GBK * 按照指定的字符集将将当前字符串转换为字节数组 * * 解码:将字节转换为字符 * 1.String(byte[] bytes, int offset, int length) * 根据默认字符集将字节数组中从指定下标开始到指定长度结束的数据转换为字符串 * * 2.String(byte[] bytes, int offset, int length, String charsetName) * 根据指定字符集将字节数组中从指定下标开始到指定长度结束的数据转换为字符串 * charsetName:字符集名 例如 : "GBK"、"UTF-8" 、"ISO-8859-1" * * 不常用 * 3.String(byte[] bytes) 根据默认字符集将字节数组转换为字符串 * 4.String(byte[] bytes, String charsetName) * 根据默认字符集将字节数组转换为字符串 * * 这里会有乱码问题: * 产生的原因: * 1、因为字符集不统一,即编码和解码new String(b,0,read,"gbk")字符集不一致 * 2、因为字节流读取汉字的候,字节数组长度不够,将一个汉字拆开了 * 解决: * 1. 用字符流用统一的字符集(最常用) * * 浏览器 : UTF-8 * 前台: * HTML :UTF-8 * CSS :UTF-8 * JS、JSP :UTF-8 * * 后台: * java :UTF-8 * * 数据库: * mysql、oracle、DB2 :UTF-8 * * 开发工具:UTF-8 * 2. 文本文件用统一的字符集 且用字符流读取和写出文本相关文件(最常用) * 3. 用一个大的字节数组(一般不用) 6. 转换流:(重点) 目前唯一一个可以设置字符集的流 (简单的理解为包装流,就是将字节流包装以下,方便操作文本相关的文件) * 使用场景: * 别人给提供了字节流,而需要处理文本文件,这候,就需要用转换流转换一下,更方便处理文本文件 * * 作用:就是一字符流的方式读取或写出文本相关的数据 * * InputStreamReader:将字节输入流包装一下,让其更适合读取文本文件 * 构造方法: * 1.InputStreamReader(InputStream in) 创建一个使用默认字符集的InputStreamReader。 * 2.InputStreamReader(InputStream in, String charsetName) 创建一个使用指定字符集的InputStreamReader。 * 普通方法: * public int read(char[] cbuf) * int read(char[] cbuf, int offset, int length) * OutputStreamWriter:将字节输出流包装一下,让其更适合写出文本文件 * 构造方法: * 1. OutputStreamWriter(OutputStream out) 创建一个使用默认字符编码的OutputStreamWriter。 * 2. OutputStreamWriter(OutputStream out, String charsetName) 创建一个使用指定字符集的OutputStreamWriter。 普通方法: void write(char[] cbuf, int off, int len) append(CharSequence csq,int start,int end) 只有转换流可以设置字符集 7. jdk7关流的新方式: 用新结构可以自动关流 前提:该流必须是实现了一个接口 AutoCloseable 语法: try( //只能写创建流的操作,不能写其他业务操作 ){ //可能有异常的代码 }catch(异常类型1 e){ }...不需要finally关流了 8. 缓冲流:(重点)包装流 * 1.概念: 提高读取和写出效率的流 * 2.作用: 提高效率 3.使用场景:以后一律都要使用,以提高效率 建议以后都是用字节或者字符数组的方式复制文件,这样效率最高 * 4. * BufferedInputStream * 字节输入缓冲流构造方法: 1.BufferedInputStream(InputStream

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧