java tt 7_java从零开始系列(七)IO随机流

RandomAccessFile  IO随机流

关于java的IO随机流,我们经常只想读取文件的一部分数据,而不需要从头至尾读取整个文件。我们想访问一个作为数据库的文本文件,访问时移动到某一条记录并读取它的数据,接着移动到另一个记录,然后再到其他记录――每一条记录都位于文件的不同部分。

Java编程语言提供了一个RandomAccessFile类来处理这种类型的输入输出,这就是java中的IO随机流。

javase8-1.jpg

例:打开一个数据库文件并准备更新

RandomAccessFile myRAFile;

myRAFile = new RandomAccessFile("db/stock.dbf","rw");

存取信息

RandomAccessFile对象按照与数据输入输出对象相同的方式来读写信息。我们可以访问在DataInputStrem和DataOutputStream中所有的read()和write()操作。

IO随机流操作方法

Java编程语言中API对IO随机流提供了若干种方法,用来帮助你在文件中移动.

long getFilePointer();

返回文件指针的当前位置。

void seek(long pos);

设置文件指针到给定的绝对位置。这个位置是按照从文件开始的字节偏移量给出的。位置0标志文件的开始。

long length()

返回文件的长度。位置length()标志文件的结束。

添加信息

我们可以使用随机存取文件来得到文件输出的添加模式。

myRAFile = new RandomAccessFile(“java.log”,“rw”);

myRAFile.seek(myRAFile.length());

压缩流

Java.util.zip包下面。

ZipEntry :在每一个压缩文件中都会存在多个子文件,那么这每一个的子文件在 Java 中就使用ZipEntry 表示。

ZipFile:是一个专门表示压缩文件的类。 在Java 中,每一个压缩文件都可以使用 ZipFile表示,还可以使用 ZipFile 根据压缩后的文件名称找到每一个压缩文件中的 ZipEntry并将其进行解压缩操作 。

ZipInputStream

ZipOutputStream

javase8-2.jpg

合并流

SequenceInputStream

javase8-3.jpg

public SequenceInputStream(InputStream s1,InputStream s2)使用两个输入流对象实例化本类对象

public int available() throws IOException  普通  返回文件大小

回退流

回退:给了用户第二次读的机会。

回退流:在Java.io 中所有的数据都是采用顺序的读取方式。即:对于一个输入流来讲都是采用从头到尾顺序读取的,如果再输入流中某个不需要的内容被读取进来,则只能通过程序将这些不需要的内容处理掉,为了解决这样的读取问题,在 Java 中提供了一种回退输入流(PushbackInputStream 和PushbackReader),可以把读取进来的某些数据重新退回到输入流的缓冲区之中。 使用InputStream 要使用 read()方法不断读取,是采用顺序的读取方式。

javase8-4.jpg

StreamTokenizer

尽管StreamTokenizer 并不是从 InputStream 或 OutputStream 衍生的,但它只随同 InputStream 工作, 所以十分恰当地包括在库的IO部分中。

StreamTokenizer 类用于将任何 InputStream 分割为一系列“记号”(Token)。这些记号实际是一些断续的文本块,中间用我们选择任何东西分隔:

例如,我们的记号可以是单词 ,中间用空白(空格 )以及标点符号分隔;

下面是一个简单的程序,用于计算各个单词在文本文件中重复出现的次数:

StreamTokenizer定义了几种基本的常量用于标识解析过程:

TT_EOF(流结尾)

TT_EOL(行结尾)

TT_WORD(一个单词)

TT_NUMBER(数字符号 0 1 2 3 4 5 6 7 8 9 . -都属于数字语法)。

StreamTokenizer的基本方法参见API

例二:

import java.io.*;

public class Test {

public static void main(String arg[]) {

try {

FileReader rd = new FileReader(“D:\temp\abcdef.txt”);

StreamTokenizer st = new StreamTokenizer(rd);

st.parseNumbers();

st.wordChars('.', '.');

st.eolIsSignificant(true);

st.ordinaryChars(0, ' ');

st.slashSlashComments(true);

st.slashStarComments(true);

int token = st.nextToken();

while (token != StreamTokenizer.TT_EOF) {

switch (token) {

case StreamTokenizer.TT_NUMBER:

double num = st.nval;

System.out.println(num);

break;

case StreamTokenizer.TT_WORD:

String word = st.sval;

System.out.println(word);

break;

case '"':

String dquoteVal = st.sval;

System.out.println(dquoteVal);

break;

case '\'':

String squoteVal = st.sval;

System.out.println(squoteVal);

break;

case StreamTokenizer.TT_EOL:

break;

case StreamTokenizer.TT_EOF:

break;

default:

char ch = (char) st.ttype;

System.out.println(ch);

break;

}

token = st.nextToken();

}

rd.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

StringTokenizer

StringTokenizer就是用来把一个字符串分成单个的字段的:

例如:   aa,bb:CC,如果我们想要分别得到   aa   bb   和   CC ?就像这样做:  StringTokenizer st = new StringTokenizer(“aa,bb:CC”, “,:”);

while (st.hasMoreElements()) {

System.out.print(st.nextElement() + " ");

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值