2

我有一个程序,我需要逐字读取文件并将其保存在字符串变量中。这很好用(我使用了一个while循环),但问题是我的字符串变量在循环之外没有相同的值。如果我在 while 循环中检查变量包含的内容,我会得到超过 30000 个单词,但是当我在 while 循环之外尝试同样的事情时,只会出现 1 个单词。

String ord = null;
while (fil.hasNext()) {
    ord = leser.next();
    System.out.println(ord); //If I print it here I get the whole file
}
System.out.println(ord); // If i try to print out the content here, I only get 1 word

我不明白为什么变量“ord”在循环内部和外部不包含相同的内容,我该如何解决这个问题?我当然在我的程序的其他地方需要这个变量,但由于只存储了 1 个字,我的程序的其余部分不能按预期工作。

4

8 回答 8

4

的值ord是不断变化的。因为您选择在循环期间每次都打印它,所以您相信它包含整个文件。

您可以改为使用 aStringBuilder并将字符串附加到其中。

StringBuilder builder = new StringBuilder();
while (fil.hasNext()) {
    String tmp = leser.next();
    System.out.println(tmp); // If still needed
    builder.append(tmp);
}

String completeString = builder.toString();
于 2013-10-04T09:31:56.107 回答
1

你变量不断重新分配,你得到最后一个。

从这里开始,

String ord = null;

// Started executing 
    while (fil.hasNext()) {
        ord = leser.next();
        System.out.println(ord); 
    }
//Ended executing

Now in the   ord  last assigned value is there 

System.out.println(ord); 

在里面

 // Started executing 
        while (fil.hasNext()) {
            ord = leser.next();      //new  value  assigned
            System.out.println(ord); // new value printed
        }
    //Ended executing

您可以做的是也存储以前的值。

   StringBuilder builder = new StringBuilder ();     
    // Started executing 
        while (fil.hasNext()) {

            builder.append(leser.next()); //append to previous val
            builder.append(System.getProperty("line.separator"));
        }
    //Ended executing
    System.out.println(builder.toString()); 
于 2013-10-04T09:31:57.737 回答
1

ord 在 while 循环中重新初始化。所以在 while 循环的最终迭代中,ord 包含 leser.next() 中存在的最后一个单词。

做一件事

String ord = null;

StringBuffer str = new StringBuffer();

while (fil.hasNext()) {

    ord = leser.next();
    System.out.println(ord);
    str.append(ord); //To retain the value of ord for future use.

}

System.out.println(str.toString); 
于 2013-10-04T09:38:53.200 回答
0

变量ord在循环内外都只包含一个值。在循环内部,它的值不断被重新分配和打印。但在循环之外,它将在循环中设置最后一个值。

于 2013-10-04T09:33:00.210 回答
0

您可以使用StringBuffer代替

StringBuffer ord = new StringBuffer;
while (fil.hasNext()) {
   ord.append(leser.next());
}
System.out.println(ord.toString());
于 2013-10-04T09:33:38.117 回答
0

ord每次迭代都重新分配变量。

在没有循环的情况下最清楚地看到while,你正在做的是:

String ord = "test";
ord = "another string";

所以ord简单地改变了的值。您需要将值存储在 a 中List

List<String> ord = new LinkedList<>();
while (fil.hasNext()) {
    ord.add(leser.next());
}
System.out.println(ord);
于 2013-10-04T09:34:25.210 回答
0

为什么变量“ord”在循环内部和外部不包含相同的内容?

因为,String 是不可变的。while 循环的每一步都会生成新的引用,而之前的 ord 引用会丢失。

我该如何解决这个问题?

如果您使用StringBuilder 而不是 String 并将内容附加到 while 循环中,那么您将在 while 循环之外看到整个文件输出。

于 2013-10-04T09:35:32.053 回答
0

如您所见,您正在逐字读取文件,并且每次将ord变量设置为当前单词:

String ord = null;
while (fil.hasNext()) {
     /*if the next word exist - lets set ord to the next word, means 
     each time the ord variable changes to the next word. */
    ord = leser.next();
    System.out.println(ord);
}
System.out.println(ord); //will print the last word in the file

如果要将整个文件保存在 ord 变量中,可以执行以下操作:

String ord = null;
while (fil.hasNext()) {
     /*if the next word exist - lets set ord to the ord variable 
     content + the next word, means we are just adding the next word*/
    ord = ord + leser.next();
    System.out.println(ord); //print current word
}
System.out.println(ord); //will print the whole file
于 2013-10-04T09:37:26.477 回答