整个课程的大纲:
1.编码问题.
2.File类的使用
3.RandomAccessFile的使用
4.字节流的使用.
5.字符流的使用.
6.对象的序列化和反序列化.

视频1:文件的编码
Eclipse的一大特点是当你拷贝一个文件到字符编码不一样项目中的时候,再打开会变成乱码,
但是当你拷贝文件中的整个内容到另一个编码不一样的项目中的时候,Eclipse会自动转码成
所在项目中的编码格式.(这样就不会出现乱码.)

中文系统下ANSI编码代表GBK编码.
"联通"和"联"和"联想"分别另存为的编码是不一样的(见我附录的截图)
"联通"和"联"是UTF-8 "联想"是ANSI

程序例子:

 package cn.itcast.io;

 import java.io.UnsupportedEncodingException;

 public class EncodeDemo {
     public static void main(String[] args) throws Exception {
         String s = "慕课ABC";//变成一个字节数组. 一个汉字占用两个字节.英文占用一个字节.
         byte[] byte1 = s.getBytes();//转换成字节序列的作用是项目默认的编码GBK
         for (byte b : byte1) {
             //把字节(转换成了int)以16进制的方式显示
             //System.out.print(Integer.toHexString(b)+" ");
             //输出的是:ffffffc4 ffffffbd ffffffbf ffffffce 41 42 43
             //用十六进制的ff(ox)
             System.out.print(Integer.toHexString(b & 0xff)+" ");
             //输出的是:c4 bd bf ce 41 42 43
         }
         System.out.println();
         byte [] bytes2 = s.getBytes("gbk");
         //gbk编码中文占用两个字节,英文占用一个字节.
         for (byte b : bytes2) {
             System.out.print(Integer.toHexString(b & 0xff)+" ");
             //和上面的输出是一样的:c4 bd bf ce 41 42 43
         }
         System.out.println();

         byte [] bytes3 = s.getBytes("utf-8");
         for (byte b : bytes3) {
             System.out.print(Integer.toHexString(b & 0xff)+" ");
             //输出:e6 85 95 e8 af be 41 42 43
         }
         //可以看出utf-8编码中,中文是三个字节,英文是占用一个字节.
         //java是双字节编码.utf-16be编码
         System.out.println();

         byte [] bytes4 = s.getBytes("utf-16be");
         for (byte b : bytes4) {
             System.out.print(Integer.toHexString(b & 0xff)+" ");
             //输出:61 55 8b fe 0 41 0 42 0 43
             //中文占用两个字节,英文占用两个字节.
         }
         System.out.println();
         //当你的字节序列是某种编码的时候,这个时候想要把字节序列变成字符串.
         //也需要通用这种编码方式.否则会出现乱码.
         String str1 = new String(bytes4);
         //String(byte[] bytes) 通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。
         System.out.println(str1);
         //输出的是乱码:aU孇 A B C    因为bytes4是用的默认的"gbk"的编码.但是实际上是"utf-16be"的编码
         String str2 = new String(bytes4,"utf-16be");
         System.out.println(str2);//慕课ABC
         //正常输出"慕课ABC"

         /**
          * 文本文件就是字节序列.
          * 可以是任意编码的字节序列
          * 如果我们在中文机器上直接创建文本文件.那么该文本文件值认识ANSI编码.
          * 联通 联 这两个是一个巧合,他们正好符号utf-8的编码规则.
          */

     }
 }

File类
java.io.File类用于表示文件(目录)
File类只用于表示文件(目录)的信息(名称,大小等),不能用于文件内容的访问.
例子2:

 package cn.itcast.io;

 import java.io.File;
 import java.io.IOException;

 public class FileDemo {
     public static void main(String[] args) {
         File file = new File("G:/kxhtest/test");//在构造的时候可以用双斜杠,也可以用反斜杠.
         //也可以用
         File file2 =  new File("e:"+File.separator); //这样可以不管在什么系统中.
         System.out.println(file.exists());//判断文件是否存在.
         if(!file.exists()){
             //file.mkdir();//只能创建一个一级的目录 创建的仅仅是是文件目录,并不是文件.
             //还有一个是创建多级目录的文件.
             file.mkdirs();
         }else{
             file.delete();
         }
         //判断是否是一个目录:返回的是true或者是false
         System.out.println(file.isDirectory());
         //判断是否是一个文件.
         System.out.println(file.isFile());

         File file3 = new File("e:javaio/日记1.txt"); //javaio文件夹必须存在才能创建.不存在不能创建.
         File file4 = new File("e:\\javaio","日记1.txt");
         if(!file3.exists()){
             try {
                 file3.createNewFile();
             } catch (IOException e) {
                 e.printStackTrace();
             }
         }else{
             file3.delete();
         }
         System.out.println(file3);//打印的是file的目录.相当于file.toString()的内容
         //e:javaio\日记1.txt
         System.out.println(file3.getAbsolutePath());
         //e:\\javaio\日记1.txt
         System.out.println(file3.getName());
         //日记1.txt
         System.out.println(file3.getParent());
         //e:javaio
         System.out.println(file3.getParentFile().getAbsolutePath());
         //e:\\javaio
     }
 }

File类的使用

 package cn.itcast.io;

 import java.io.File;
 import java.io.IOException;

 /**
  * 列出File的一些常用操作,比如过滤,遍历等操作.
  * @author kongxiaohan
  *
  */
 public class FileUtils {
     /**
      * 列出指定目录下(包括其子目录)中的所有文件
      * @param dir
      * @throws IOException
      */
     public static void listDirectory(File dir) throws IOException{
         if(!dir.exists()){
             throw new IllegalArgumentException("目录"+dir+"不存在");
         }
         if(!dir.isDirectory()){
             throw new IllegalArgumentException(dir+"不是目录");
         }
         /*
         String [] filesnames = dir.list();
         //list()方法用于列出当前目录下的子目录和文件.
         //返回的是字符串数组.直接子的名称,不包含子目录下的内容.
         //所以要判断如果是子目录的话要继续进行遍历取到文件.
         for (String string : filesnames) {
             System.out.println(dir+"\\"+string);
         }
         */

         //如果要遍历子目录下的内容就需要构造成File对象做递归操作.File提供了直接返回File对象的API
         File [] files = dir.listFiles();
         //返回的是直接子目录(文件)的抽象 返回的是File对象.
         if(files != null && files.length>0){
             for (File file : files) {
                 //递归
                 if(file.isDirectory()){
                     listDirectory(file);
                 }else{
                     System.out.println(file);
                 }
             }
         }
     }
 }

 对应输出:
 D:\360Apps\AppDownload\kxh\test.txt
 D:\360Apps\defrag.dat

RandomAccessFile类

RandomAccessFile类是java对文件内容的访问,既可以读文件也可以写文件.
RadomAccessFile可以随机访问文件.可以访问文件的任意位置.

(1)java文件的模型
在硬盘上的文件是byte byte byte 存储的,是数据的集合.
(2)打开文件
有两种模式 一种是"rw"(读写) "r"(只读)
RandomAccessFile raf = new RandomAccessFile(file,"rw");
文件指针,打开文件时指针在开头 pointer = 0;
(3)写方法
raf.write(int)---->只写一个字节(后8位),同时指针指向下一个位置.准备再次写入
(4)读方法
int b = raf.read()---->读一个字节.
(5)文件读写完成之后一定要关闭(Oralce 官方说明 会产生意想不到的错误.)

 package cn.itcast.io;

 import java.io.File;
 import java.io.IOException;
 import java.io.RandomAccessFile;
 import java.util.Arrays;

 /**
  * 迅雷中就是多个线程在同时下载同一个文件,每个线程下载文件的一部分,然后拼接在一起.
  * (拼接的时候一定要记住文件的位置,这个时候用的就是RandomAccessFile)
  * @author kongxiaohan
  *
  */
 public class RafDemo {
     public static void main(String[] args) throws Exception {
         File demo = new File("demo");
         if(!demo.exists()){
             demo.mkdir();
         }
         File file = new File(demo,"raf.dat");
         if(!file.exists()){
             file.createNewFile();
         }
         RandomAccessFile raf = new RandomAccessFile(file, "rw");
         //指针的位置.
         System.out.println(raf.getFilePointer());
         raf.write('A');//只写了一个字节.只写了后八位
         System.out.println(raf.getFilePointer());
         raf.write('B');
         System.out.println(raf.getFilePointer());

         int i = 0x7fffffff;//这个是最大的int类型的数
         //用write方法,每次只能写一个字节,如果要把i写进去,就要写4次.
         raf.write(i>>>24);//右移了24位,就把高8位留出来了.
         raf.write(i>>>16);//第二个高8位
         raf.write(i>>>8);
         raf.write(i);//高8位
         System.out.println(raf.getFilePointer());

         //可以直接写一个int
         raf.writeInt(i);//直接写应int,其底层就是上面右移的过程,可以看一下源码.
         System.out.println(raf.getFilePointer());
         /*
         write((v >>> 24) & 0xFF);//与上oxFF就是为了去掉前面的0
         write((v >>> 16) & 0xFF);
         write((v >>>  8) & 0xFF);
         write((v >>>  0) & 0xFF);
         */

         String s = "中";//在java的字符串是utf-16be的编码
         byte[] gbk = s.getBytes("gbk");
         raf.write(gbk);
         System.out.println(raf.length());

         //读文件,必须把指针移动到头部
         raf.seek(0);
         //一次性读取.把文件中的内容都读取到字节数组中.
         //上面说到文件再硬盘上本身就是一个byte byte byte的集合. 读取出来还是一个集合.
         byte[] buf = new byte[(int)raf.length()];
         //RandomAccessFile类的length()方法是返回的long类型的.
         raf.read(buf);//这种read是一次性全部读取.
         //也可以一次性读取特定的字节.
         System.out.println(Arrays.toString(buf));

         String s1 = new String(buf,"gbk");
         System.out.println(s1);

         for (byte b : buf) {
             System.out.print(Integer.toHexString(b & 0xff)+" ");
         }
         raf.close();//一定要加上close
     }
 }

字节流之文件输入流FileInputStream
IO流是java做输入输出的基础,可以分为输入流和输出流.
字节流和字符流.(读写文件的单位)
1.字节流
1>InputStream ,OutputStream 这两个类是抽象类.
InputStream抽象了应用程序读取数据的方式.
OutputStream抽象了应用程序写出的数据方式.
2>EOF = End 读取到-1就读到结尾.
3>输入流.(键盘是输入文件,是用来读的.)
所以输入流的方法主要是读:
int b = in.read();读取一个字节.无符号填充到int的低八位.-1是EOF.
in.read(byte[] buf)读取数据填充到字节数组buf.
in.read(byte[] buf,int start,int size)读取数据到字节数组buf.从buf的start位置开始存放size长度的数据.
4>输出流是用来写的操作
out.write(int b) 写出一个byte到流.b的低8位.
out.write(byte[] buf)将buf字节数组都写入到流.
out.write(byte[] buf,int start,int size)字节数组buf从start位置开始写size长度的字节到流.

5>FileInputStream---->具体实现了在文件上读取数据.
例子:

 package cn.itcast.io;

 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.IOException;

 public class IOUtils {
     /**
      * 读取指定文件内容,按照16进制输出到控制台.
      * 并且每输出10个byte进行换行.
      * @param fileName
      * @throws IOException
      */
     @SuppressWarnings("resource")
     public static void printHex(String fileName) throws IOException{
         //把文件作为字节流进行读操作
         FileInputStream in = new FileInputStream(fileName);
         int b;
         int i=1;
         while((b = in.read())!=-1){
             if(b<=0xf){//说明读取到的b是1位的,我们想让其两个两个的输出.
                 //单位数前面补0
                 System.out.print("0");
             }
             System.out.print(Integer.toHexString(b)+" ");
             if(i++ % 10 ==0){// 并且每输出10个byte进行换行.
                 System.out.println();
             }
         }
         in.close();
     }
 }

[未完成][Mooc]关于IO总结的更多相关文章

  1. [未完成][Mooc]关于Linxu的总结(一)

    视频1:Linux之前有个Minix(这个是一个教授用来教学用的)开源的,不是编译过的,不能通过QQ.exe找到其源码.后来Linus这个家伙搞了一个Linux.服务器领域超过百分之八十.linux是 ...

  2. [未完成][Mooc]关于线程的总结

    进程和线程.Eclipse,QQ都是进程.是程序或者任务的执行过程,是动态性.持有资源(共享内存,共享文件)和线程. 这个资源就是内存. 每个程序在运行的时候都会分配一些内存. Eclipse中的源代 ...

  3. Windows核心编程:第10章 同步设备IO与异步设备IO

    Github https://github.com/gongluck/Windows-Core-Program.git //第10章 同步设备IO与异步设备IO.cpp: 定义应用程序的入口点. // ...

  4. day02 真正的高并发还得看IO多路复用

    教程说明 C++高性能网络服务保姆级教程 首发地址 day02 真正的高并发还得看IO多路复用 本节目的 使用epoll实现一个高并发的服务器 从单进程讲起 上节从一个基础的socket服务说起我们实 ...

  5. VS2015编译GEOS

    下载链接:http://trac.osgeo.org/geos/ 1. 打开cmake,加载geos源码和定位geos的工程存放位置: 2.点击configure,会报错,首先设置CMAKE_INST ...

  6. java 中 IO 流分为几种?(未完成)

    java 中 IO 流分为几种?(未完成)

  7. 13 IO多路复用 (未完成)

    IO多路复用 6.select版-TCP服务器:最多1024 import select import socket import sys server = socket.socket(socket. ...

  8. [原] KVM 虚拟化原理探究(6)— 块设备IO虚拟化

    KVM 虚拟化原理探究(6)- 块设备IO虚拟化 标签(空格分隔): KVM [toc] 块设备IO虚拟化简介 上一篇文章讲到了网络IO虚拟化,作为另外一个重要的虚拟化资源,块设备IO的虚拟化也是同样 ...

  9. io.js的服務器突破

    Node.js与io.js那些事儿 InfoQ中文站 05月20日 14:26 去年12月,多位重量级Node.js开发者不满Joyent对Node.js的管理,自立门户创建了io.js.io.js的 ...

随机推荐

  1. Hibernate之基于外键映射的一对一(1-1)关联关系

    1.对于基于外键的1-1关联,其外键可以存放在任意一边,在需要存放外键一端,增加many-to-one元素.为many-to-one元素增加unique="true"属性来表示为1 ...

  2. 您需要来自administrators的权限才能对此文件进行更改

    今天我重装了系统,以前D盘里的一个文件夹想删除,可以一直没法删除,原先它提示"您需要来自 S-1-5-21-602162358-1284227242-682003330-500 的权限才能对 ...

  3. AngularJS~集成的ajax和服务的注入

    AngularJS很美,以至于迷倒了不少年青人和我这位大叔,它的美不仅仅是在写法上,而且在设计方法上都进乎于完美,用什么服务就注入什么服务,这样方法本来就很直观,程序员感觉直观了,程序在运行起来也按需 ...

  4. 深入浅出之Smarty模板引擎工作机制(二)

    源代码下载地址:深入浅出之Smarty模板引擎工作机制 接下来根据以下的Smarty模板引擎原理流程图开发一个自己的模板引擎用于学习,以便加深理解. Smarty模板引擎的原理,其实是这么一个过程: ...

  5. windows 下实现函数打桩:拦截API方式

    windows 下实现函数打桩:拦截API方式            近期由于工作须要,開始研究函数打桩的方法. 由于不想对project做过多的改动,于是放弃了使用Google gmock的想法. ...

  6. GLSL实现简单硬件Anisotrop Lighting 【转】

    http://blog.csdn.net/a3070173/archive/2008/11/13/3294660.aspx 各向异性光照往往用于处理一些具有各向异性表面的物体,如:光盘的盘面.为避免在 ...

  7. [MODx] 2. Install some useful packages into ur MODx

    1. The package we might need: 2. Install the package: Select Installer Download Extras Install the p ...

  8. ExpandableListView 箭头靠右

    ExpandableListView 默认标示箭头是在左边的,当左边有图片时,不是太好看,想把它放在右边,这么简单的事可我折腾死了,还好给我找到了. 参照了以下链接: expandableListvi ...

  9. android152 笔记 2

    27.谈谈UI中, Padding和Margin有什么区别? Padding 文字对边框, margin是控件对父窗体. 28. widget相对位置的完成在activity的哪个生命周期阶段实现.控 ...

  10. MYSQL-- binlog事件详解

    mysqlbinlog -vvv log.000001 # at # :: server id end_log_pos CRC32 sequence_number= SET @@SESSION.GTI ...