package cpm.it.test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Arrays;
/**
* 需求:
* <p>读取一个文件,一次读取一个数字,有N多个数字,数组放不下;要求找到5个最大的数字,所以不能想着把所有数字读取出来再放入数组中做比较,
* 只能一个一个拿出来做比较;</p>
* 我的思路:
* <p>先拿出前5个数字,并放入长度为5的数组,然后排序,让最小的数字和以后从文件中读取出来的数字做比较,
* 只要大于数组中最小的,就把读取出来的数字替换到数组里,这样及可以得到最终的最大的5个数字</p>
*
* <p>模拟输出输入的数字:</p>
* @author King
*
*/
public class Test1 {
public static void main(String[] args) {
readWord("F:/3.txt");
}
/**
* 获取输出流
*
* @param namepath
* @return
*/
public static OutputStream getOutStream(String namepath) {
try {
return new FileOutputStream(new File(namepath));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
/**
* 写入
*
* @param namepath
* @return
*/
public static void writeWord(String namepath) {
OutputStream out = getOutStream(namepath);
try {
//System.out.println("radom=" + r.nextInt(10));
System.out.println("i=" + i);
out.write(i);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 获取输入流
*
* @param namepath
* @return
*/
public static InputStream getInStream(String namepath) {
try {
return new FileInputStream(new File(namepath));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
/**
* 读取
*
* @param namepath
* @return
*/
public static void readWord(String namepath) {
InputStream in = getInStream(namepath);//读取数字
try {
/**
* 要从这个文件读取很多数字,不知道多少,所以不能存入数组 最后要找到最大的5个
*/
int b = 0;//用于接收读取出来的数字
int i = 0;//用于循环自增; 在此我们暂时不考虑long型数据
while ((b = in.read()) != -1) {
//把前5个数字存入数组中
if (i < 5) {
s1[i] = b;
}
//用后面的数字和前面的5个做比较
if (i >= 5) {
Arrays.sort(s1) ; //做比较之前先进行升序操作
if (b > s1[0]) { //和数组中最小的数字作比较
s1[0] = b; //最关键的一步:大于数组中最小的及把他替换掉
}
}
i++;
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for (int i = 0; i < s1.length; i++) {
System.out.println("s1["+i+"]="+s1[i]);
}
}
}
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Arrays;
/**
* 需求:
* <p>读取一个文件,一次读取一个数字,有N多个数字,数组放不下;要求找到5个最大的数字,所以不能想着把所有数字读取出来再放入数组中做比较,
* 只能一个一个拿出来做比较;</p>
* 我的思路:
* <p>先拿出前5个数字,并放入长度为5的数组,然后排序,让最小的数字和以后从文件中读取出来的数字做比较,
* 只要大于数组中最小的,就把读取出来的数字替换到数组里,这样及可以得到最终的最大的5个数字</p>
*
* <p>模拟输出输入的数字:</p>
* @author King
*
*/
public class Test1 {
public static void main(String[] args) {
readWord("F:/3.txt");
}
/**
* 获取输出流
*
* @param namepath
* @return
*/
public static OutputStream getOutStream(String namepath) {
try {
return new FileOutputStream(new File(namepath));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
/**
* 写入
*
* @param namepath
* @return
*/
public static void writeWord(String namepath) {
OutputStream out = getOutStream(namepath);
try {
java.util.Random r = new java.util.Random();//此处没有用随机数
//写入文件,模拟N多数字的环境
//System.out.println("radom=" + r.nextInt(10));
System.out.println("i=" + i);
out.write(i);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 获取输入流
*
* @param namepath
* @return
*/
public static InputStream getInStream(String namepath) {
try {
return new FileInputStream(new File(namepath));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
/**
* 读取
*
* @param namepath
* @return
*/
public static void readWord(String namepath) {
int[] s1 = new int[5] ;//用于存放5个数字的数组
writeWord(namepath);//模拟环境,写入N多数字InputStream in = getInStream(namepath);//读取数字
try {
/**
* 要从这个文件读取很多数字,不知道多少,所以不能存入数组 最后要找到最大的5个
*/
int b = 0;//用于接收读取出来的数字
int i = 0;//用于循环自增; 在此我们暂时不考虑long型数据
while ((b = in.read()) != -1) {
//把前5个数字存入数组中
if (i < 5) {
s1[i] = b;
}
//用后面的数字和前面的5个做比较
if (i >= 5) {
Arrays.sort(s1) ; //做比较之前先进行升序操作
if (b > s1[0]) { //和数组中最小的数字作比较
s1[0] = b; //最关键的一步:大于数组中最小的及把他替换掉
}
}
i++;
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for (int i = 0; i < s1.length; i++) {
System.out.println("s1["+i+"]="+s1[i]);
}
}
}