zoukankan      html  css  js  c++  java
  • Java基础之写文件——使用多个视图缓冲区(PrimesToFile2)

    控制台程序。本例将对应于每个素数的数据以三个连续数据项的形式写入:

    1、以二进制值表示的字符串长度值(最好是整型,但本例使用double类型);

    2、素数值的字符串表示”Prime=nnn“,其中数字的位数明显是变化的;

    3、将素数以long类型的二进制表示。

    基本策略是,创建一个字节缓冲区,之后创建一系列将三种不同类型数据映射到其中的视图缓冲区。一种简单的方法是每次写入一个素数的数据。

     1 import static java.lang.Math.ceil;
     2 import static java.lang.Math.sqrt;
     3 import static java.lang.Math.min;
     4 import static java.nio.file.StandardOpenOption.*;
     5 import java.nio.file.*;
     6 import java.nio.channels.*;
     7 import java.nio.*;
     8 import java.util.*;
     9 import java.io.IOException;
    10 
    11 public class PrimesToFile2 {
    12   public static void main(String[] args) {
    13     int primesRequired = 100;                                          // Default count
    14     if (args.length > 0) {
    15       try {
    16         primesRequired = Integer.valueOf(args[0]).intValue();
    17       } catch (NumberFormatException e) {
    18         System.out.println("Prime count value invalid. Using default of " + primesRequired);
    19       }
    20     }
    21 
    22       long[] primes = new long[primesRequired];                        // Array to store primes
    23       
    24       getPrimes(primes);
    25       Path file = createFilePath("Beginning Java Struff","primes.txt");
    26       writePrimesFile(primes,file);
    27     }
    28       //Calculate enough primes to fill the array
    29       private static long[] getPrimes(long[] primes) {
    30           primes[0] = 2L;                                                  // Seed the first prime
    31           primes[1] = 3L;                                                  // and the second
    32           // Count of primes found ?up to now, which is also the array index
    33           int count = 2;
    34           // Next integer to be tested
    35           long number = 5L;
    36 
    37           outer:
    38           for (; count < primes.length; number += 2) {
    39 
    40             // The maximum divisor we need to try is square root of number
    41             long limit = (long)ceil(sqrt((double)number));
    42 
    43             // Divide by all the primes we have up to limit
    44             for (int i = 1 ; i < count && primes[i] <= limit ; ++i)
    45               if (number % primes[i] == 0L)                                // Is it an exact divisor?
    46                 continue outer;                                            // yes, try the next number
    47 
    48             primes[count++] = number;                                      // We got one!
    49           }
    50           return primes;
    51         }
    52     //Create the path for the named file in the specified directory
    53     //in the user home directory
    54     private static Path createFilePath(String directory, String fileName) {
    55         Path file = Paths.get(System.getProperty("user.home")).resolve(directory).resolve(fileName);
    56         try {
    57           Files.createDirectories(file.getParent());                       // Make sure we have the directory
    58         } catch (IOException e) {
    59           e.printStackTrace();
    60           System.exit(1);
    61         }
    62         System.out.println("New file is: " + file);
    63         return file;
    64     }
    65     
    66     //Write the array contents to file
    67     private static void writePrimesFile(long[] primes, Path file) {
    68         final int BUFFERSIZE = 100;                                        // Byte buffer size
    69         try (WritableByteChannel channel = Files.newByteChannel(file, EnumSet.of(WRITE, CREATE))){
    70           ByteBuffer buf = ByteBuffer.allocate(BUFFERSIZE);
    71           DoubleBuffer doubleBuf = buf.asDoubleBuffer();
    72           buf.position(8);
    73           CharBuffer charBuf = buf.asCharBuffer();
    74           LongBuffer longBuf = null;
    75           String primeStr = null;
    76 
    77         for (long prime : primes) {
    78             primeStr = "prime = " + prime;                                 // Create the string
    79             doubleBuf.put(0,(double)primeStr.length());                    // Store the string length
    80             charBuf.put(primeStr);                                         // Store the string
    81             buf.position(2*charBuf.position() + 8);                        // Position for 3rd buffer
    82             longBuf = buf.asLongBuffer();                                  // Create the buffer
    83             longBuf.put(prime);                                            // Store the binary long value
    84             buf.position(buf.position() + 8);                              // Set position after last value
    85             buf.flip();                                                    // and flip
    86             channel.write(buf);                                            // Write the buffer as before
    87 
    88             buf.clear();
    89             doubleBuf.clear();
    90             charBuf.clear();
    91         }
    92           System.out.println("File written is " + ((FileChannel)channel).size() + " bytes.");
    93         } catch (IOException e) {
    94           e.printStackTrace();
    95         }
    96     }
    97 }
  • 相关阅读:
    图标字体IcoMoon 使用
    JS 寻找孩子并打印路径
    为什么要用on()而不直接使用click
    setTimeout 虚假的“异步”
    解决Ajax.BeginForm还是刷新页面的问题
    .net生成Excel,并下载
    C#判断文件是否正在被使用
    sql为数字添加千分位(也就是钱的格式)
    HotelIInventory项目小结
    一步一步实现FormsAuthentic验证登录
  • 原文地址:https://www.cnblogs.com/mannixiang/p/3386776.html
Copyright © 2011-2022 走看看