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 }
  • 相关阅读:
    用wamp配置的环境,想用CMD连接mysql怎么连
    Mysql删除表
    MySQL创建表
    Leetcode 130. Surrounded Regions
    Leetcode 111. Minimum Depth of Binary Tree
    Leetcode 110. Balanced Binary Tree
    Leetcode 98. Validate Binary Search Tree
    Leetcode 99. Recover Binary Search Tree
    Leetcode 108. Convert Sorted Array to Binary Search Tree
    Leetcode 105. Construct Binary Tree from Preorder and Inorder Traversal
  • 原文地址:https://www.cnblogs.com/mannixiang/p/3386776.html
Copyright © 2011-2022 走看看