A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 还不到时候 于 2013-12-3 19:44 编辑

最近复习到了IO流知识点,对有些知识有点模糊了。如下代码:
FileWriter out = new FileWriter("a.txt");

out.write("abc\n中国人");//这句代码的数据传递过程是怎样的?
有没有编码的过程?写入到a.txt文件中是这7个字符对应GBK码表上的二进制数值,打开a.txt文件后,显示过程是不是解码的过程?上面显示的是:”abc中国“。\n去哪了?\n对应的码值不是10吗,存到a.txt文本文件上的应该是10的二进制数啊?为什么没有解码到?

所以迫切想看看write()方法的源代码是怎么的?

希望高手能就题回答,不要笼统的给个概念!不然就不要回答了!回复有回报!

out.close()

评分

参与人数 1技术分 +1 黑马币 +3 收起 理由
狼王 + 1 + 3 很给力!

查看全部评分

7 个回复

正序浏览
out.write("abc\n中国人");这句话在windows下默认都是GB2312编码的,就是新建记事本时候的ANSI编码。在其它系统下就不知道了,应该是系统默认的编码。在windows下的这种操作就好像用3楼的WriteFile方法,使用的是GB2312编码转字节后写字节数组到文件。
"\r\n"是两个符号。
'\r'是回车,'\n'是换行,前者使光标到行首,后者使光标下移一格。通常用的Enter是两个加起来。
'\r'的意思可以这么理解,你打印一个字符,打印头到右边了,你'\r'一下,就是左移打印头到行首覆盖刚打印了继续打印下一个字符。
你写进文件后可以用UE编辑器看其十六进制,前者是0x0D,后者是0x0A。
UE编辑器可以直接把'\n'当做"\r\n"显示,但是记事本就不行了,显示一个黑方块。
windows下一般在java中用String cr = "\r\n";定义回车符。使用时候直接操作cr变量。
回复 使用道具 举报
java中自带的开源代码没有read()和write()方法的源代码!
谢谢各位给我解答!但还是没有一 一回答我问发的问题?
1.out.write("abc\n中国人")这句代码执行有没有编码?
2.在java中\n就代表换行符,win中\r\n代表的是换行符。那我们执行这句代码out.write("abc\r\n中国人"),数据是怎么传递的?将\r\n存储到文本文件中的是什么?win是怎么识别存储到的数据就是代表换行符的?

回复 使用道具 举报
你是要看源码呀!
//-----------
你安装JDK的目录下,有个src.zip文件,这个就是JDK源代码的java文件。
你可以解压来查看,但,最好是关联到IDE如 eclipse 中(不需解压),然后 CTRL + 点击就可以查看到源代码了。
图示在附件
//----------采自百度知道----------

ac6eddc451da81cb4e7dd4815266d016082431e6.png (76.56 KB, 下载次数: 15)

ac6eddc451da81cb4e7dd4815266d016082431e6.png

评分

参与人数 1技术分 +1 黑马币 +6 收起 理由
狼王 + 1 + 6 很给力!

查看全部评分

回复 使用道具 举报
我对楼主的源码进行了测试,编码是GB2312的,我用记事本打开,完全正确啊,你说的\n也存在啊。
  1. import java.io.*;

  2. public class zcb {
  3.   public static void main(String[] args) {
  4.     try {
  5.       FileWriter out = new FileWriter("a.txt");
  6.       out.write("abc\n中国人");
  7.       out.close();

  8.       FileWriter out1 = new FileWriter("a1.txt");
  9.       out1.write("abc\r\n中国人");
  10.       out1.close();
  11.     }catch(Exception e){}
  12.   }
  13. }
复制代码

效果如下图显示:

第一个中间是一个黑块,因为windows下txt里的回车是换行回车,即\r\n,你用UE打开就可以显示正常的换行了。
楼主再测试一下吧,你的FileWriter没有问题的。

评分

参与人数 1技术分 +1 黑马币 +3 收起 理由
狼王 + 1 + 3 很给力!

查看全部评分

回复 使用道具 举报
楼主你好,我有简单的方法源码,你可以参考一下,如果文件不是很大,可以直接调用下面的方法:

  1.         public byte[] ReadFile(String FileName) throws Exception { //读取文件数据到byte数组后返回
  2.             FileInputStream in = new FileInputStream(FileName);
  3.             DataInputStream din = new DataInputStream(in);

  4.             //文件大小(字节)
  5.             int length = din.available();

  6.             if(length <= 0)
  7.             {
  8.               throw new Exception("文件大小为" + length + "字节,无法进行解析!");
  9.             }

  10.             byte[] data = new byte[length]; //存储文件的字节数据
  11.             din.readFully(data);//读取文件到字节数组,读满数组后才返回

  12.             din.close(); //关闭文件流
  13.             in.close();

  14.             return data;
  15.         }


  16.         public void WriteFile(String FileName, String s) throws Exception //写字符串到文件,ANSI编码
  17.         {
  18.             FileOutputStream out = new FileOutputStream(FileName);
  19.             BufferedOutputStream buffout = new BufferedOutputStream(out);
  20.             DataOutputStream dataout = new DataOutputStream(buffout);
  21.        
  22.             byte[] strbyte = s.getBytes("gb2312");
  23.             for (int i = 0; i < strbyte.length; i++)
  24.               dataout.writeByte(strbyte[i]);
  25.             dataout.close();
  26.         }


  27.         public void WriteFileB(String FileName, byte[] b) throws Exception //写字节数组到文件,ANSI编码
  28.         {
  29.             FileOutputStream out = new FileOutputStream(FileName);
  30.             BufferedOutputStream buffout = new BufferedOutputStream(out);
  31.             DataOutputStream dataout = new DataOutputStream(buffout);
  32.        
  33.             for (int i = 0; i < b.length; i++)
  34.               dataout.writeByte(b[i]);
  35.             dataout.close();
  36.         }
复制代码


你到项目里,直接调用即可,记得引入相关类包哦。
传入的文件参数可以是绝对的,也可以是相对的。
获取的是字节数组,你可以用String的new参数加编码格式换成字符串,在根据换行符号等逻辑进行转数组操作,从而获取每行信息。

下面我给出几个简单实用的实例:
  1. String s = new String(ReadFile(FileName), "gb2312")

  2. String str = "abcde\r\n编写文件测试";
  3. WriteFile("测试.txt", str);
复制代码

评分

参与人数 1技术分 +1 黑马币 +6 收起 理由
狼王 + 1 + 6 赞一个!

查看全部评分

回复 使用道具 举报
你要想得到abc\n中国,必须这样写out.write("abc\\n中国");
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马