【问题标题】:How do I use a for loop with input and output streams?如何在输入和输出流中使用 for 循环?
【发布时间】:2020-03-30 09:27:23
【问题描述】:

我正在练习Java中的文件读取器和写入器方法,我编写了这段代码并没有按预期工作,请指教...

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Main {

public static void main(String[] args) throws IOException {
    try {
        FileOutputStream obj = new FileOutputStream("D:\\testout.txt");
        String s = "Hello world";
        byte c[] = s.getBytes();
        obj.write(c);
        obj.close();
        System.out.println("thanks, file created.");
    } catch (Exception e) {
        System.out.println(e);;
    }

    FileInputStream reader = new FileInputStream("D:\\testout.txt");
    int i;
    /*while ((i = reader.read())!= -1) {
        System.out.print((char)i);
    }
    reader.close(); */

    for(i = 0; i <= reader.read(); i++) {
        System.out.print((char)i);
    }
    reader.close();
}
}

当使用“while”函数时它可以工作,但是当用“for”替换它时它显示符号,我做错了什么??

【问题讨论】:

  • 您的意思是说它不适用于for?你写的whilefor 循环是不等价的。
  • for循环主要用于编号:for (int i = 0; i &lt; 10; ++i) println("digit " + i);。你没有读入 i。 for (; (i = reader.read()) &gt;= 0; ) 是正确的循环,while 更好。
  • @Bentaye 我的意思是,它适用于“while”,但不适用于“for”,对不起,我要纠正那个......
  • @JoopEggen,很有趣,谢谢大佬的帮助。

标签: java streamreader streamwriter


【解决方案1】:

当您使用reader.read() 时,它会读取流中的下一个字节,Java 文档说:

返回:下一个字节的数据,如果到达文件末尾,则返回 -1。

所以当您执行reader.read() 时,它只返回一个int,它是流的第一个字节的表示。它可以是任何东西,具体取决于流的第一个字节。假设在您的情况下它返回8

所以当你这样做时

 for(i = 0; i <= reader.read(); i++) {
     System.out.print((char)i);
 }

你正在有效地做

 for(i = 0; i <= 8; i++) {
     System.out.print((char)i);
 }

而您只是打印 0、1、2、3、4、5、6、7 和 8 的 char 值。

您没有打印流中的字节

另一方面,while 循环完成了正确的工作,它不断调用 read() 方法并读取流的每个字节,直到该方法返回 -1,这意味着我们到达了结尾文件。

【讨论】:

    猜你喜欢
    • 2021-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-04
    • 1970-01-01
    • 1970-01-01
    • 2017-08-22
    相关资源
    最近更新 更多