RandomAccessFile&IO流&排序&方法论

RandomAccessFile&IO流&排序&方法论

我们总觉得历史是极其遥远的东西,与我们并无关联,又觉得历史隐藏在图书馆的旧书之中。

然而,我们每个人都有真真切切的历史。那便是每日的历史。今天自己做了些什么,又是怎么做的,都会成为你历史中的一页。

是畏缩不前、碌碌无为,还是勇猛挑战,花心思比昨天做的更好。每种态度,都会写就属于你的历史。

——尼采 《快乐的知识》

RandomAccessFile

以下是昨天对RandomAccessFile的具体练习:

  1 package Zhang;
  2
  3
  4
  5 import java.io.File;
  6
  7 import java.io.IOException;
  8
  9 import java.io.RandomAccessFile;
 10
 11 import java.util.Arrays;
 12
 13
 14
 15 public class RandomAccessFileTest {
 16
 17       public static void main(String[] args) throws IOException {
 18
 19
 20
 21             File demo=new File("demo");//相对路径
 22
 23             if(!demo.exists()) demo.mkdir(); //如果目录不存在创建目录
 24
 25
 26
 27             File file=new File(demo,"raf.dat");
 28
 29             if(!file.exists()) file.createNewFile();//如果文件不存在,创建文件
 30
 31
 32
 33             RandomAccessFile raf=new RandomAccessFile(file,"rw");
 34
 35             //指针的位置
 36
 37             System.out.println(raf.getFilePointer());
 38
 39             raf.write(‘A‘);//只写了一个字节
 40
 41             System.out.println(raf.getFilePointer());
 42
 43             raf.write(‘B‘);
 44
 45
 46
 47             int i=0x7fffffff;
 48
 49             //底层的处理方法用write方法每次只能写一个字节,如果要把i写进去就要写四次
 50
 51             raf.write(i>>>24);//右移24,把高八位写进去。>>>无符号右移
 52
 53             raf.write(i>>>16);
 54
 55             raf.write(i>>>8);
 56
 57             raf.write(i);
 58
 59             System.out.println(raf.getFilePointer());
 60
 61             //其实可以直接写一个int
 62
 63             raf.writeInt(i);//此处可以查看writeInt()的实现方法,与上面的基本一样。
 64
 65
 66
 67             String s="中";
 68
 69             byte[] gbk=s.getBytes("gbk");//gbk的中文占两个字节
 70
 71             raf.write(gbk);
 72
 73             System.out.println(raf.getFilePointer());//查看此时指针的位置
 74
 75             System.out.println(raf.length());//查看文件的长度
 76
 77
 78
 79             //读文件,必须把指针移动到文件的开始位置
 80
 81             raf.seek(0);
 82
 83             //一次性读取,把文件的内容都读取到字节数组中
 84
 85             byte[] buf=new byte[(int)raf.length()];//字节数组的长度与文件的长度一致
 86
 87             raf.read(buf);//读取到字节数组当中
 88
 89             System.out.println(Arrays.toString(buf));
 90
 91
 92
 93             String s1=new String(buf);//把字节数组构造成为字符串
 94
 95             System.out.println(s1);
 96
 97             //以十六进制的形式输出
 98
 99             for(byte b:buf){
100
101                   System.out.print(Integer.toHexString(b&0xff)+" ");
102
103             }
104
105
106
107             byte [] b=new byte[2];
108
109             raf.seek(10);
110
111             raf.read(b,0,2);
112
113             String content=new String(b,"gbk");
114
115             System.out.println(content);//输出 “中”
116
117             raf.close();//关闭
118
119       }
120
121 }

IO流

下面是对明天即将进一步学习IO流做的准备:

IO流(输入流、输出流)

字节流、字符流(也就是以字节为单位,或者以字符为单位)

字节流:InputStream、OutputStream两个抽象类

InputStream抽象了应用程序读取数据的方式

OutputStream抽象了应用程序写出数据的方式

EOF=End 读到-1就读到结尾

重要的方法。in与out视为对象

输入流 键盘是一个输入

输入流基本方法:

lint b=in.read();读取一个byte到流,b的底8位

lin.read(byte[] buf);读取一个byte数组

lin.read(byte buf,int start,int size);从byte数组的start位置读取长度为size的字节

输出流基本方法:

lout.write(int b)写出一个byte到流,b的底八位。

lout.write(byte[] buf)将buf字节数组都写到流

lout.write(byte[] buf,int start,int size)字节数组buf从start位置开始写size长度的字节到流。

InputStream、OutputStream两个抽象类的第一组子类

FileInputStream------->具体实现了在文件上读取数据

数组排序

今天课上我简单的练习了数组的常用排序:

  1 package Zhang;
  2
  3 import java.util.Arrays;
  4
  5 public class ArrayTest {
  6
  7      /**
  8
  9      * 冒泡排序
 10
 11      * @param arrays 数组
 12
 13      * @author zhang
 14
 15      * */
 16
 17      public static void sort(int [] arrays){
 18
 19           for(int i=1;i<arrays.length;i++){
 20
 21                for(int j=0;j<arrays.length-i;j++){
 22
 23                     if(arrays[j]>arrays[j+1]){
 24
 25                          int tmp=arrays[j];
 26
 27                          arrays[j]=arrays[j+1];
 28
 29                          arrays[j+1]=tmp;
 30
 31                     }
 32
 33                }
 34
 35           }
 36
 37      }
 38
 39      /**
 40
 41      * 直接排序
 42
 43      * @param arrays 数组
 44
 45      * @author zhang
 46
 47      * */
 48
 49      public static void sort2(int [] arrays){
 50
 51           for(int i=0;i<arrays.length-1;i++){
 52
 53                for(int j=i+1;j<arrays.length;j++){
 54
 55                     if(arrays[i]<arrays[j]){
 56
 57                          int tmp=arrays[i];
 58
 59                          arrays[i]=arrays[j];
 60
 61                          arrays[j]=tmp;
 62
 63                     }
 64
 65                }
 66
 67           }
 68
 69      }
 70
 71      /**
 72
 73      *  快速排序
 74
 75      * @param a 数组
 76
 77      * @param low开始的位置
 78
 79      * @param high结束的位置
 80
 81      * @author zhang
 82
 83      *
 84
 85      * */
 86
 87      public static void sort3(int[] a,int low,int high){
 88
 89           if(low>=high) return;
 90
 91           int first=low;
 92
 93           int last=high;
 94
 95           int key=a[first];
 96
 97           while(first<last){
 98
 99                while(first<last&&a[last]>=key){
100
101                     last--;
102
103                }
104
105                a[first]=a[last];
106
107                while(first<last&&a[first]<=key){
108
109                     first++;
110
111                }
112
113                a[last]=a[first];
114
115           }
116
117           a[first]=key;
118
119           sort3(a,low,first-1);//当这个函数递归结束时下面的high是上一个函数的first-1.所以low与high不能写成0与a.length-1。
120
121           sort3(a,first+1,high);
122
123      }
124
125
126
127      public static void main(String[] args) {
128
129           int a[]={8,4,3,2,7,5,4,9,67,89,32,7,0,99,12};
130
131           sort3(a,0,a.length-1);
132
133           System.out.println(Arrays.toString(a));
134
135           Arrays.fill(a,100);
136
137           System.out.println(Arrays.toString(a));
138
139           Arrays.fill(a,3,6,200);
140
141           System.out.println(Arrays.toString(a));
142
143      }
144
145 }

更多的内容如果以后用的到,自己就去查阅官方说明文档。

方法论

学 习一个新知识,首先要对这个新的知识百度一下或者其他方式了解,这种新知识是为了解决什么问题而出现的。然后是知道些这种知识技术解决问题的原理,使用这 种知识的规则以及常用技术与思想。通过网上视频教程简单入门,深入下去是找权威书籍与官方的说明文档去阅读。之间要进行必要的练习,最后在实际的应用中灵 活运用。复杂的问题也是由简单的组成的,仔细分析他们是怎么系统的组成在一起的,互相之间是怎么起作用的,在注重基础的同时也不要在舒适区停留,不断的向 新的内容进军旧的知识才能更牢固和发挥力量。探索学习自己未知的是不容易的,但那也是走出没有新鲜感的唯一途径。对于卓越的人,自己不被理解是别人的问 题,对于最求卓越的自己,不能或不去理解卓越的人的成果是件悲哀的事。不进步不痛快!以我现在的时间和我根据自己的学习经历总结的学习方法,我应该下一步 做什么呢?先把前几天审视思考总结出来的问题在解决吧,问题是复杂的,自己就不要想太多给自己添乱了。

欲多则心散,心散则志衰,志衰则思不达。——《鬼谷子》

对的,当考虑整体的时候就不要深陷细节,专注细节的时候就不要过多分心其他。

2016-10-10

时间: 2024-08-11 12:32:15

RandomAccessFile&IO流&排序&方法论的相关文章

黑马程序员 - IO流(下)

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 用于操作字节数组的流对象ByteArrayInputStream:在构造的时候需要接收数据源,而且数据源是一个字节数组.ByteArrayOutputStream: 在构造时,不用定义数据目的地, 因为该对象中已经封装流一个可变长度的字节数组,该数组就为数据目的地.因为这两个流对象都操作的数组,并没有使用系统资源,所以不用进行close关闭,而且其不会产生IO异常.这种方法是用流的思想操作数组

Java IO流 探险

Java的IO流使用了一种装饰器设计模式,它将IO流分为底层节点流和上层处理流.本篇重点在如何访问文件与目录.如何以二进制格式和文本格式来读写数据.对象序列化机制.还有Java7的"NIO.2". 装饰设计模式:当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能.那么自定义的该类称为装饰类. 装饰类通常会通过构造方法接收被装饰的对象.并基于被装饰的对象的功能,提供更强的功能. IO的方式通常分为:BIO(同步阻塞).NIO(同步非阻塞).AIO

Java:IO流与文件基础

Java:IO流与文件基础 说明: 本文所有内容包含图片均为MrSaber自己编写,转载请练习我哦. 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列的对象称作 输入流,可以向其中写入一个字节序列的对象称作 输出流. ? 这些字节序列的来源可以是:文件.网络连接.内存块等. ? 抽象类InputStream和OutputStream是构成输入/输出(I/O)的基础. ? 因为面向字节的流

5. IO流:★★★★★

IO流:★★★★★,用于处理设备上数据. 流:可以理解数据的流动,就是一个数据流.IO流最终要以对象来体现,对象都存在IO包中. 流也进行分类: 1:输入流(读)和输出流(写). 2:因为处理的数据不同,分为字节流和字符流. 字节流:处理字节数据的流对象.设备上的数据无论是图片或者dvd,文字,它们都以二进制存储的.二进制的最终都是以一个8位为数据单元进行体现,所以计算机中的最小数据单元就是字节.意味着,字节流可以处理设备上的所有数据,所以字节流一样可以处理字符数据. 那么为什么要有字符流呢?因

IO流(四):其他流

一.操作基本数据类型的流 (一)构造方法 1.数据输入流:DataInputStream(InputStream in) 2.数据输出流:DataOutputStream(OutputStream out) (二)方法 1.DataOutputStream: writeByte(10); writeShort(100); writeInt(1000); writeLong(10000); writeFloat(12.34F); writeDouble(12.56); writeChar('a')

C++学习之IO流

本博文主要介绍IO流中fstream,iterator的简单应用. 问题描述: a):找一篇文章(The Bble Holy) ,将其所有的单词输入vector中,并统计其单词个数 b):增加统计词频功能,用结构体实现(word ,count) ,将结构体存入vector中 c):增加体用词功能. 1):从网上找 英文停用词,并命名为 stop_list.txt: 2):统计词频时,若遇到此类词直接略过. d):计算上述话费时间,具体有: 1):读取文件时间: 2):排序所用时间: 3):打印多

java中io流浅析

1.java.io包下File类:java程序中的此类的一个对象,就对应着硬盘中的一个文件或网络中的一个资源.File file1 = new File("d:\\io\\helloworld.txt");File file2 = new File("d:\\io\\io1");>1.File既可以表示一个文件(.doc .xls .mp3 .avi .jpg .dat),也可以表示一个文件目录!>2.File类的对象是与平台无关的.>3.File

IO流4

IO流的分类 根据处理数据类型的不同分为:字符流和字节流 根据数据流向不同分为:输入流和输出流 字符流和字节流 字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象.本质其实就是基于字节流读取时,去查了指定的码表. 字节流和字符流的区别: 读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节. 处理对象不同:字节流能处理所有类型的数据(如图片.avi等),而字符流只能处理字符类型的数据. 结论:只要是处理纯文本数据,就优先考虑使用

Java中IO流

* IO流用来处理设备之间的数据传输 * Java对数据的操作是通过流的方式 * Java用于操作流的类都在IO包中 * 流按流向分为两种:输入流,输出流. * 流按操作类型分为两种: * 字节流 : 字节流可以操作任何数据,因为在计算机中任何数据都是以字节的形式存储的 * 字符流 : 字符流只能操作纯字符数据,比较方便. 字节流 |--InputStream(字节输入流,字节流的抽象父类,抽象类不能直接创建对象,必须使用子类) |--FileInputStream(文件字节输入流,就是以字节的