Java 将文本文件转换为标准输入,导致数组中出现空值?

Java 将文本文件转换为标准输入,导致数组中出现空值?,java,arrays,string,java.util.scanner,Java,Arrays,String,Java.util.scanner,我在终端上使用cat文本文件| Java我的程序对文件进行分类 将行存储到数组中后打印行时的结果为null 有人能解释一下原因吗 Scanner scan2 = new Scanner(System.in); Scanner scan = new Scanner(System.in);//create new scanner object int index = 0;//create index to increment t

我在终端上使用cat文本文件| Java我的程序对文件进行分类

将行存储到数组中后打印行时的结果为null 有人能解释一下原因吗

            Scanner scan2 = new Scanner(System.in);
            Scanner scan = new Scanner(System.in);//create new scanner object
            int index = 0;//create index to increment through array
            while(scan.hasNextLine()){//while looop to execute if file has length
                String line = scan.nextLine();//store line into string input
                count++;
            }

            if(count < BUFSIZE){
                stringArray = new String[count];
            }
            else{
                stringArray = new String[BUFSIZE];
            }

            while(scan2.hasNextLine()){
                String line2 = scan2.nextLine();  
                if(index > stringArray.length-1)
                {
                    stringArray = expandArray(stringArray,BUFSIZE);//call method to increase array length
                }
                stringArray[index] = line2;//store line into array at given index
                index++;//increment index
            }
            /*while(sorted){
                sorted = false;
                for(int i = 0; i < stringArray.length-1; i++){
                    if(stringArray[i].compareTo(stringArray[i+1]) > 0){
                        temp = stringArray[i];
                        stringArray[i] = stringArray[i+1];     
                        stringArray[i+1] = temp;
                        sorted = true;
                    }
                }
            }*/
            for(int i = 0; i < stringArray.length; i++){
                System.out.println(stringArray[i]);
            }
        }       
    } 

    private static String [] expandArray(String [] array, int extend){
        String newArray [] = new String[array.length+extend];//create new array with given array and int as length to extend
        //for loop to copy data from old array into new created array
        for( int i = 0; i  < array.length; i++){
            newArray[i] = array[i];
        }
        return newArray;//return newly created array
    }
}
Scanner scan2=新扫描仪(System.in);
扫描仪扫描=新扫描仪(System.in)//创建新的扫描仪对象
int指数=0//创建索引以通过数组递增
while(scan.hasNextLine()){//while loop若文件有长度,则执行
String line=scan.nextLine();//将行存储到字符串输入中
计数++;
}
如果(计数stringArray.length-1)
{
stringArray=expandArray(stringArray,BUFSIZE);//调用方法以增加数组长度
}
stringArray[index]=line2;//将行存储到给定索引处的数组中
index++;//增量索引
}
/*while(已排序){
排序=假;
对于(int i=0;i0){
temp=stringArray[i];
stringArray[i]=stringArray[i+1];
stringArray[i+1]=临时值;
排序=真;
}
}
}*/
对于(int i=0;i
程序气泡对字符串数组进行排序。如果我通过扫描器文件读取文件,这很好,但为什么我不使用cat呢。扩展阵列方法是在阵列每次达到最大容量时动态扩展阵列。在此代码中感谢您

while(scan2.hasNextLine()){
    String line2 = scan2.nextLine();  
    if(index > stringArray.length-1)

如果索引大于数组的长度,则您正在执行某些操作,但不能执行其他操作。

以下是错误的:

Scanner scan2 = new Scanner(System.in);
Scanner scan = new Scanner(System.in);//create new scanner object
基本上,每个扫描器都会抓取
系统。在
流中,但流只能读取一次。您应该将代码更改为只使用一个扫描仪,然后只使用一次

当您编写程序以使用文件时,扫描仪实际上会打开文件的两个流,以便可以读取两次,但当您只有一个流时,这将不起作用

编辑:

这是一个仅使用一个扫描仪(因此使用一个流)的版本:

请注意,我没有测试它,但从概念上讲,这是可以做到的

另一种选择是使用
ArrayList
,它将自动展开和收缩。

Scanner scan=新的扫描仪(System.in);
Scanner scan = new Scanner(System.in);
List<String> list = new LinkedList<>();
while(scan.hasNext()) list.add(scan.next());
scan.close();
Collections.sort(list);
for(String line : list) System.out.println(line);
列表=新建LinkedList(); while(scan.hasNext())list.add(scan.next()); scan.close(); 集合。排序(列表); for(字符串行:list)System.out.println(行);
哈哈

更新@JBert:

System.out.println(StringUtils.join(Ordering.<String>natural().sortedCopy(IOUtils.readLines(System.in)), "\r\n"));
System.out.println(StringUtils.join(Ordering.natural().sortedCopy(IOUtils.readLines(System.in)),“\r\n”);

loool

不需要两个扫描仪实例。只要一个就足够了。那么我可以再次使用相同的扫描仪再次扫描文件吗?使用2个扫描器的原因是我需要检查有多少行,这样我就可以确定正确的数组大小。程序员可以在我的答案中看到更新的代码。如果要编写读取流的代码,请以不需要再次扫描流的方式编写。这是以内存为代价的,但你必须选择你的战斗。虽然看似正确且简短,但我不认为op代码的目的是使用现有的排序算法,否则也可以建议使用Linux的
sort file
命令,而不是
cat file | java myprog
:-)
System.out.println(StringUtils.join(Ordering.<String>natural().sortedCopy(IOUtils.readLines(System.in)), "\r\n"));