您的位置:首页 > 编程语言 > Java开发

Java基础之写文件——使用多个视图缓冲区(PrimesToFile2)

2013-10-24 20:44 363 查看
控制台程序。本例将对应于每个素数的数据以三个连续数据项的形式写入:

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

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

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

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

import static java.lang.Math.ceil;
import static java.lang.Math.sqrt;
import static java.lang.Math.min;
import static java.nio.file.StandardOpenOption.*;
import java.nio.file.*;
import java.nio.channels.*;
import java.nio.*;
import java.util.*;
import java.io.IOException;

public class PrimesToFile2 {
public static void main(String[] args) {
int primesRequired = 100;                                          // Default count
if (args.length > 0) {
try {
primesRequired = Integer.valueOf(args[0]).intValue();
} catch (NumberFormatException e) {
System.out.println("Prime count value invalid. Using default of " + primesRequired);
}
}

long[] primes = new long[primesRequired];                        // Array to store primes

getPrimes(primes);
Path file = createFilePath("Beginning Java Struff","primes.txt");
writePrimesFile(primes,file);
}
//Calculate enough primes to fill the array
private static long[] getPrimes(long[] primes) {
primes[0] = 2L;                                                  // Seed the first prime
primes[1] = 3L;                                                  // and the second
// Count of primes found ?up to now, which is also the array index
int count = 2;
// Next integer to be tested
long number = 5L;

outer:
for (; count < primes.length; number += 2) {

// The maximum divisor we need to try is square root of number
long limit = (long)ceil(sqrt((double)number));

// Divide by all the primes we have up to limit
for (int i = 1 ; i < count && primes[i] <= limit ; ++i)
if (number % primes[i] == 0L)                                // Is it an exact divisor?
continue outer;                                            // yes, try the next number

primes[count++] = number;                                      // We got one!
}
return primes;
}
//Create the path for the named file in the specified directory
//in the user home directory
private static Path createFilePath(String directory, String fileName) {
Path file = Paths.get(System.getProperty("user.home")).resolve(directory).resolve(fileName);
try {
Files.createDirectories(file.getParent());                       // Make sure we have the directory
} catch (IOException e) {
e.printStackTrace();
System.exit(1);
}
System.out.println("New file is: " + file);
return file;
}

//Write the array contents to file
private static void writePrimesFile(long[] primes, Path file) {
final int BUFFERSIZE = 100;                                        // Byte buffer size
try (WritableByteChannel channel = Files.newByteChannel(file, EnumSet.of(WRITE, CREATE))){
ByteBuffer buf = ByteBuffer.allocate(BUFFERSIZE);
DoubleBuffer doubleBuf = buf.asDoubleBuffer();
buf.position(8);
CharBuffer charBuf = buf.asCharBuffer();
LongBuffer longBuf = null;
String primeStr = null;

for (long prime : primes) {
primeStr = "prime = " + prime;                                 // Create the string
doubleBuf.put(0,(double)primeStr.length());                    // Store the string length
charBuf.put(primeStr);                                         // Store the string
buf.position(2*charBuf.position() + 8);                        // Position for 3rd buffer
longBuf = buf.asLongBuffer();                                  // Create the buffer
longBuf.put(prime);                                            // Store the binary long value
buf.position(buf.position() + 8);                              // Set position after last value
buf.flip();                                                    // and flip
channel.write(buf);                                            // Write the buffer as before

buf.clear();
doubleBuf.clear();
charBuf.clear();
}
System.out.println("File written is " + ((FileChannel)channel).size() + " bytes.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐