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

luoyjx 2014-10-07 10:55 875次阅读

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并将其进行解压缩操作 。 
  1. ZipInputStream 
  2. 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定义了几种基本的常量用于标识解析过程:

  1. TT_EOF(流结尾)
  2. TT_EOL(行结尾)
  3. TT_WORD(一个单词)
  4. 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() + " "); }

暂无评论

登录后可以进行评论。没有账号?马上注册