RandomAccessFile IO随机流
关于java的IO随机流,我们经常只想读取文件的一部分数据,而不需要从头至尾读取整个文件。我们想访问一个作为数据库的文本文件,访问时移动到某一条记录并读取它的数据,接着移动到另一个记录,然后再到其他记录――每一条记录都位于文件的不同部分。
Java编程语言提供了一个RandomAccessFile类来处理这种类型的输入输出,这就是java中的IO随机流。
例:打开一个数据库文件并准备更新
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
合并流
SequenceInputStream
public SequenceInputStream(InputStream s1,InputStream s2)使用两个输入流对象实例化本类对象
public int available() throws IOException 普通 返回文件大小
回退流
回退:给了用户第二次读的机会。
回退流:在Java.io 中所有的数据都是采用顺序的读取方式。即:对于一个输入流来讲都是采用从头到尾顺序读取的,如果再输入流中某个不需要的内容被读取进来,则只能通过程序将这些不需要的内容处理掉,为了解决这样的读取问题,在 Java 中提供了一种回退输入流(PushbackInputStream 和PushbackReader),可以把读取进来的某些数据重新退回到输入流的缓冲区之中。 使用InputStream 要使用 read()方法不断读取,是采用顺序的读取方式。
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() + " ");
}