我的博客日记

来源:互联网 发布:淘宝联盟有风险吗 编辑:程序博客网 时间:2024/05/17 03:25

4.25
学位考试刚考完,又要回家办理银行卡挂失的事情,所以处于无网络的状态,只能同学笔写日记日后再腾上博客了,这两天要学习的是I/O和网络编程,I/O之前是有学习过的,所以准备花一两天的时间把网络编程学习一下,今天已经25了,也不知道还能不能来得及看完所有的课程,如果来不及,也只好在硬着头皮参加入学考试了,只怪自己后知后觉,到现在才知道黑马训练营。
randomacessfile概要,1.skip用法,seek用法,readChar(),writechars()实现字符读取写入,使用skip方法时要注意的是要跳过的是字符数乘以2。在inputstream和outputstream教程中,张老师更是一语点醒梦中人,在学习编程的时候更应该去开阔视野,多去掌握原理性的知识,而不必要拘泥于小节,如记住每个api的方法名,变量参数等信息,这些东西可以随时查看文档,这都是我不曾注意过的事情,也没有人告诉我该这样去学习。
4.26
受益最深的是二进制文件和文件文件的区别。文本文件是二进制文件的一种特列,一个字节占八位,可以表示0到255之间的数字,其中每个数字有相应的字符表示或者非字符表示,其中有些可以用于显示,有些则表示特殊含义,文本文件则是其中特殊的用于显示的字节或者相邻字节的组合。
字节流和字符流的特点,字节流主要用于读二进制文件,字符流主要读文本文件,字节流在写入的时候应为使用的read方法中参数的byte[]数组,在写入时候就调用了flush()方法,所以是直接写入硬盘的,但是字符流在写入的时候会先写进缓冲区,如果不掉用close()方法的话,那么是无法写入硬盘的。在读取的是时候两者差不错,一个读的是字节数组(byte[]),一个读的是字符数组(char[])。使用Thread类来练习PipedOutputStream和PipedInputStream的使用方法,使用connect方法连接管道。使用管道流的用处:实现各个程序之间的松耦合通信。System.in是连接到键盘的。System.out是连接到显示器的,以前我知道是这么用,但却并不知道为什么会是这样,张老师的视屏里都做了介绍。
4.27
貌似进度有点缓慢啊,两天的时间才看了6个视屏,要加紧速度啊。在第七讲中的字符编码真是有用啊,utf-8和unicode的转换也是耳目一新的知识点,在讲解unicode字符集的时候,心中还在想,计算机如何从一串字符中随机读取两个字符(两个字符代表一个含义,或ASCII或者对应的本地字符集),在看到utf-8的时候便豁然开朗,不仅解决了随机读取的问题,更是便于在传输过后进行检验数据有无传输错误,还有由于unicode多加一个字节时候添加的0x00H所引起的麻烦也解决了。两者的转换方法更是让我钦佩其发明者的智慧。但是还有一个问题,诸如网络里的透明传输问题,例如一个英文字母,占用一个字节的位置,起始位是0,后七位可以是0-127的任何数字,那么比如这个数字是32,即第七位也是0,那么怎么样在读取的时候可以认识出前面一个0才是这个字节的起始位。当我看到字符集在应用程序里的一个bug后,还真有类似的bug(--)!,关于联通联想的bug问题大概懂是什么意思,但是并不能行云流水的说出产生bug的整个过程,原因是对utf-8和unicode的转换比较陌生。待日后具体研究一下。bufferedInputStream和DataInputStream同属于包装类,即他需要传进outputStream和InputStream类的子类实例。在dataoutputstream中只有readUTF方法,没有readchars和readbytes方法。
4.28
今天把I/O看完了,在看到进程间通信的时候自己老是调试不成功,明明照着老师的代码写,最后为什么老是不能运行成功。经过反复的调试,最后终于也成功了,为什么会这样呢,其中一开始是我异常没有捕获,eclipse也没有发出编译错误,然后之后修改正确之后还是不行,不能运行成功,于是我便又再看了老师做了一遍,发现老师总是在jcreater中编译好了以后在命令行中执行java命令,我一直认为eclipse应该比jcreater智能一些,之前的程序老师跳出去在命令行执行,我也直接在eclipse中执行成功了,但是这次有点不一样的地方便是在TestInOut中运行的时候,无法事先编译MyTest,使之成为字节文件(我想应该在eclipse中是可以的,但是我没有找到方法),最后在通过命令行的时候把MyTest事先编译,然后再运行TestInOut的时候终于成功了。整个过程一直从吃午饭之前到下午两点多,搞了我整整三个小时。效率真是低啊。但是印象也深了,以前我学习java的时候只看不练,结果发现这次看得时候好多都忘记了。甚至有些都没有印象了。
思考与练习:
1.这第一题貌似有点难啊,因为不能上网,所以不知道怎么查找文件的后缀名,在文档中也没找到类似的方法,只好自己用笨方法取出全部的名字,在查找后缀名,我用的判断语句是if(str1=="txt")的时候先输出file的名字,这样就能筛选出txt文件,但是一直就是没有结果,我百思不得其解,郁闷了半个小时左右,后来终于想到要用equals方法,唉,都是c语言里留下来的坏习惯,c++里应为使用了运算符重载可以直接比较,但是java中等于号比较的是地址,equals比较的才是内容是否相等,没网的日子真是痛苦啊。。。。。做了将近三个小时,终于把第一道题目给做好了,虽然很艰难,但是做出来的感觉真是很好。显示搜索出目录下的全部file类项目和子目录下的file类项目,进行筛选出txt文件,再将他们用合并流合并,输出到一个合并文件上,再读取合并文件,通过read()返回的数字来控制生成文件的大小,这里为了方便查看,我将大小设置为3k大小,再通过循环控制使之生成多个txt文件,其中遇到的麻烦还有输出流覆盖,这个也搞了我好久时间,索性在文档中找到了对应的解决方案,在参数里加入true即可。这倒程序的不足:将文件首先全部读入一个文件之中,没有采用边读边写的策略,所以当目录下的文件过多的时候效率就会低下去,这就好比xml文件中dom解析比sax解析不足之处。后面的题目反而简单了,我感觉。
package chenyu.com;
import java.io.*;
public class Excise {
 static int  number = 0;
 
 /**
  * @param args
  */
 public static void main(String[] args) throws Exception{
  // TODO Auto-generated method stub
  int count = 0;
  int count1=1;
  int temp = 0;
  File my = new File("d:" + File.separator+"TDownload") ; // 操作路径
  print(my) ;
  FileInputStream fis = new FileInputStream("union2.txt");
  
  //FileOutputStream fos = new FileOutputStream("1.txt");
  while((temp=fis.read())!=-1){
   FileOutputStream fos = new FileOutputStream(count1+".txt",true);
   fos.write(temp);
   count++;
   if(count%4==0){
    count1++;
    fos.close();
   }
  }
  fis.close();
 }
 public static void print(File file){ // 递归调用
  if(file!=null){ // 判断对象是否为空
   if(file.isDirectory()){ // 如果是目录
    File f[] = file.listFiles() ; // 列出全部的文件
    if(f!=null){ // 判断此目录能否列出
     for(int i=0;i<f.length;i++){
      print(f[i]) ; // 因为给的路径有可能是目录,所以,继续判断
     }
    }
   }else{
    String str=file.getAbsolutePath();
    int  end = str.length();
    int start = str.length()-3;
    String str1=str.substring(start,end);
    try{
      FileOutputStream fos = new FileOutputStream("union2.txt",true);
      FileInputStream fis2 = null;
      SequenceInputStream sis = null;//使用合并流合并txt文件
      int temp=0;
      FileInputStream fis1 = new FileInputStream("unio.txt");
      if("txt".equals(str1)){
       fis2 = new FileInputStream(file);
       sis = new SequenceInputStream(fis1,fis2);
       while((temp=sis.read())!=-1){
        fos.write(temp);
        number++;
       }
       sis.close();
       fis1.close();
       fis2.close();
       fos.close();
       System.out.println("sucess!"+number);
      }
    }catch(Exception e){
     e.printStackTrace();
    }
    
    
    
    // 输出路径
   }
  }

}

 

 

第二题:关于概念问题,还真是我的弱项,只好返回前面的视屏再看一遍。
什么是流:运动中(传输中的)有序的数据。文件是数据的静态集合,流就是数据的动态集合。
什么是节点流:节点流是直接操作目标文件或者源文件的流,比如InputStream之类,而包装类则是相应的过滤流,这种类无法独自操纵文件,必须通过节点流来操纵,但可以达到更好的效果,比如数据流可以传送各种数据类型,对象流可以传动对象数据,但是必须建立在节点流的基础上。

第三题:package chenyu.com;
import java.io.*;
public class StringReaderTest {

 /**
  * @param args
  */
 public static void main(String[] args) throws Exception{
  // TODO Auto-generated method stub
        transform();
 }
 public static void transform()throws Exception{
  String str = "sbcdefghijklmnopqrst";
  StringReader sr = new StringReader(str);
  StringWriter sw = new StringWriter();
  int temp =0;
  int len= 0;
  char[] c = new char[1024];
  len = sr.read(c);
  String str1= new String(c,0,len);
  String str2 = str1.toUpperCase();
  //System.out.println(str2);
  sw.write(str2);
  
  System.out.println(sw.toString());
 }

}
第四题:gb2312:D6 D0 B9 FA  //GB2312中国分别为两个字节
        UTF-8: EF  BB BF E4 B8 AD E5 9B BD //UTF-8中国两个字分别是三个字节,其中,前三个字节是UTF-8的标记
        unicode:FF FE 2D 4E FD 56//分别为两个字节

第五题:第一种方案:InputStreamReader isr = new InputStreamReader(System.in,"GB2312");
        第二种方案:没想到,试了好久都没有成功,iso8859-1的字符编码规则是每个字符占一个字节,但是“中国”两个字每个字占用2个字节,保存的时候不知道是不是只保存中国的低字节位,待有网的时候上网问一下别人。

4.29
突然想起了昨天的第五题,把gb2312的十六进制和iso8859-1的十六进制写下来分别是4e2d 56fd 和 d6 d0 b9 fa,都为两个字节,所以昨天的想法就是错误的了。现在的新疑问是:本地字符集到底是否可以转换?byte[]  buf = strLine.getBytes("iso8859-1");
 
 
 System.out.println(new String(buf,"gb2312"));返回第十集中的内容,终于找到了答案,因为第十讲的时候没有跟着一起输入代码测试,印象较浅,老师已经将答案写出来了。看得时候还是有点走马观花的意思。这样I/O篇就这样结束了。
网络第一讲,最大的收获莫过于socket这个名词的讲解,之前还是对网络编程没什么了解。
4.30
网络编程看到了第三个视屏,今天去学校,恐怕看不成了。