控制台程序,本例读取Java基础之写文件部分(PrimesToFile2)写入的Primes.txt。

方法二:设置一个任意容量的、大小合适的字节缓冲区并且使用来自文件的字节进行填充。然后整理出缓冲区中所有的内容。这种方式的问题是:缓冲区的内容可能会在读取文件的一个数据项时半途而断。这样一来,就必须做一些工作对此进行检测并且找出下一步要做的工作,但是这比第一种方式更加有效,因为这极大减少了用于读取整个文件所需的读操作数目。

本例的关键是缓冲区类提供的compact()方法,即压缩缓冲区。

  1. import java.nio.file.*;
  2. import java.nio.channels.ReadableByteChannel;
  3. import java.io.IOException;
  4. import java.nio.ByteBuffer;
  5.  
  6. public class ReadPrimesMixedData2 {
  7.  
  8. public static void main(String[] args) {
  9. Path file = Paths.get(System.getProperty("user.home")).resolve("Beginning Java Struff").resolve("primes.txt");
  10. if(!Files.exists(file)) {
  11. System.out.println(file + " does not exist. Terminating program.");
  12. System.exit(1);
  13. }
  14.  
  15. try(ReadableByteChannel inCh = Files.newByteChannel(file)) {
  16. ByteBuffer buf = ByteBuffer.allocateDirect(256);
  17. buf.position(buf.limit()); // Set the position for the loop operation
  18. int strLength = 0; // Stores the string length
  19. byte[] strChars = null; // Array to hold the bytes for the string
  20.  
  21. while(true) {
  22. if(buf.remaining() < 8) { // Verify enough bytes for string length
  23. if(inCh.read(buf.compact()) == -1)
  24. break; // EOF reached
  25. buf.flip();
  26. }
  27. strLength = (int)buf.getDouble(); // Get the string length
  28.  
  29. // Verify enough bytes for complete string
  30. if(buf.remaining() < 2*strLength) {
  31. if(inCh.read(buf.compact()) == -1) {
  32. System.err.println("EOF found reading the prime string.");
  33. break; // EOF reached
  34. }
  35. buf.flip();
  36. }
  37. strChars = new byte[2*strLength]; // Array for string bytes
  38. buf.get(strChars); // Get the bytes
  39.  
  40. if(buf.remaining() < 8) { // Verify enough bytes for prime value
  41. if(inCh.read(buf.compact()) == -1) {
  42. System.err.println("EOF found reading the binary prime value.");
  43. break; // EOF reached
  44. }
  45. buf.flip();
  46. }
  47.  
  48. System.out.printf("String length: %3s String: %-12s Binary Value: %3d%n",
  49. strLength, ByteBuffer.wrap(strChars).asCharBuffer(),buf.getLong());
  50. }
  51.  
  52. System.out.println("\nEOF reached.");
  53.  
  54. } catch(IOException e) {
  55. e.printStackTrace();
  56. }
  57. }
  58. }

Java基础之读文件——使用通道读取混合数据2(ReadPrimesMixedData2)的更多相关文章

  1. Java基础之读文件——使用通道读取混合数据1(ReadPrimesMixedData)

    控制台程序,本例读取Java基础之写文件部分(PrimesToFile2)写入的Primes.txt. 方法一:可以在第一个读操作中读取字符串的长度,然后再将字符串和二进制素数值读入到文本中.这种方式 ...

  2. Java基础之读文件——使用输入流读取二进制文件(StreamInputFromFile)

    控制台程序,读取Java基础之读文件部分(StreamOutputToFile)写入的50个fibonacci数字. import java.nio.file.*; import java.nio.* ...

  3. Java基础之读文件——使用通道读二进制数据(ReadPrimes)

    控制台程序,本例读取Java基础之写文件部分(PrimesToFile)写入的primes.bin. import java.nio.file.*; import java.nio.*; import ...

  4. Java基础之读文件——使用缓冲读取器读取文件(ReaderInputFromFile)

    控制台程序,本例读取Java基础之写文件部分(WriterOutputToFile)写入的Saying.txt. import java.io.*; import java.nio.file.*; i ...

  5. Java基础之读文件——使用通道随机读取文件(RandomFileRead)

    import java.nio.file.*; import java.nio.channels.FileChannel; import java.io.IOException; import jav ...

  6. Java基础之读文件——使用通道随机读写文件(RandomReadWrite)

    控制台程序,使用通道随机读写primes_backup.bin文件. import static java.nio.file.StandardOpenOption.*; import java.nio ...

  7. Java基础之读文件——使用通道复制文件(FileBackup)

    控制台程序,除了使用Files类中使用copy()方法将文件复制外,还可以使用FileChannel对象复制文件,连接到输入文件的FileChannel对象能直接将数据传输到连接到输出文件的FileC ...

  8. Java基础之读文件——从文件中读取文本(ReadAString)

    控制台程序,使用通道从缓冲区获取数据,读取Java基础之写文件(BufferStateTrace)写入的charData.txt import java.nio.file.*; import java ...

  9. Java基础之写文件——创建通道并且写文件(TryChannel)

    控制台程序,创建一个文件并且使用通道将一些文本写入到这个文件中. import static java.nio.file.StandardOpenOption.*; import java.nio.c ...

随机推荐

  1. DNS:www.flickr.com

    203.84.197.9 203.84.197.25 203.84.197.26 203.84.197.27

  2. mysql IN 比等价的OR写法效率更高

  3. ExtJS笔记2 Class System

    For the first time in its history, Ext JS went through a huge refactoring from the ground up with th ...

  4. 20145317《Java程序设计》实验三

    20145317彭垚 实验三<敏捷开发与XP实践> 实验内容 使用 git 上传代码 使用 git 相互更改代码 实现代码的重载 一. 使用git 上传代码 找到Demo1所在文件夹,右键 ...

  5. laravel 自定义函数 使用

    1.创建app/helpers.php 2.注册路径 { ... "autoload": { "files": [ "app/helpers.php& ...

  6. Delphi dbf文件如何定位记录(即设置Table的RecNum属性来移动到该记录号)

    Delphi的table的RecNum属性,可以用来定位记录,如:self.Table1.RecNum:=23;即可以让数据库记录移动到23号记录上,但这种作用仅限于Paradox数据库,而不是dBA ...

  7. Oracle客户端显示乱码解决

    1.查找当前服务器的字符集: 2.使用查询得到的结果集,设置本地local字符集:(不要照抄图片)

  8. JVM 常用配置

    JVM的配置,最常用的两个配置就是:-Xms512m –Xmx1024m -Xms设置JVM的初始化内存大小,-Xmx为最大内存大小,当突破这个值,将会报内存溢出,导致的原因有很多,主要是虚拟机的回收 ...

  9. MongoDB常用操作总结

    ====================================MGDB的操作====================================== 0.创建数据库时使用(use 数据库 ...

  10. Selenium2学习-012-WebUI自动化实战实例-010-解决元素失效:StaleElementReferenceException: stale element reference: element is not attached to the page document

    元素失效的想象提示信息如下图所示,此种问题通常是因为元素页面刷新之后,为重新获取元素导致的. 解决此类问题比较简单,只需要在页面刷新之后,重新获取一下元素,就可以消除此种错误了. 以下以易迅网搜索为例 ...